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()
验证步骤
- 编译并运行你的C测试程序:
gcc test.c -o test && ./test - 运行修正后的Python BCC程序,此时会输出包含
5的跟踪日志,符合预期。
内容的提问来源于stack exchange,提问作者somerandomdrunkcoder
相关产品推荐
相关产品推荐

