我想获取do_sys_open
文件名参数作为字符串。为此,我在kprobetrace.txt之后添加了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_string=(fault)
)
x86:
echo 'p:myprobe do_sys_open filename_string=+0(%si):string' > kprobe_events
output:
adb-30551 [001] d... 4570187.407426: myprobe: (do_sys_open+0x0/0x270) filename_string="/dev/bus/usb/001/001"
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)
要检查我是否正确使用了手臂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
但是在这种情况下,性能检测也失败了(即filename_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_events
以将args提取为字符串的正确方法是什么?
我使用ABI的方式有误吗?
答案 0 :(得分:0)
在内核版本 >= 4.20
上,您可以使用 $argN
获取 N
th 函数参数。来自kernel 4.20 kprobetrace.rst:
FETCHARGS : Arguments. Each probe can have up to 128 args.
.....
.....
$argN : Fetch the Nth function argument. (N >= 1) (\*1)
由于 filename
是 do_sys_open()
的第二个参数,您应该在 kprobe 事件中给出 $arg2
,如下所示:
echo 'p:myprobe do_sys_open filename_string=+0($arg2):string' > kprobe_events
这应该适用于 x86
和 arm64
。