久しぶりにsystemtapを利用したら、ほとんど覚えていなかったのでいろいろメモをしておく。
systemtapからtracepointを利用する場合、kernel.trace()を利用する。
例えばmodule_loadをフックする場合、次のように書く。
probe kernel.trace("module_load") { hogehoge }
多くのtracepointでは、引数が渡される。systemtapで利用可能な引数は次のようにして確認する。*1
$ stap -L 'kernel.trace("*")' ..... kernel.trace("module_free") $mod:struct module* kernel.trace("module_load") $mod:struct module* .....
$hogeが引数名。":"以降はその型。上の例では、module_free、module_loadともにstruct module型へのポインタを$modで利用できるということ。
で、プローブハンドラ内で引数を利用してみると、こんな感じ。
probe kernel.trace("module_load") { printf("%s is loaded\n", kernel_string($mod->name)); }
変数の内容がポインタだった場合、ポインタが指す変数の値(数値・文字列等)を取り出すには下記の関数を使う。上の例では、ポインタ($mod->name)が文字列をさしているので、kernel_string()を使ってる。
- kernel_short(address)
Obtain the short at address from kernel memory.
- kernel_int(address)
Obtain the int at address from kernel memory.
- kernel_long(address)
Obtain the long at address from kernel memory
- kernel_string(address)
Obtain the string at address from kernel memory.
- kernel_string_n(address, n)
Obtain the string at address from the kernel memory and limits the string to n bytes.
参考1より抜粋。
[参考]
- http://sourceware.org/systemtap//SystemTap_Beginners_Guide.pdf
- http://sourceware.org/systemtap/langref/Components_SystemTap_script.html
- http://hagio.org/wiki/index.php/SystemTap
*1:利用可能なtracepoint一覧を表示している