Systemtapでtracepointを利用する

久しぶりに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より抜粋。


[参考]

  1. http://sourceware.org/systemtap//SystemTap_Beginners_Guide.pdf
  2. http://sourceware.org/systemtap/langref/Components_SystemTap_script.html
  3. http://hagio.org/wiki/index.php/SystemTap

*1:利用可能なtracepoint一覧を表示している