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

印刷ビューの終了

更新: 2015 年 1 月
 
 

スタックトレースを表示して確認する

プログラムフローのどこで実行が停止し、この地点までどのように実行が到達したのかが、スタックトレースに示されます。スタックトレースは、プログラムの状態を、もっとも簡潔に記述したものです。

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

-g オプションでコンパイルされた関数の場合、引数の名前と種類が既知であるため、正確な値が表示されます。デバッグ情報を持たない関数の場合、16 進数が引数として表示されます。これらの数字に意味があるとはかぎりません。関数ポインタ 0 を介して関数が呼び出される場合、記号名の代わりに関数の値が下位 16 進数として示されます。

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

次の 例では、main()-g オプションを付けてコンパイルされているため、引数の値に加えてシンボリック名も表示されます。main() によって呼び出されたライブラリ関数は、-g を付けてコンパイルされていないため、関数のシンボリック名は表示されますが、SPARC入力レジスタ $i0 から $i5 の 16 進値の内容は引数として表示されます。

次の 例では、プログラムがセグメント例外により停止しています。原因は、SPARC 入力レジスタ $i0 内の strlen() への null 引数と考えられます。

(dbx) run
Running: Cdlib
(process id 6723)

CD Library Statistics:

 Titles:         1

 Total time:     0:00:00
 Average time:   0:00:00

signal SEGV (no mapping at the fault address) in strlen at 0xff2b6c5c
0xff2b6c5c: strlen+0x0080:    ld      [%o1], %o2
Current function is main
(dbx) where
  [1] strlen(0x0, 0x0, 0x11795, 0x7efefeff, 0x81010100, 0xff339323), at 0xff2b6c5c
  [2] _doprnt(0x11799, 0x0, 0x0, 0x0, 0x0, 0xff00), at 0xff2fec18
  [3] printf(0x11784, 0xff336264, 0xff336274, 0xff339b94, 0xff331f98, 0xff00), at 0xff300780
=>[4] main(argc = 1, argv = 0xffbef894), line 133 in "Cdlib.c"
(dbx)

スタックトレースの例については、呼び出しスタックを確認するおよび呼び出しのトレースを参照してください。