スタック・トレース型
スタック・トレース型
stktrace_t 型の変数は、現行のスタック・トレースを返す ProbeVue 関数 get_stktrace からの戻り値を保持するために使用されます。 返されるスタック・トレースは現行スレッドのスタック・トレースです。 この変数は、キーまたは値として共用の配列に保管することもできます。 stktrace_t 型は抽象データ型であり、この変数を標準 C の単項または 2 項演算子と直接使用することはできません。 内部では、この変数は unsigned long の配列です。
Vue は、スタック・トレース型変数に関して、以下の特性および演算をサポートしています。
スタック・トレース型変数の宣言
以下のようにスクリプトで宣言することにより、変数はスタック・トレース型であると宣言することができます。
stktrace_t st; // st is a stktrace_t variable.
st = get_stktrace(5); // Get the stack trace up to five levels.
a_st[0] = get_stktrace(-1); // Get the stack trace up to the extent possible and
// store in the associative array a_st as value.
signed、unsigned、register、static、auto、thread、kernel、および const 修飾子は、stktrace_t 型変数ではサポートされていません。割り当て演算
代入 (=) 演算子では、stktrace_t 型変数を別の stktrace_t 型変数に割り当てることが許可されます。 ターゲットの stktrace_t 変数内にある、元の値は破棄されます。 stktrace_t 変数からの型キャスト、またはこの変数への型キャストは許可されません。 以下の例で、スタック・トレース t1 の内容は、t2 に割り当てられます。
stktrace_t t1, t2; // Declares two stack trace variables.
t1 = get_stktrace(); // Get the current stack trace in t1.
t2 = t1 ; // Get the content of t1 into t2.
比較演算
stktrace_t 変数では、等価 (==) 演算子と不等価 (! =) 演算子のみが許可されます。 これらの演算子の結果は、stktrace_t 変数の全体のエントリーに基づいて、True(1) または False(0) のいずれかになります。 stktrace_t 変数の個別のエントリーの比較は許可されません。 stktrace_t型変数には、ほかの比較演算子(>=, >, < or =<)は使用できません。
if( t1 == t2) // comparing two stktrace_t type variables.
printf(“Entries are similar”);
else
printf(“Entries are not similar”);
スタック・トレース型変数の表示
stktrace_t 変数は、Vue の printf 関数において %t フォーマット指定子または %T フォーマット指定子を使用することで表示できます。 出力は、この変数に保存されているスレッドのシンボリック・スタック・トレースです。 アドレス付きシンボル (シンボルとアドレス) は、stktrace_t 変数に対応するスレッドが実行状態にあり、%t フォーマット指定子がスタック・トレースの表示に使用されている場合にのみ表示されます。 それ以外の場合は、その変数に関して、アドレスとしてのスタック・トレースのみが表示されます。
キーまたは値として連想配列に保管された stktrace_t 型変数は、連想配列の print 関数を使用して表示することができます。 連想配列に保管された stktrace_t 型に対応するスレッドが実行状態の場合、シンボル付きアドレス (シンボル名とオフセット) が表示されます。それ以外の場合は、アドレスのみが表示されます。 set_aso_print_options() 関数に STKTRC_NO_SYM フラグを設定すると、この変数は実行中のスレッドのロー・アドレスを出力します。
stktrace_t t1;
t1 = get_stktrace (5);
printf (“%t”, t1); // Displays the stack trace stored in variable t1.
printf (“%T”, t1); // Displays the stack trace stored in variable t1 with raw addresses.
a[__tid] = t1; // Store t1 as value in an associative array a.
print(a) ; // Print associative array a, whose value
// type is stktrace_t variable.
スタック・トレース型変数の制限
- stktrace_t 変数の配列は宣言できません。
- stktrace_t 変数は、struct または union のメンバーとして使用できません。
- スタック・トレースの個別のエントリーへのアクセスは許可されません。
- stktrace_t 型変数の演算 (代入、比較、および印刷) は、systrace プローブではサポートされません。