You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eBPF kprobe捕获exit_group参数不符预期,请求技术协助

问题分析与解决方案

你的问题出在kprobe的参数获取方式错误:直接在BPF函数中声明int status参数是无效的,内核kprobe机制不会将被探测函数的参数直接传递给BPF程序,必须通过struct pt_regs结构体提取寄存器中的系统调用参数。

原因详解

当用kprobe跟踪系统调用时,系统调用的参数存储在CPU寄存器中,BCC提供了PT_REGS_PARM1(ctx)、PT_REGS_PARM2(ctx)等跨架构宏,用来从struct pt_regs中读取对应位置的参数。exit_group系统调用的第一个参数就是退出状态码,对应PT_REGS_PARM1(ctx)。

你之前的写法中,status参数实际上读取的是栈上的随机值(也就是你看到的208682672这类无意义数值),而非真正的系统调用参数。

修正后的代码

修改Python中的BPF代码部分,通过宏提取参数:

from bcc import BPF

def main():
    bpftext = """
    #include <uapi/linux/ptrace.h>

    void my_exit(struct pt_regs *ctx){
        int status = PT_REGS_PARM1(ctx);
        bpf_trace_printk("%d\\n", status);
    }
    """

    bpf = BPF(text=bpftext)
    fname = bpf.get_syscall_fnname('exit_group')
    bpf.attach_kprobe(event=fname, fn_name='my_exit')

    while True:
        print(bpf.trace_fields())


if __name__ == '__main__':
    main()

验证步骤

  1. 编译并运行你的C测试程序:
    gcc test.c -o test && ./test
    
  2. 运行修正后的Python BCC程序,此时会输出包含5的跟踪日志,符合预期。

内容的提问来源于stack exchange,提问作者somerandomdrunkcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:13:19