簡體   English   中英

kprobe_events fetch-args 適用於 x86 但不適用於 arm64

[英]kprobe_events fetch-args works for x86 but not arm64

我想將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"

手臂64:

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=""

為 arm 設置kprobe_events以獲取 args 作為字符串的正確方法是什么? 我是否錯誤地使用了 ABI?

在內核版本 >= 4.20上,您可以使用$argN獲取第N函數參數。 內核 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM