ftraceによるカーネルデバッグの方法


1.カーネル構成


カーネルをコンパイルするときは、以下のconfigをyに書き込み、カーネルに組み込むように選択します.
CONFIG_FUNCTION_TRACER 
 CONFIG_FUNCTION_GRAPH_TRACER 
 CONFIG_CONTEXT_SWITCH_TRACER 
 CONFIG_NOP_TRACER 
 CONFIG_SCHED_TRACER 

2.ユーザ空間インタフェース


ftraceはdebugfsを介してユーザ状態にアクセスインタフェースを提供する.カーネルを構成するときにdebugfsをアクティブにすると、ディレクトリ/sys/kernel/debugが作成され、debugfsファイルシステムがそのディレクトリにマウントされます.このディレクトリをマウントするには、/etc/fstabファイルに次の内容を追加する必要があります.
        debugfs  /sys/kernel/debug  debugfs  defaults  0  0 

または、実行時にマウントできます.
        mount  -t  debugfs  nodev  /debug 

tracingディレクトリに入ると、カーネルをコンパイルするときに選択したオプションによって少し異なるファイルが表示されます.
/debug/tracingディレクトリの下にはファイルとディレクトリが多く、様々なトラッカーが共有して使用されているものもあれば、トラッカー固有に使用されているものもあります.これらのデータファイルを操作する場合は、echoコマンドを使用して値を変更するか、プログラムでファイルの読み書きに関連する関数を使用してファイルの値を操作することができます(vimエディタで編集することはできません).以下では、カーネルソースパッケージのDocumentation/traceディレクトリのドキュメントとkernel/traceのソースファイルを参照して、残りのファイルの用途を理解することができます.
READMEファイルは、ftraceの動作命令シーケンスを示す簡単な使用説明を提供する.catコマンドでファイルを表示して、サマリーの操作フローを知ることができます.
current_tracerは、現在使用されているトラッカーを設定または表示するために使用されます.echoを使用してトラッカー名をファイルに書き込むと、異なるトラッカーに切り替えることができます.システムが起動すると、デフォルト値はnopで、追跡操作は行われません.トレースタスクを実行した後、ファイルにnopを書き込むことでトラッカーをリセットできます.
available_tracersは、現在カーネルにコンパイルされているトラッカーのリストを記録し、catでコンテンツを表示できます.これに含まれるトラッカーは、図3でアクティブ化されたオプションに対応する.current_を書くtracerファイルで使用するトラッカー名は、ファイルにリストされているトラッカー名のリストにある必要があります.blk mmiotrace functionなどあります
traceファイルは、取得したトレース情報を表示するインタフェースを提供します.catなどのコマンドでファイルを表示して追跡されたカーネルアクティビティレコードを表示したり、後続の表示に備えて記録ファイルとして保存したりできます.
tracing_enabledはcurrent_を制御するために使用されますtracerのトラッカーがカーネル関数の呼び出し状況を追跡できるかどうか.書き込み0はトレースアクティビティを閉じ、書き込み1はトレース機能をアクティブにします.デフォルトは1です.
set_graph_functionは呼び出し関係を明確に表示する関数を設定し、表示される情報構造はC言語コードに似ており、カーネルの動作プロセスを分析する際により直感的になります.function_を使用していますgraphトラッカーの場合に使用します.デフォルトでは、すべての関数に対して呼び出し関係シーケンスが生成されます.このファイルを書くことで、特に注目すべき関数を指定できます.
buffer_size_kbは、単一のCPUで使用されるトレースキャッシュのサイズを設定するために使用される.トラッカーはトレースされた情報をキャッシュに書き込み,各CPUのトレースキャッシュは同じ大きさである.トレースキャッシュはリングバッファの形式で実現され、トレースされた情報が多すぎると、古い情報は新しいトレース情報で上書きされます.ファイルの値を変更するにはcurrent_tracerはnopに設定してください.
tracing_onトレースの一時停止を制御するために使用します.あるイベントを観察したときにトレースを一時的にオフにしたい場合、0をファイルに書き込んでトレースを停止することができます.これにより、トレースバッファの新しい部分が注目されているイベントに関連しています.書き込み1はトレースを続行できます.
available_filter_functionsは、現在追跡可能なカーネル関数を記録します.このファイルにリストされていない関数のアクティビティは追跡できません.
set_ftrace_フィルタとset_ftrace_notraceはカーネルコンパイル時にダイナミックftrace(CONFIG_DYNAMIC_FTRACEオプションを選択)を設定して使用します.前者はトレースする関数を表示し、後者は逆にトレースしない関数を指定します.2つのファイルに1つの関数名が同時に表示される場合、この関数の実行状況は追跡されません.これらのファイルはまた、単純な形式のワイルドカードを含む式をサポートし、1つの式で複数のターゲット関数を一度に指定することができます.具体的な使用は後述する.この2つのファイルに書き込む関数名は、ファイルavailable_filter_functionsで見ました.デフォルトでは、すべてのカーネル関数、ファイルset_を追跡できます.ftrace_notraceの値は空です.
available_eventsが監視できるイベント、例えばwritebackなど

4.ftraceトラッカー


ftraceには現在、プロセススケジューリング、割り込みクローズなど、異なるタイプの情報を追跡するための複数のトラッカーが含まれています.ファイルを表示できます.tracersは、カーネルが現在サポートしているトラッカーのリストを取得します.カーネルをコンパイルするときに、カーネルがサポートするトラッカーに対応するオプションも表示されます.
nopトラッカーはカーネルアクティビティを追跡せず、current_にnopを書き込みます.tracerファイルは、以前に使用したトラッカーを削除し、以前に収集したトレース情報をクリアします.すなわち、traceファイルをリフレッシュします.
functionトラッカーはカーネル関数の実行状況を追跡することができる.ファイルset_からftrace_filterには、追跡する関数が表示されます.
function_graphトラッカーは、Cソースコードのような関数呼び出し関係図を表示することができ、直感的に見ることができます.ファイルset_からgrapch_functionは、呼び出しフローチャートを生成する関数を指定します.
sched_switchトラッカーは、カーネル内のプロセススケジューリングアクティビティを追跡できます.
IRqsoffトラッカーとpreemptoffトラッカーは、クローズが中断したコードとプロセスのプリエンプトを禁止するコードをそれぞれ追跡し、クローズの最大時間を記録し、preemptirqsoffトラッカーはそれらの組み合わせと見なすことができる.
ftraceでは、initcall、ksym_などの他のトラッカーもサポートされています.tracer、mmiotrace、sysprofなど.ftraceフレームワークは、拡張による新しいトラッカーの追加をサポートします.読者は、カーネルソースパッケージのDocumentation/traceディレクトリのドキュメントとkernel/traceのソースファイルを参照して、他のトラッカーの用途と新しいトラッカーの追加方法を理解することができます.

5.ftrace操作


ftraceが提供するトラッカーを使用してカーネルをデバッグまたは分析するには、次の操作が必要です.
ディレクトリ/debug/tracing/下に切り替えます.
available_の表示tracersファイル、現在のカーネルでサポートされているトラッカーリストを取得
ftraceトレースを閉じて、0がファイルtracing_に書き込まれます.enabled
ftraceをアクティブにするenabled、そうでなければfunctionトラッカーの動作はnopに似ています.さらに、このオプションをアクティブにすると、irqsoffなどのトラッカーがより豊富な情報を取得することもできます.ftraceを使用するときにアクティブにすることをお勧めします.ftrace_をアクティブにするにはEnabled、procファイルシステムインタフェースで設定できます:
    echo 1 > /proc/sys/kernel/ftrace_enabled 

選択したトラッカーの名前をファイルcurrent_に書き込むtracer
トレースする関数をファイルset_に書き込むftrace_filter、追跡したくない関数をファイルset_に書き込むftrace_notrace.通常ファイルset_を直接操作ftrace_filterでいいftraceトレースをアクティブにし、1ファイルtracing_に書き込むenabled.また、ファイルtracing_onの値も1であり、このファイルは追跡の一時停止を制御することができる.
アプリケーションを分析する場合、アプリケーションの実行を開始すると、ftraceはアプリケーションの実行中にカーネルの動作を追跡する.
0をファイルtracing_に書き込むonは追跡情報の記録を一時停止し、このときトラッカーはカーネルの実行を追跡しているが、ファイルtraceに追跡情報を書き込まない.または0をファイルtracing_に書き込むenabled追跡を閉じる
ファイルtraceを表示トレース情報を取得し、カーネルの実行を分析デバッグ具体的には、以下のコマンドを実行します.
#:echo      0                                           tracing_on
#:echo         1                                           tracing_on
#:echo          yourwantedtracer            current_tracer(default=nop)
#:echo          filenamepattern               set_ftrace_filter(default=all)
#echo 0 tracing_on  // tracing 

7.ftraceトラッカーの例説明


 [root@linux tracing]# echo 0 > tracing_on
 [root@linux tracing]# echo 1 > tracing_on
 [root@linux tracing]# echo function > current_tracer 
 [root@linux tracing]# echo 1 > tracing_on 
 [root@linux tracing]# echo 1 > tracing_enabled 

 #  ,  ftrace  , 

 [root@linux tracing]# echo 0 > tracing_enabled 
 [root@linux tracing]# cat trace | head -10 
 # tracer: function 
 # 
 #         TASK-PID    CPU#    TIMESTAMP  FUNCTION 
 #            | |       |          |         | 
          <idle>-0     [000] 20654.426521: _raw_spin_lock <-scheduler_tick 
          <idle>-0     [000] 20654.426522: task_tick_idle <-scheduler_tick 
          <idle>-0     [000] 20654.426522: cpumask_weight <-scheduler_tick 
          <idle>-0     [000] 20654.426523: cpumask_weight <-scheduler_tick 
          <idle>-0     [000] 20654.426523: run_posix_cpu_timers <-update_process_times 
 <idle>-0 [000] 20654.426524: hrtimer_forward <-tick_sched_timer 

traceファイルが与える情報フォーマットははっきりしています.まず、フィールド「tracer:」には、functionトラッカーとして現在使用されているトラッカーの名前が表示されます.次にトラッキング情報記録のフォーマットで、TASKフィールドはタスクの名前に対応し、PIDフィールドはタスクのプロセスIDを与え、フィールドCPU#はトラッキング関数を実行するCPU番号を表し、ここでidleプロセスは0番CPU上で実行され、そのプロセスIDは0であることがわかる.フィールドTIMESTAMPはタイムスタンプであり、その形式は「.」であり、この関数を実行する際に対応するタイムスタンプを表し、FUNCTIONの列には追跡された関数が与えられ、関数の呼び出し者は記号「<-」で示され、関数の呼び出し関係が観察される.
その他のトラッカーの概要
function_graph:{}を持つC言語形式に類似した関数呼び出し関係図を生成するために使用
sched_switchトラッカーは、プロセスのスケジューリング切り替えと間の起動操作を追跡できます.

8.特定の関数のトレース


実際の作業では、特定の関数、またはモジュールの下にあるいくつかの関数が必要になります.
IPv 6モジュールの関数の追跡
 [root@linux tracing]# echo ':mod:ipv6' > set_ftrace_filter 
 [root@linux tracing]# cat set_ftrace_filter | head -5 
 ipv6_opt_accepted 
 inet6_net_exit 
 ipv6_gro_complete 
 inet6_create 
 ipv6_addr_copy 

9.trace_を使うprintk印刷トラッキング情報


カーネルヘッダファイルinclude/linux/kernel.hにはftraceが提供するツール関数のプロトタイプが記述されており、これらの関数にはtrace_が含まれる.printk、tracing_on/tracing_offなど.この文書では、サンプルモジュールプログラムを使用して、コードでこれらのツール関数を使用する方法を読者に示します.