2

do_sys_openファイル名引数を文字列として取得したかった。このために、 kprobe に続いてkprobetrace.txtを追加しました。ファイル名を 16 進数で指定する単純なプローブは、両方で機能し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)

アーム 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

しかし、perf プローブも失敗していました (つまり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アームが引数を文字列としてフェッチするように設定する正しい方法は何でしょうか? ABI を間違って使用していますか?

4

1 に答える 1