主要观点:作者学习 eBPF 并用于解决一些问题,以 SpiderMonkey 为例,通过 bpftrace 工具找出频繁创建 Rooted 的源位置,还制作了相关报告并打开了一系列 bug 报告,之后开始写分配分析器。
关键信息:
- eBPF 是 Linux(及 Windows)内置的检测和跟踪系统,可提供字节码让内核验证和执行,能收集信息并导出,
bpftrace
提供类似awk
的语言编写 BPF 程序。 - SpiderMonkey 有
Rooted
类型,偶尔在性能分析中出现,还有RootedTuple
工具,作者好奇其来源,开始用 bpftrace 探索。 - 初步的 bpftrace 程序结构及相关变量、函数说明。
- 通过
uprobe
访问函数符号进行探测,起初无法获取文件名和行号,后来发现ustack(n)
函数,最终通过改进的探针文件获取到结果并生成报告和打开 bug 报告。
重要细节: - 示例 bpftrace 程序中变量
@
开头为全局映射,$
开头为局部变量,/something/
为过滤器,有内置函数如print
、delete
、nsec
、tid
等。 - 作者最初针对
Rooted::Rooted
函数进行探测,后改为registerWithRootLists
函数,标记为MOZ_NEVER_INLINE
,最初未符号化结果,在 Zixian Cai 帮助下解决问题。 - 运行探针文件的命令
sudo bpftrace rootTrace.bt programUnderTrace -c ‘programUnderTrace …’
,为保持程序 alive 在JS_ShutDown
后让进程睡眠 2 秒,对每个 JetStream3 子测试运行分析器并生成报告,打开相关 bug 报告如 https://bugzilla.mozilla.org/... 等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。