在CentOS 7.6中使用bpftrace打印函数调用栈

(欢迎大家留言交流讨论~)

bpftrace

bpftrace可以理解为eBPF的高层次“封装”,利用LLVM将bpftrace的脚本或命令转为BPF字节码,并且利用了linux kernel 4.x 现有的kprobes/uprobes/tracepoint等机制。其设计参考了awk、c语言、dtrace和systemtap等。

bpftrace功能强大,本文给出一种实时打印某用户态进程某函数调用栈的方法。

安装bpftrace

在CentOS下,CentOS 7.6下bpftrace的官方文档并未给出安装方案,经过测试,我发现最现实的方法是借助snap安装[1],步骤如下:

使用bpftrace追踪用户态调用栈

关于基本的使用,[2][3]是bpftrace的官方例子,[2]中有很多实用”一行工具”中有很多例子,[3]中有更详细的参考文档。这些都是上手尝试的最好读物。

本文用到的是uprobe用户态追踪功能的ustack函数。比如我们要追踪/home/zjc/hello_world这个二进制程序中的hello()函数的调用栈,只需要写一行:

为了更方便使用,我这里写了一个shell脚本注释如下[4]:


[1] https://snapcraft.io/install/bpftrace/centos

[2] https://github.com/iovisor/bpftrace/blob/master/docs/tutorial_one_liners.md

[3] https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md

[4] https://gist.github.com/zhangjaycee/aaffb2ab5a8412d1c6ba6b6dc9d3bb19

[5] https://github.com/zhangjaycee/real_tech/wiki/linux_017

发表评论

电子邮件地址不会被公开。 必填项已用*标注