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でのこのスライドが参考になります。