使用 bpf 在内核的某一个函数的开头加上一个 dump_stack()是否可以实现?

2023-04-10 11:50:09 +08:00
 wniming

比如楼主现在可以通过 bpftrace 的以下用法得到某一个函数被调用的次数,但我还想知道每次的调用栈,懒得改代码重编译再重启,能不能自己写一个 bpf 程序实现这个需求?

bpftrace -e 'kprobe:vgic_kick_vcpus { @[probe] = count() }'

1555 次点击
所在节点    Linux
5 条回复
cfeitong
2023-04-10 15:50:54 +08:00
不能。原因是 ebpf 无法读取用户态内存,自然也无法读取用户栈。
wniming
2023-04-10 16:53:16 +08:00
@cfeitong 感谢回复,我问的是关于内核态的函数,不是用户态。
zpd2009
2023-04-10 22:31:19 +08:00
@wniming 我了解到的是不行的。eBPF 可以干很多事情,但是限制也是很厉害的。没有看到有支持 dump 调用栈的函数。https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
fuzhuo233
2023-04-11 00:29:42 +08:00
不是有 kstack/ustack 么,一把梭
bpftrace -e 'kprobe:vgic_kick_vcpus { @[kstack] = count() }'
zpd2009
2023-04-13 16:24:53 +08:00
@zpd2009 尝试一下 bpf_get_task_stack ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/931194

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX