Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

呼び出しスタックを確認する

呼び出しスタックは、呼び出されたあと呼び出し側にまだ戻っていない、現在活動状態にあるルーチンすべてを示します。呼び出しスタックには、呼び出された順序で関数とその引数が一覧表示されます。プログラムフローのどこで実行が停止し、この地点までどのように実行が到達したのかが、スタックトレースに示されます。スタックトレースは、プログラムの状態を、もっとも簡潔に記述したものです。

スタックトレースを表示するには、where コマンドを使用します。


(dbx) stop in printf
(dbx) run
(dbx) where
  [1] printf(0x10938, 0x20a84, 0x0, 0x0, 0x0, 0x0), at 0xef763418
=>[2] printit(msg = 0x20a84 "hello world\n"), line 6 in "t.c"
  [3] main(argc = 1, argv = 0xefffe93c), line 13 in "t.c"
(dbx)

-g オプションを使ってコンパイルされた関数の場合は引数の名前と型がわかっているので、正確な値が表示されます。デバッグ情報を持たない関数の場合、16 進数が引数として表示されます。これらの数字に意味があるとはかぎりません。たとえば、前述のスタックトレースのフレーム 1 は、$i0 から $i5 の SPARC 入力レジスタの内容を示しています。内容に意味があるレジスタは $i0 から $i1 までだけです (「プログラムをステップ実行する」の例の printf に引き渡された引数は 2 つだけであるため)。

-g オプションを使ってコンパイルされなかった関数の中でも停止することができます。このような関数の中で停止する場合、dbx-g オプションを使用してコンパイルされた関数を持つフレームの中で最初のものをスタック内で検索し (前述の例では printit())、これに現在のスコープを設定します (「プログラムスコープ」を参照)。これは、矢印記号 (=>) によって示されます。

呼び出しスタックの詳細については、「イベント効率」を参照してください。