トレース機能

トレース機能は、選択されたシステム・イベント または選択されたプロセスをモニターすることによって、 システムの問題を分離するのに役立ちます。 モニターできるイベントには、 選択されたサブルーチン、カーネル・ルーチン、カーネル拡張ルーチン、および 割り込みハンドラー用の入り口と出口があります。

トレースは、1 組の 実行中のプロセスまたはスレッドのトレースに制限することもできます。 あるいは、プログラムを開始し、トレースするために使用することもできます。

トレース機能がアクティブであるときは、 情報は、システム・トレース・ログ・ファイルに記録されます。 トレース機能には、トレースの活動化と制御を行うコマンドおよびトレース・レポートを生成するコマンドが組み込まれています。 アプリケーションおよびカーネル・エクステンションは、複数のサブルーチンを使用して、 その他のイベントを記録することができます。

トレース機能に関する詳細については、次を参照してください。

トレース機能の概要

トレース機能は、bos.sysmgt.trace ファイルセットにあります。 このファイルセットがインストール済みであるかどうかを調べるには、 コマンド・ラインで以下のように入力します。

lslpp -l | grep bos.sysmgt.trace

bos.sysmgt.trace が入った 1 行が生成された場合はこのファイルセットはインストール済みです。 生成されない場合は、インストールする必要があります。

システム・トレース機能は、後でトレース報告コマンドによってフォーマット設定できるように、 トレース・イベントを記録します。 トレース・イベントは、カーネルまたはアプリケーション・コードにコンパイルされますが、 トレースがアクティブの場合にのみトレースされます。

トレースは、trace コマンドまたは trcstart サブルーチンによって 活動化され、trcstop コマンドまたは trcstop サブルーチンによって停止されます。 トレースは、アクティブな間は、trcoff コマンドおよび trcon コマンド、 あるいは trcoff サブルーチンおよび trcon サブルーチンによって、 中断されたり再開されたりします。

いったんトレースが trcstop で停止されると、trcrpt コマンドを 使用してトレース・レポートを生成することができます。 このコマンドは、エントリーをどのようにフォーマット設定するかを 知らせるテンプレート・ファイル /etc/trcfmt を使用します。 このテンプレート は、trcupdate コマンドを用いてインストールされます。 このテンプレートの説明については、trcupdate コマンドを参照してください。

トレースの制御

trace コマンドは、システム・イベントのトレースを開始し、トレース・バッファーのサイズとログ・ファイルのサイズの制御を行います。

トレース・データを収集するには、3 つの方式があります。

  1. デフォルトの方式では、2 つのバッファーを使用し、片方のバッファーにデータが書き込まれている間に 他方のバッファーを書き出すことにより、連続的に使用してトレース・データを収集します。 ログ・ファイルは、いっぱいになると循環します。
  2. 循環方式では、トレース・データを連続的に収集はしますが、ログ・ファイルへデータを書き込むのは トレースが停止したときだけです。 これは、問題が発生する時点がわかっていてその時点でのデータをキャプチャーしたいだけ、 というような問題をデバッグする際、特に有用です。 トレースは、任意の時点に開始し、問題が発生して問題周辺のイベントを取り込んだ直後に停止することができます。 この方式は、-l トレース・デーモン・フラグにより使用可能となります。
  3. 第 3 のオプションではトレース・バッファーを 1 つだけ使用し、このバッファーがいっぱいになると トレースを止めてバッファーをログ・ファイルに書き込みます。 トレースは、この時点では 停止されず、trcoff コマンドが出されたかのようにオフになります。 この時点でユーザーは通常、 trcstop コマンドでトレースを停止します。 このオプションは、 データが集まるまで入出力スワッピングまたはバッファー・スワッピングのトレースを行いたくない、 パフォーマンス・データの収集において主に使用されます。 このオプションを使用可能にするには、 -f フラグを使用します。

トレース・コマンドを非同期的に実行したい、つまり trace コマンドを入力した後は別の作業を続けたい、 というのが一般的です。 トレースを非同期的に行うには、-a フラグまたは -x フラグを使用します。 -a フラグを使用した場合は、 トレースは trcstop コマンドによって停止 する必要があります。 -x フラグを使用した場合は、トレースは、 プログラムの終了時に自動的に停止します。

通常、トレースの対象とする情報を限定することが望ましいと言えます。 -j events フラグまたは -k events フラグを使用して、組み込む (-j) または除外する (-k) イベントのセットを指定します。

注: トレースを特定の プロセスまたはスレッドに制限する場合は、トレースされる情報量も制限します。

トレース・フックと関連付けられたプログラム名を表示するには、 一定のフックが使用可能であるようにしなければなりません。 それらのフックは、tidhk トレース・イベント・グループを使用して指定されます。 例えば、mbuf フック、254 をトレースし同時にプログラム名も表示したい場合は、 trace を次のように実行する必要があります。

trace -aJ tidhk -j 254

トレースが実行されます。 トレースを停止するには、コマンド・ラインに以下のように入力します。

trcstop
trcrpt -O exec=on

-O exec=on trcrpt オプションにプログラム名が示されています。 詳細については、trcrpt コマンドを参照してください。

多くの場合、バッファー・サイズおよび最大ログ・ファイル・サイズを指定することが望ましいと言えます。 トレース・バッファーには、トレース・フックを記録するために、ページングの必要がない実メモリーが 使用可能である必要があります。 ログ・ファイルは、指定された最大サイズいっぱいになると、最も古いトレース・データを廃棄して循環します。 -T size フラグおよび -L size フラグは、 メモリー・バッファーのサイズおよびログ・ファイル内のトレース・データの最大サイズをバイト単位で指定します。

注: トレース機能はデータ収集バッファーを固定するので、システムのうちトレース機能以外からはこの量のメモリーが使用できないことになります。 このため、トレース機能は、メモリーの制約が厳しい環境においてはパフォーマンスに影響を及ぼす可能性があります。 モニターされているアプリケーションがメモリーの制約を受けない場合、または trace ルーチンによって 消費されるメモリーのパーセンテージがシステム内で使用可能なメモリーに比較すれば小さい場合は、trace によって 「スチールされる」メモリーの影響は小さいはずです。 値を指定しない場合は、トレースはデフォルトのサイズを使用します。

トレースをアプリケーションから制御することもできます。 trcstart、 および trcstop の項目を参照してください。

トレース・イベント・データの記録

トレース・データには、2 つのタイプがあります。

汎用データ
データ・ワード、型が不明なデータのバッファーおよび型が不明なデータの長さから構成されます。 これは、 パス名などのトレース項目の場合に有効です。 トレース機能の概要の『汎用トレース・チャネル』を参照してください。トレース機能の項にあります。
注: 特定のプロセスまたはスレッドのトレースは、チャネル 0 でのみサポートされます。 それは、汎用トレース・チャネルではサポートされません。
非汎用データ
これは、通常 AIX® オペレーティング・システムによってトレースされる内容です。 このタイプの各エントリーは、 フック・ワードと 5 ワード以内のトレース・データで構成されます。 64 ビット・アプリケーションの場合、 これらは 8 バイトのワードです。 C プログラマーは、 /usr/include/sys/trcmacros.h ファイルにある、 マクロ TRCHKL0 からマクロ TRCHKL5 まで、および TRCHKL0T から TRCHKL5T までを用いて、 非汎用データを記録する必要があります。 これらのマクロが使用できない場合は、 utrchook サブルーチンにある項目を参照してください。

トレース・レポートの生成

trcrpt の詳細な説明については、trcrpt コマンドを参照してください。 このコマンドは、trace コマンドによって生成されたログ・ファイルから、 読み取り可能なトレース・レポートを生成するために使用します。 デフォルトでは、このコマンドは、デフォルトのログ・ファイルである /var/adm/ras/trcfile からのデータをフォーマット設定します。 trcrpt 出力は、標準出力に書き出されます。

デフォルトのログ・ファイルからトレース・レポートを生成して /tmp/rptout に書き出すには、 次のように入力します。

trcrpt >/tmp/rptout

プログラム名およびシステム・コール名を組み込むログ・ファイル /tmp/tlog から /tmp/rptout へ、 トレース・レポートを生成するには、次のように入力します。

trcrpt -O exec=on,svc=on /tmp/tlog >/tmp/rptout

トレース・データのダンプからの抽出

システムがダンプを取る時点でトレースがアクティブだった場合は、通常、 そのトレースを trcdead コマンドで検索することができます。 現行システムのデフォルトのトレース・ログ・ファイルが上書きされないようにするには、-o output-file オプションを使用します。

次に例を示します。

trcdead -o /tmp/tlog /var/adm/ras/vmcore.0

と入力すると、トレース・ログ・ファイル /tmp/tlog が作成され、次のコマンドでフォーマット設定することができます。

trcrpt /tmp/tlog

トレース機能のコマンド

以下のコマンドは、トレース機能の一部です。

コマンド 機能
trace システム・イベントのトレースを開始します。 このコマンドを用いると、トレース・ログ・ファイルだけでなく、トレース・イベント・データを 収集する内部トレース・バッファーのサイズの制御と管理も行うことができます。
trcdead システム・ダンプからトレース情報を抽出します。 トレース機能がアクティブである間にシステムが停止した場合、内部トレース・バッファーの内容が取り込まれます。 このコマンドは、ダンプからトレース・イベント・データを抽出して、そのデータをトレース・ログ・ファイルに書き込みます。
trcnm trcrpt コマンドが使用する kernel name list カーネル名リストを生成します。 カーネル名リストは、 オブジェクト・ファイルのシンボル・テーブルとローダー・シンボル・テーブルで構成されています。 trcrpt コマンドは、カーネル名リスト・ファイルを使用して、 トレース・ログ・ファイル内のレポートをフォーマット設定する際のアドレスを解釈します。
注: trcnm オプションではなく、 -n trace オプションを使用することをお勧めします。 このオプションは、名前リスト情報を別個のファイルではなくトレース・ログ・ファイルに入れ、 カーネル・エクステンションからのシンボルを組み入れます。
trcrpt トレース・ログ・ファイル内に入っているトレース・イベント・データのレポートをフォーマット設定します。 このコマンドを用いると、レポートに組み込む (または省略する) イベントを指定できるだけでなく、 出力の表示方法を決定することもできます。 trcrpt コマンドは、/etc/trcfmt ファイルに保管されている トレース・フォーマット設定テンプレートを使用して、各イベントについて記録されているデータの解釈方法を決定します。
trcstop システム・イベントのトレースを停止します。
trcupdate /etc/trcfmt ファイルに保管されているトレース・フォーマット 設定テンプレートを更新します。 トレース・イベントを記録するアプリケーションまたはカーネル・エクステンションを追加する場合は、 これらのイベント用のテンプレートを /etc/trcfmt ファイルに追加する必要があります。 trcrpt コマンドは、トレース・フォーマット設定テンプレートを使用して、 各イベントについて記録されているデータの解釈方法を決定します。 イベントを記録するソフトウェア・プロダクトは、通常、インストール・プロセスの 一部として trcupdate コマンドを実行します。

トレース機能のコールおよびサブルーチン

以下のコールおよびサブルーチンは、トレース機能の一部です。

サブルーチン 説明
trcgentrcgent

6 ワード以上のデータのトレース・イベントを記録します。 trcgen サブルーチンは、 イベントをシステム・イベント・トレース (トレース・チャネル 0) の一部として記録する場合、または汎用トレース・チャネル (チャネル 1 から 7) 上のイベントを記録する場合に使用することができます。 トレース・イベントを記録する際、サブルーチン・パラメーターでチャネル番号を指定します。 trcgent サブルーチンは、イベント・データにタイム・スタンプを追加します。 AIX 5L バージョン 5.3 (5300-05 テクノロジー・レベル適用) と上記を使用する場合、使用されるサブルーチンに関係なく常にタイム・スタンプがイベント・データに追加されます。 カーネル内では trcgenk および trcgenkt を使用します。 C プログラマーは、常に、TRCGEN マクロおよび TRCGENK マクロを使用する必要があります。

utrchookutrchook64 5 ワード以下のデータのトレース・イベントを記録します。 これらのサブルーチンは、イベントをシステム・イベント・トレース (トレース・チャネル 0) の一部として記録する場合に使用することができます。 カーネル・プログラマーは、 trchook および trchook64 を使用することができます。 C プログラマーは、常に、 TRCHKL0 から TRCHKL5 および TRCHKL0T から TRCHKL5T マクロを使用する必要があります。

これらのマクロを使用しない場合には、 独自のトレース・フック・ワードを構築する必要があります。 このフォーマットは、 /etc/trcfmt ファイルで文書化されます。 32 ビット・トレースと 64 ビット・トレースは、異なるフック・ワード・フォーマットを持つことに注意してください。

trcoff システム・イベント・トレース・チャネル (チャネル 0) または汎用トレース・チャネル (1 から 7) の いずれかのトレース・データの収集を延期します。 トレース・チャネルはアクティブのままであり、trcon サブルーチンを使用すると、 トレース・データの収集を再開することができます。
trcon トレース・チャネル上のトレース・データの収集を開始します。 チャネルは、システム・イベント・トレース・チャネル (0) または汎用チャネル (1 から 7) のいずれでも可能です。 ただし、事前に trace コマンドまたは trcstart サブルーチンを使用して、 トレース・チャネルがアクティブになっている必要があります。 trcoff サブルーチンを使用すると、トレース・データの収集を延期することができます。
trcstart トレース・コマンドへのライブラリー・インターフェースを提供します。 これは、開始されたトレースのチャネル番号を戻します。 汎用チャネルが要求された場合は、チャネル番号は 1、2、3、4、5、6、または 7 のいずれかになります。汎用チャネルが要求されない場合のチャネル番号は 0 です。
trcstop 汎用トレース・チャネルを解放して、活動停止にします。

トレース機能のファイル

ファイル 説明
/etc/trcfmt trcrpt コマンドが各イベントについて記録されているデータの解釈方法を決定する際に使用する、 トレース・フォーマット設定テンプレートが入っています。
/var/adm/ras/trcfile デフォルトのトレース・ログ・ファイルが入っています。 trace コマンドを使用すると、別のトレース・ログ・ファイルを指定することができます。
/usr/include/sys/trchkid.h トレース・フック ID の定義が入っています。
/usr/include/sys/trcmacros.h トレース・イベントを記録するために、一般によく使用されるマクロが入っています。

トレース・イベント・データ

トレース・イベント・データのフォーマットについては、/etc/trcfmt ファイルを参照してください。

トレース・フック ID

トレース・フック ID は 3 桁または 4 桁の 16 進数で、トレースされるイベントを識別するものです。 AIX 7.1 以前、および AIX 7.1 以上で実行される 32 ビット・アプリケーションでは、3 桁のフック ID のみを使用できます。 TRCHKL1 などのトレース・マクロを使用する場合、トレース・フックは次のように指定します。
hhh00000
hhh はフック ID です。
AIX 7.1 以上で実行される 64 ビット・アプリケーションとカーネル・ルーチンでは、3 桁と 4 桁の ID を使用できます。 TRCHKL1 などのトレース・マクロを使用する場合、トレース・フックは次のように指定します。
hhhh0000
hhhh はフック ID です。
注: 4 桁の ID を使用し、その ID が 0x1000 より小さい場合、最下位桁は (形式 0x0hh0 の) 0 となります。

3 桁の ID にはその最下位桁に暗黙の 0 があり、32 ビットのフック ID は hhh0 の 64 ビットのフックと同等となります。

トレース・フック ID の大部分は、 /usr/include/sys/trchkid.h ファイルに定義されています。 0x0100 から 0x0FF0 までの値は、64 ビット・ユーザー・アプリケーションに使用できます。 0x010 から 0x0FF までの値は、32 ビット・ユーザー・アプリケーションに使用できます。 その他の値はすべて、システム使用のために予約されています。 現在定義されているトレース・フック ID は、trcrpt -j コマンドを使用してリストすることができます。

トレース機能の汎用トレース・チャネル

トレース機能は、一度に最大 8 個のアクティブ・トレース・セッションをサポートします。 トレース・セッションのそれぞれが、多重スペシャル・ファイル /dev/systrace のチャネルを使用します。 チャネル 0 は、トレース機能がシステム・イベントを記録するために使用します。 システム・イベントのトレースは、trace コマンドによって開始され、trcstop コマンドによって停止されます。 特定の プロセスまたはスレッドをトレースする場合、またはプログラムがトレースされる 場合は、チャネル 0 のみが使用されます。 チャネル 1 から 7 は汎用トレース・チャネルと呼ばれるもので、サブシステムがデータ・リンクのトレースなど、 他のタイプのトレースを行う場合にのみ使用できます。

トレース機能の汎用トレース・チャネルを使用したトレースをインプリメントするために、 サブシステムは trcstart サブルーチンをコールして、 トレース・チャネルをアクティブにし、チャネル番号を判別します。 これで、サブシステム・モジュールが TRCGEN または TRCGENT マクロ、 あるいは必要であれば、trcgentrcgenttrcgenk、 または trcgenkt サブルーチンを使用してトレース・イベントを記録することができます。 trcstart サブルーチンによって 戻されるチャネル番号は、これらのサブルーチンに渡さなければならない パラメーターの 1 つです。 サブシステムは、trcoff および trcon サブルーチンを 使用してトレース・データの収集を中断および再開でき、また、trcstop サブルーチンを 使用してトレース・チャネルを活動停止にできます。 サブシステムは、サブシステム・トレースの活動化および非活動化のためのユーザー・インターフェースを提供する必要があります。

/usr/include/sys/trchkid.h ファイルに保管されている大部分のトレース・フック ID と、 /etc/trcfmt ファイルに保管されているトレース・フォーマット設定テンプレートは、すべてのトレース・チャネルが共有します。