ARM架构下kprobe_events获取参数失败问题求助
嘿,我来帮你搞定这个kprobe参数的问题!
先搞懂%ax、%dx这些符号的含义
这些是32位x86架构下的通用寄存器缩写,对应传统函数调用的参数传递规则:
%ax:累加器寄存器,在32位cdecl调用约定里,常用来传递第一个函数参数%dx:数据寄存器,对应第二个参数%cx:计数寄存器,对应第三个参数
你报错的核心原因是:现在绝大多数系统都是64位x86_64架构,它的函数/系统调用参数传递规则完全不同,32位的寄存器符号在64位环境下不被识别,自然就会抛出Invalid argument。
怎么修改让事件正常工作?
首先先确认你的系统架构:
uname -m
如果输出是x86_64,请按以下两种方式修改:
方式1:适配64位架构的寄存器符号
对于x86_64的Linux内核,do_sys_open的函数原型是:
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode);
对应的64位系统调用寄存器映射是:
dfd(第一个参数)→%rdifilename(第二个参数)→%rsiflags(第三个参数)→%rdxmode(第四个参数)→%r10(注意:x86_64系统调用里第四个参数用%r10而非%rcx)
所以正确的命令是:
echo 'p:myprobe do_sys_open dfd=%rdi filename=%rsi flags=%rdx mode=%r10' > /sys/kernel/debug/tracing/kprobe_events
方式2:用通用的$argN语法(推荐)
如果你不想纠结架构差异,可以用内核提供的$arg1、$arg2这类通用参数符号,它会自动适配当前架构的参数传递规则,兼容性拉满:
echo 'p:myprobe do_sys_open dfd=$arg1 filename=$arg2 flags=$arg3 mode=$arg4' > /sys/kernel/debug/tracing/kprobe_events
验证是否生效
写入命令后,先检查事件是否成功注册:
cat /sys/kernel/debug/tracing/kprobe_events
然后开启追踪,就能看到捕获的do_sys_open事件了:
echo 1 > /sys/kernel/debug/tracing/tracing_on cat /sys/kernel/debug/tracing/trace_pipe
内容的提问来源于stack exchange,提问作者bestn
相关产品推荐
相关产品推荐

