@
faketemp 问题 1:这是个很好的问题哈,我这边做个回答(晚上我整理一下,给放到项目 QA 文档里面)。
a. bpftrace 在最近的版本变动里面去掉了对 DWARF 也就是调试信息的支持(
https://github.com/bpftrace/bpftrace/pull/3921 )。这也是我想启动这个项目的一个原因之一。
b. bpftrace 对 DWARF 的使用,应该是局限在复杂数据结构的内存布局上面,增强对复杂数据结构的访问。但是,bpftrace 只支持了函数入口和函数返回这种 hook 点,没有完全利用 DWARF 的能力。比如说,某一行源码对应的指令,被探测程序执行到这个指令时候,局部变量,全局变量,参数究竟在内存的哪里。这些是需要根据 DWARF 里面的表达式进行实时求值,才能获取到的。这意味着 bpftrace 其实无法具备类似于 GDB 那样基于 DWARF 提供完整的用户态探测调试的能力。 (我对 bpftrace 代码了解的很粗浅,只是以前快速翻了一下,有错误随时指正哈)
c. ghostscope 参考 GDB 对 DWARF 的处理,并且把 DWARF 表达式实时生成 LLVM IR ,然后通过 LLVM 生成 eBPF 字节码。这样的话,理论上 ghostscope 是可以根据 DWARF 描述的信息,在用户关注的指令流程上,抓取正确的二进制数据,并且正确的根据 DWARF 信息展示出二进制数据对应源代码的样子。当然,因为 ghostscope 底层依赖的是 eBPF + uprobe ,而不是像 GDB 那样使用 ptrace ,所以不能提供交互式 debug 的体验,但是不影响进程服务运行,而获取关键信息的能力,在很多时候是很有用的。
d. ghostscope 提供了我个人非常喜欢的 TUI 使用方式,类似于 cgdb ,哈哈,我是真的喜欢 cgdb ,我觉得也许也会有其他人喜欢吧。
问题 2:我不太懂 Windows 系统,我甚至还没有去了解 Windows eBPF 的进展(
https://github.com/microsoft/ebpf-for-windows ),也不太清楚 Windows 有没有类似 uprobe 的机制。但是我有一个想法,就是类似 bpftime 的方式,hack 进用户态进程里面,然后执行 eBPF 脚本。不晓得有没有类似的项目在做这件事情。如果我把 ghostscope 打磨稳定(支持好编译高优化程序的 DWARF 、支持栈回溯、支持 Rust 或者 C++ 的一些高级特性),我可能会开始考虑跨平台方案。我还在学习的路上,工作也不是专门做这块的,所以应该还是要踩坑和探索好久。