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