dbx コマンドによるデバッグ

dbx での例外処理

プログラムは例外が発生すると実行を停止します。例外は、ゼロによる除算や配列のオーバーフローといったプログラムの障害を知らせるものです。例外を処理するには、ブロックを設定して、コードのどこかほかの場所で起こった式による例外を捕獲できます。

プログラムのデバッグ中、dbx を使用すると次のことが可能になります。

送出点での停止後に step を実行すると、制御はスタックの解放中に実行された最初のデストラクタの初めに返されます。スタックの解放中に実行されたデストラクタから step を実行して出ると、制御は次のデストラクタの初めに返されます。すべてのデストラクタが実行されたときに step を実行すると、送出を処理する捕獲ブロックに移動します。

例外処理コマンド

exception [-d|+d]

このコマンドは、例外の型を表示するために使用します。この変数は、デバッグ中いつでも使用することができます。-d を使用すると、派生型が示されます。-d を使用しないと静的な型が示されます。このコマンドは、dbxenv 変数 output_dynamic_type の設定を上書きします。

intercept [-a|-x|typename]

スタックを解放する前に、特定の型の例外を阻止または捕獲できます。このコマンドを引数を付けずに使用すると、阻止される型がリストで示されます。-a を使用すると、すべての送出が阻止されます。阻止リストに型を追加するには typename を使用します。-x を使用すると、特定の型を阻止から除外することができます。

たとえば、int を除くすべての型を阻止するには、次のように入力します。


(dbx) intercept -a
(dbx) intercept -x int

unintercept [-a|-x |typename]

このコマンドは、阻止リストから例外の型を削除するために使用します。引数を付けずにこのコマンドを使用すると、阻止されている型のリストが示されます (intercept に同じ)。-a を使用すると、リストから阻止された型すべてが削除されます。typename を使用すると、阻止リストから 1 つの型を削除することができます。-x は、特定の型を阻止から除外することをやめるために使用します。

whocatches typename

このコマンドは、typename の例外が実行の現時点で送出された場合に、どこで捕獲されるかを報告するものです。このコマンドは、例外がスタックのトップフレームから送出された場合に何が起こるかを検出する場合に使用します。

typename を捕獲した元の送出の行番号、関数名、およびフレーム数が表示されます。

例外処理の例

次の例は、例外を含むサンプルプログラムを使用して、dbx で例外処理がどのように実行されるかを示しています。型 int の例外が、関数 bar で送出されて、次の捕獲ブロックで捕獲されています。


1  #include <stdio.h>
2
3  class c {
4      int x;
5    public:
6      c(int i) { x = i; }
7      ‾c() { 
8			printf("destructor for c(%d)¥n", x); 
9		}
10  };
11
12  void bar() {
13      c c1(3);
14      throw(99);
15  }
16
17  int main() {
18      try {
19          c c2(5);
20          bar();
21          return 0;
22      }
23      catch (int i) {
24          printf("caught exception %d¥n", i);
25      }
26  }

サンプルプログラムからの次のトランスクリプトは、dbx の例外処理機能を示しています。


(dbx) intercept int
(dbx) intercept
-unhandled -unexpected int   
(dbx) stop in bar
(2) stop in bar(void)
(dbx) run
実行中: a.out 
(プロセス id 1652)
bar で停止しました 行番号 13  ファイル "foo.cc"
   13       c c1(3);
(dbx) whocatches int
int が行番号 24 で捕獲されました、関数 main (フレーム番号 2)
(dbx) whocatches c
dbx: class c の実行時型情報がありません (送出も捕獲もされていない)
(dbx) cont
例外の型 int が行番号 24 で捕獲されました、関数 main (フレーム番号 4)
_ex_dbg_will_throw で停止しました アドレス 0xef724344
0xef724344: _ex_dbg_will_throw       :	jmp     %o7 + 0x8
現関数 :bar
   14       throw(99);
(dbx) step
c::‾c で停止しました 行番号 8  ファイル "foo.cc"
    8   	   printf("destructor for c(%d)¥n", x);
(dbx) step
destructor for c(3)
c::‾c で停止しました 行番号 9  ファイル "foo.cc"
    9   	}
(dbx) step
c::‾c で停止しました 行番号 8  ファイル "foo.cc"
    8   	   printf("destructor for c(%d)¥n", x);
(dbx) step
destructor for c(5)
c::‾c で停止しました 行番号 9  ファイル "foo.cc"
    9   	}
(dbx) step
main で停止しました 行番号 24  ファイル "foo.cc"
   24   	printf("caught exception %d¥n", i);
(dbx) step
caught exception 99
main で停止しました 行番号 26  ファイル "foo.cc"
   26   }