EN JA
KTR(9)
KTR(9) FreeBSD Kernel Developer's Manual KTR(9)

名称

CTR0, CTR1, CTR2, CTR3, CTR4, CTR5カーネルトレース機能

書式

#include < sys/param.h>
#include < sys/ktr.h>

extern int ktr_cpumask;
extern int ktr_entries;
extern int ktr_extend;
extern int ktr_mask;
extern int ktr_verbose;
extern struct ktr_entry ktr_buf[];

void
CTR0( u_int mask, char *format);

void
CTR1( u_int mask, char *format, arg1);

void
CTR2( u_int mask, char *format, arg1, arg2);

void
CTR3( u_int mask, char *format, arg1, arg2, arg3);

void
CTR4( u_int mask, char *format, arg1, arg2, arg3, arg4);

void
CTR5( u_int mask, char *format, arg1, arg2, arg3, arg4, arg5);

void
CTR6( u_int mask, char *format, arg1, arg2, arg3, arg4, arg5, arg6);

解説

KTR は、 printf(9) スタイルの方法でログ記録することができるイベントの循環 (circular) バッファを提供します。これらのイベントは、 ddb(4), gdb(1) または ktrdump(8) でダンプすることができます。

イベントは、 CTRx マクロを通してカーネルで作成され、ログ記録されます。最初のパラメータは < sys/ktr.h> で定義されたイベントタイプ ( KTR_*) のマスクです。 mask で指定されたイベントタイプのどれかが ktr_mask に格納されたグローバルイベントマスクで有効にされる場合にだけ、イベントはログ記録されます。 format 引数はイベントログメッセージのテキストを構築するために使用される printf(9) スタイル書式の文字列です。次の format 文字列に続くのは、 format によって参照される 0 から 5 つの引数です。各イベントは、元の CTR 呼び出しのファイル名とソース行番号を付けて、ログメッセージに加えられるタイムスタンプでログ記録されます。

イベントは、供給された引数を付けて、そのままの状態で循環バッファに格納されます、そして書式化は、ダンプ時に行われます。バッファが印刷されるとき、ポインタは、無効になるかもしれないので、例えば、文字列のような、制限された存続期間のオブジェクトへのポインタを使用しないでください。

別のマクロは、その名前で示されるように、それぞれ 1 つ取る引数の数でのみ異なることに注意してください。

ktr_entries 変数は ktr_buf 配列のエントリの数を含んでいます。これらの変数は、主に循環トレースバッファのベースとその長さの位置を見つけるためにポストモーテム (事後分析) ダンプツールの役に立ちます。

ktr_mask 変数はログ記録するイベントのランタイム (実行時) マスクを含んでいます。

CPU イベントマスクは ktr_cpumask 変数に格納されます。

ktr_verbose 変数はイベントがイベントバッファに加えてコンソールにログ記録されるかどうかを制御する冗長フラグを格納します。

使用例

この例は KTR_PROC ログレベルでトレースポイントの使用を示しています。

void 
mi_switch() 
{ 
 ... 
 /* 
  * 新しい現在のプロセスを選定し、開始時刻を記録します。 
  */ 
 ... 
 CTR3(KTR_PROC, "mi_switch: old proc %p (pid %d)", p, p->p_pid); 
 ... 
 cpu_switch(); 
 ... 
 CTR3(KTR_PROC, "mi_switch: new proc %p (pid %d)", p, p->p_pid); 
 ... 
} 
}

関連項目

ktr(4), ktrdump(8)

歴史

KTR カーネルトレース機能は BSD/OS 3.0 ではじめて登場し、 FreeBSD 5.0 に導入されました。

バグ

現在、すべての CPU に共有される 1 つのグローバルなバッファがあります。 1 つの CPU が停止するかスピンし始めるなら、代わりに 1 つの CPU ごとのバッファを使用するための時間内に、何らかのポイントで有益であるかもしれません、そしてそれが停止するかスピンするすぐ前に発行されたログメッセージは他の CPU からのイベントによってかき消されません。

CTRx() マクロで与えられた引数は、 u_long として格納されるので、 u_long タイプのサイズより大きい引数を渡してはいけません。例えば、32 ビットのアーキテクチャで 64 ビットの引数を渡すと、不正確な結果を得ます。

November 30, 2008 FreeBSD