如何读取 ebpf 中的堆栈跟踪内核端?

How to read stack trace kernelside in ebpf?

我想用堆栈中的地址过滤我的 ebpf, 例如,如果堆栈跟踪包含 _do_fork 的地址,则写入映射。

我看到了https://www.kernel.org/doc/html/latest/bpf/bpf_design_QA.html#q-can-bpf-programs-access-stack-pointer saying that it isn't possible to get adresses. But I also seen this https://www.spinics.net/lists/netdev/msg497159.html "bpf 程序 能够看到所有堆栈跟踪,然后可以在内核中执行 通过”处理或向用户 space 发送堆栈跟踪。所以我很困惑。 最后一个问题是,如果可能的话,我们如何使用 bpf_get_stack 获取内核中堆栈跟踪的地址?

提前致谢

可以访问堆栈跟踪。

你说的第一个link(bpf_design_QA)不是指被跟踪的程序,它处理的是BPF程序本身在执行跟踪操作时使用的堆栈指针。但正如 bpf_get_stack() 的提交日志中所述,您可以访问堆栈。

还有一些 BPF 助手的文档,例如 bpf_get_stack()available online. You probably want to have a look at code samples using it

我自己在跟踪堆栈方面没有太多经验,但似乎很少有这样做的工具真正使用 bpf_get_stack() 帮助器。相反,来自 bcc 的工具像 profile or from kernel samples like offwaketime (BPF side, user space side) are generally using stack trace maps (BPF_MAP_TYPE_STACK_TRACE), so you may want to have a look at this too (bcc even offers a specific API 对他们来说)。