スタック・トレース型

スタック・トレース型

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 プローブではサポートされません。