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

印刷ビューの終了

更新: 2015 年 1 月
 
 

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

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

スタックトレースを表示するには、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 入力レジスタの内容を示しています。プログラムをステップ実行するに示されていた例では printf に 2 つの引数しか渡されなかったため、意味があるのは $i0 から $i1 のレジスタの内容だけです。

-g オプションを使ってコンパイルされなかった関数の中でも停止することができます。このような関数内で停止すると、dbx はスタックを下方向に検索して -g オプションでコンパイルされた関数 (この場合は printit()) を含む最初のフレームを見つけ、現在のスコープをそのフレームに設定します。これは、矢印記号 (=>) によって示されます。

呼び出しスタックの詳細については、効率性に関する考慮事項を参照してください。現在のスコープの詳細については、プログラムスコープを参照してください。