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

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(第一个参数)→ %rdi
  • filename(第二个参数)→ %rsi
  • flags(第三个参数)→ %rdx
  • mode(第四个参数)→ %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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:25