STACK(9) | FreeBSD Kernel Developer's Manual | STACK(9) |
名称
stack — カーネルスレッドスタックトレースルーチン書式
#include < sys/param.h>#include < sys/stack.h> カーネル設定ファイルで:
options DDB
options STACK
struct stack *
stack_create( void);
void
stack_destroy( struct stack *st);
int
stack_put( struct stack *st, vm_offset_t pc);
void
stack_copy( const struct stack *src, struct stack dst);
void
stack_zero( struct stack *st);
void
stack_print( const struct stack *st);
void
stack_print_ddb( const struct stack *st);
void
stack_print_short( const struct stack *st);
void
stack_print_short_ddb( const struct stack *st);
void
stack_sbuf_print( struct sbuf sb*, const struct stack *st);
void
stack_sbuf_print_ddb( struct sbuf sb*, const struct stack *st);
void
stack_save( struct stack *st);
解説
stack KPI によって、デバッグとトレース目的のためにカーネルスタックトレース情報の問い合わせができ、カーネルスタックトレース文字列の自動的な生成ができます。 KPI を使用するためには、少なくとも options DDB と options STACK の 1 つをカーネルにコンパイルしなければなりません。各スタックトレースは、 struct stack によって記述されます。トレースを作成するか、または別の方法で操作される前に、トレースのための記憶域は、スリープするかもしれない stack_create() で割り付けられなければなりません。トレースに関連しているメモリは、 stack_destroy() を呼び出すことによって解放されます。
現在のカーネルスレッドの呼び出しスタックのトレースは、 stack_save() を使用して捕獲されます。
stack_print() と stack_print_short() は、カーネル printf(9) を使用してスタックトレースを印刷するために使用され、シンボル名を検索している間に、カーネルリンカで sx(9) ロックの獲得の結果としてスリープするかもしれません。ロックに敏感な環境で、非同期化された stack_print_ddb() と stack_print_short_ddb() 変異型が、呼び出されるかもしれません。この関数は、カーネルリンカロックを迂回し、それを ddb(4) で使用可能にしますが、リンカデータ構造が変化するところで動作中のシステムは、そうしません。
stack_sbuf_print() は、単純なカーネル命令ポインタから指定されたシンボルとオフセットまでの (可能であれば) 変換を含んで、人間に読み込み可能な文字列を構成するために使用されます。引数 sb は、 sbuf(9) で説明されるように初期化されている struct sbuf でなければなりません。この関数は、自動拡張の struct sbuf が使用されるなら、またはカーネルリンカロックのためにスリープするかもしれません。 ddb(4) のような、ロックに敏感な環境で、非同期化された stack_sbuf_print_ddb() 変異型が、カーネルリンカロックを避けるために呼び出されるかもしれません。それは、固定長の sbuf で使用されるべきです。
ユーティリティ関数 stack_zero, stack_copy と stack_put は、直接スタックデータ構造を操作するために使用されます。
November 16, 2011 | FreeBSD |