perf probeとは何か。

perf-toolsでは、カーネル内のトレースポイントを「イベント」として扱っています。perf probeでは、後付けで追加の「イベント」を動的に定義できるようになります。perf-probeでは、カーネルデバッグ情報を利用して、関数の行番号を指定して新しい「イベント」の場所を定義したり、関数のローカル変数を「イベント」の引数に指定できます。
デバッガで言うところの、ブレークポイントを指定するようなものです。

perf probe導入方法

2.6.33-rc1でperf probeがサポートされたので、導入方法などを書いておきます。

  1. libdwarf-dev(el)パッケージ(20081218以降)をインストールする。
  2. 2.6.33-rc1か、tipツリーを持ってきてビルド→インストール→再起動
    • CONFIG_KPROBES, CONFIG_KPROBE_EVENT, CONFIG_DEBUG_INFOを有効にしておくこと。
  3. tools/perf/以下で、makeを実行する。
  4. ./perf probe -hで使い方が表示されるはず。

perf probe簡単な使い方

ちなみに、イベントの追加は今のところrootユーザしか出来ません。

  • XXX関数のYYY引数をとってくるイベントを定義したい。
 ./perf probe XXX YYY 
  • XXX関数の頭からNNN行目にイベントを定義したい。
 ./perf probe XXX:NNN 
  • FFF.cファイルのNNN行目にイベントを定義したい。(ファイル名か関数かは、'.'があるかどうかだけで判断しています(適当))
 ./perf probe FFF.c:NNN 
  • XXX関数が戻るときに、戻り値をみるイベントを定義したい。
 ./perf probe XXX%return '$retval' 
  • 上記のイベントをリストする
 ./perf probe -l
  • 上記のイベントを使ってlsの情報を見る。(使い方はトレースポイントのイベントと同じ)
 ./perf record -e 'probe:イベント名:record' -a ls
 ./perf trace

多分こんな感じで出来たと思う。

ハマりポイント

  • perf probe --add XXX YYY ってしたら'YYY'がないって怒られた。→--addオプションを使うときは、イベントの定義を''で囲むなどして、一つの引数にしてください。(この場合は perf probe --add 'XXX YYY'になります)
  • XXX関数が1000行目にあるので、XXX:1020としたら見つからないって言われた。→'関数:行番号'の書き方では、行番号は関数の頭からの相対行番号になります。(この場合は XXX:20が正しい)
  • XXX関数の30行目を指定したら、見つからないって言われた。→最適化などで消えたりする行は、デバッグ情報に含まれていないことがあります。前後の行を指定してみて試してください。
  • XXX関数の10行目を指定したら、いっぱい見つかった。→最適化でループが展開されたりして、そうなることがあります。気にしないで全部トレースしましょう。