読者です 読者をやめる 読者になる 読者になる

perf probeで関数の引数も記録する

linux kernel perf

perf probeで引数とかもログ取れる?と思って確認したらできることが分かったのでその辺のめも。

例えばlong do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)の引数を記録するのはこんな感じ。filename引数は文字列として扱うようにstringで指定。後は整数値なので特になし。登録が完了するとこうやって記録しろってコマンドラインを表示してくれるので実行する。

[root@saga masami]# perf probe 'do_sys_open filename:string flags mode'
Added new event:
  probe:do_sys_open    (on do_sys_open with filename:string flags mode)

You can now use it in all perf tools, such as:

        perf record -e probe:do_sys_open -aR sleep 1

[root@saga masami]# perf record -e probe:do_sys_open -aR sleep 10

登録されているprobeの一覧は-lオプションで見れる。

[root@saga masami]# perf probe -l
  probe:do_sys_open    (on do_sys_open@fs/open.c with filename_string flags mode)

ログを見るのにperf reportではなくてperf scriptでcatコマンドだけに絞りつつ、見るフィールドをcomm、time、event、trace(ここではfilname_string=からの部分)で表示してみる。

[root@saga masami]# perf script -f time,comm,event,trace -c cat
'trace' not valid for hardware events. Ignoring.
'trace' not valid for software events. Ignoring.
'trace' not valid for unknown events. Ignoring.
             cat  5527.132267: probe:do_sys_open: (ffffffff811d3000) filename_string="/etc/ld.so.cache" flags=557056 mode=0x1
             cat  5527.132289: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/lib/libc.so.6" flags=557056 mode=0x8130
             cat  5527.132498: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/lib/locale/locale-archive" flags=557056 mode=0x0
             cat  5527.132543: probe:do_sys_open: (ffffffff811d3000) filename_string="a.c" flags=32768 mode=0x0
             cat  5529.039551: probe:do_sys_open: (ffffffff811d3000) filename_string="/etc/ld.so.cache" flags=557056 mode=0x1
             cat  5529.039604: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/lib/libc.so.6" flags=557056 mode=0xe130
             cat  5529.040124: probe:do_sys_open: (ffffffff811d3000) filename_string="" flags=557056 mode=0x0
             cat  5529.040250: probe:do_sys_open: (ffffffff811d3000) filename_string="b.c" flags=32768 mode=0x0
             cat  5529.040329: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/locale.alias" flags=557056 mode=0x1b6
             cat  5529.040459: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en_US.UTF8/LC_MESSAGES/libc.mo" flags=32768 mode=0x1
             cat  5529.040478: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo" flags=32768 mode=0xa1a0
             cat  5529.040493: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en_US/LC_MESSAGES/libc.mo" flags=32768 mode=0xb270
             cat  5529.040509: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en.UTF8/LC_MESSAGES/libc.mo" flags=32768 mode=0xb3a0
             cat  5529.040524: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo" flags=32768 mode=0xb1e0
             cat  5529.040539: probe:do_sys_open: (ffffffff811d3000) filename_string="/usr/share/locale/en/LC_MESSAGES/libc.mo" flags=32768 mode=0xb310

参考にしたのはLinux perf ExamplesのExamplesです。 上記ページにあるとおり、probeの内容によってはCONFIG_DEBUG_INFO=yにする必要があります。fedoraとかだとdebug用のパッケージを入れれば良いかと思います。