Linux kernel kprobe_事件获取参数适用于x86,但不适用于arm64

Linux kernel kprobe_事件获取参数适用于x86,但不适用于arm64,linux-kernel,trace,perf,kprobe,tracepoint,Linux Kernel,Trace,Perf,Kprobe,Tracepoint,我想把do\u sys\u openfilename参数作为字符串。为此,我添加了以下kprobe。一个简单的探针,它将文件名作为十六进制,适用于x86/arm64 x86: echo 'p:myprobe do_sys_open filename_string=%si' > kprobe_events arm64: echo 'p:myprobe do_sys_open filename_string=%x1' > kprobe_events 但是,更改探测以获取文件名字符串在x

我想把
do\u sys\u open
filename参数作为字符串。为此,我添加了以下kprobe。一个简单的探针,它将文件名作为十六进制,适用于
x86/arm64

x86: echo 'p:myprobe do_sys_open filename_string=%si' > kprobe_events
arm64: echo 'p:myprobe do_sys_open filename_string=%x1' > kprobe_events
但是,更改探测以获取文件名字符串在
x86
上工作,但在
arm64
上不起作用(即无法获取字符串表示法
filename\u string=(错误)

x86:

arm64:

echo 'p:myprobe do_sys_open filename_string=+0(%x1):string' > kprobe_events
output: 
netd-4621  [001] d...  8491.094187: myprobe: (do_sys_open+0x0/0x24c) filename_string=(fault)
为了检查我是否正确使用了arm ABI,我尝试使用
perf
设置探针。 从
/sys/kernel/debug/tracing/kprobe_events
中可以看出,perf创建的探测类似

./perf4.14 probe 'do_sys_open filename:string'
/d/tracing # cat kprobe_events
p:kprobes/myprobe do_sys_open filename_string=+0(%x1):string
但在这种情况下,perf探测也失败了(即
filename\u string=“

./perf4.14 record -e probe:do_sys_open -aR sleep 3
/data/local/tmp # ./perf4.14 script
perf4.14  4587 [007]  7490.809036: probe:do_sys_open: (ffffff8337060148) filename_string=""

   sleep  4588 [003]  7490.817937: probe:do_sys_open: (ffffff8337060148) filename_string=""
为arm设置
kprobe\u事件
以获取字符串形式的参数,正确的方法是什么?
我是否错误地使用了ABI?

在内核版本>=
4.20
上,您可以使用
$argN
获取
N
第个函数参数。发件人:

由于
filename
do\u sys\u open()
的第二个参数,您应该在kprobe事件中给出
$arg2
,如下所示:

echo 'p:myprobe do_sys_open filename_string=+0($arg2):string' > kprobe_events

这应该适用于
x86
arm64

,虽然arm64上的原始版本仍然存在,但我在下面使用它作为解决方法。ie在函数中的某个地方添加跟踪事件,函数args被转换为本地变量。
+296
偏移量取自perf probe-v echo“p:myprobe do_sys_open+296 filename=+0(+0(%x19)):string”>/sys/kernel/debug/tracing/kprobe_事件
x86: echo 'p:myprobe do_sys_open filename_string=%si' > kprobe_events
arm64: echo 'p:myprobe do_sys_open filename_string=%x1' > kprobe_events
echo 'p:myprobe do_sys_open filename_string=+0($arg2):string' > kprobe_events