EN JA
STACK(9)
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 DDBoptions 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_copystack_put は、直接スタックデータ構造を操作するために使用されます。

関連項目

ddb(4), printf(9), sbuf(9), sx(9)

作者

stack(9) 関数一式は、 Antoine Brodin によって作成されました。 stack(9) は、 ddb(4) の外で汎用の使用のために Robert Watson によって拡張されました。
November 16, 2011 FreeBSD