kprobe_events fetch-args работает для x86, но не для arm64 - PullRequest
2 голосов
/ 19 апреля 2019

Я хотел получить do_sys_open аргумент имени файла в виде строки. Для этого я добавил kprobe, следующий kprobetrace.txt . Простой зонд, который дает имя файла в шестнадцатеричном формате, работает как для 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. Зонд, созданный perf, как видно из /sys/kernel/debug/tracing/kprobe_events, был похож

./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 для arm, чтобы получить аргументы в виде строки? Я неправильно использую ABI?

...