V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wniming
V2EX  ›  Linux

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

  •  
  •   wniming · 2023-04-10 11:50:09 +08:00 · 1544 次点击
    这是一个创建于 603 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    5 条回复    2023-04-13 16:24:53 +08:00
    cfeitong
        1
    cfeitong  
       2023-04-10 15:50:54 +08:00 via Android
    不能。原因是 ebpf 无法读取用户态内存,自然也无法读取用户栈。
    wniming
        2
    wniming  
    OP
       2023-04-10 16:53:16 +08:00
    @cfeitong 感谢回复,我问的是关于内核态的函数,不是用户态。
    zpd2009
        3
    zpd2009  
       2023-04-10 22:31:19 +08:00
    @wniming 我了解到的是不行的。eBPF 可以干很多事情,但是限制也是很厉害的。没有看到有支持 dump 调用栈的函数。https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
    fuzhuo233
        4
    fuzhuo233  
       2023-04-11 00:29:42 +08:00 via iPhone   ❤️ 1
    不是有 kstack/ustack 么,一把梭
    bpftrace -e 'kprobe:vgic_kick_vcpus { @[kstack] = count() }'
    zpd2009
        5
    zpd2009  
       2023-04-13 16:24:53 +08:00
    @zpd2009 尝试一下 bpf_get_task_stack ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1160 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:03 · PVG 07:03 · LAX 15:03 · JFK 18:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.