【问题标题】:kprobe_events fetch-args works for x86 but not arm64kprobe_events fetch-args 适用于 x86 但不适用于 arm64
【发布时间】:2019-09-09 17:47:46
【问题描述】:

我想将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)

为了检查我是否正确使用了 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

但在这种情况下,性能探测也失败了(即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=""

设置kprobe_events for arm 以获取 args 作为字符串的正确方法是什么? 我是否错误地使用了 ABI?

【问题讨论】:

  • 虽然 arm64 上的原始问题仍然存在,但我在下面使用了解决方法。即在函数内的某处添加跟踪事件,其中函数 args 被转换为本地 var。 +296 偏移量取自 perf-probe -v echo "p:myprobe do_sys_open+296 filename=+0(+0(%x19)):string" > /sys/kernel/debug/tracing/kprobe_events

标签: linux-kernel trace perf kprobe tracepoint


【解决方案1】:

在内核版本 >= 4.20 上,您可以使用 $argN 获取 Nth 函数参数。来自kernel 4.20 kprobetrace.rst

 FETCHARGS  : Arguments. Each probe can have up to 128 args.
 .....
 .....
  $argN     : Fetch the Nth function argument. (N >= 1) (\*1)

由于filenamedo_sys_open() 的第二个参数,您应该在kprobe 事件中提供$arg2,如下所示:

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

这应该适用于x86arm64

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-02-02
    • 2018-06-22
    • 1970-01-01
    • 2022-08-14
    • 2016-12-16
    相关资源
    最近更新 更多