2011年06月14日
KZM-A9-Dualボードのkernel 2.6.29でftraceを試す(ビルド編)
2.6.29のカーネルで試しています。
Kernelのコンフィグ
make menuconfigで
Kernel hacking > Tracers > kernel Function Tracer
これでビルドするとエラーになってしまいました。
undefined reference to '__gnu_mcont_nc'
パッチをあてる
elinux.orgにパッチがあるのをみつけました。
Support-ftrace-with-newer-compilers.patchをダウンロードして
$ patch -p1 < ~/Support-ftrace-with-newer-compilers.patch
これでビルドが通るようになりました。
さらにこのページにあるAdd-ARM-function-duration-tracer-2.6.29.tgzとGnu_mcount_nc-func_graph.patchをダウンロードして適用します。
このアーカイブでは複数のpatchがquiltというコマンドで管理されているので、まずそのコマンドをインストールします。
$ sudo apt-get install quilt
カーネルのソースディレクトリでアーカイブを開きます。patchesというディレクリにpatchのファイルがあり、それらの適用順序はseriesというファイルに書かれています。
$ tar xvf ~/Add-ARM-function-duration-tracer-2.6.29.tgz $ quilt push -a $ patch -p1 < ~/Gnu_mcount_nc-func_graph.patch
実行例
これでビルドして試しました。function_graphも使えるようになっています。
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
0) 0.000 us | }
0) | __napi_complete() {
0) 0.000 us | l2x0_cache_sync();
0) 0.000 us | }
0) 0.000 us | }
0) 0.000 us | }
0) 0.000 us | }
0) 0.000 us | _local_bh_enable();
0) 0.000 us | }
0) 0.000 us | idle_cpu();
0) 0.000 us | }
0) 0.000 us | }
0) | preempt_schedule_irq() {
0) | schedule() {
0) | put_prev_task_fair() {
0) 0.000 us | update_curr();
0) 0.000 us | __enqueue_entity();
0) 0.000 us | }
ただし、SMPだと不安定だったので、SMPはオフにしました。trace-cmdもうまく動かなかったので、ftraceの操作はdebugfsを使って行います。
ftraceの使い方についてはELC2010でのこのスライドが参考になります。