プログラムは例外が発生すると実行を停止します。例外は、ゼロによる除算や配列のオーバーフローといったプログラムの障害を知らせるものです。例外を処理するには、ブロックを設定して、コードのどこかほかの場所で起こった式による例外を捕獲できます。
プログラムのデバッグ中、dbx を使用すると次のことが可能になります。
スタックを解放する前に処理されていない例外を捕獲する
予期できない例外を捕獲する
スタックを解放する前に、特定の例外が処理されたかどうかに関係なく捕獲する
特定の throw がプログラム内の特定の位置で起こった場合、それが捕獲される場所を決める
送出点での停止後に step を実行すると、制御はスタックの解放中に実行された最初のデストラクタの初めに返されます。スタックの解放中に実行されたデストラクタから step を実行して出ると、制御は次のデストラクタの初めに返されます。すべてのデストラクタが実行されたときに step を実行すると、送出を処理する捕獲ブロックに移動します。
このコマンドは、例外の型を表示するために使用します。この変数は、デバッグ中いつでも使用することができます。-d を使用すると、派生型が示されます。-d を使用しないと静的な型が示されます。このコマンドは、dbxenv 変数 output_dynamic_type の設定を上書きします。
スタックを解放する前に、特定の型の例外を阻止または捕獲できます。このコマンドを引数を付けずに使用すると、阻止される型がリストで示されます。-a を使用すると、すべての送出が阻止されます。阻止リストに型を追加するには typename を使用します。-x を使用すると、特定の型を阻止から除外することができます。
たとえば、int を除くすべての型を阻止するには、次のように入力します。
(dbx) intercept -a (dbx) intercept -x int
このコマンドは、阻止リストから例外の型を削除するために使用します。引数を付けずにこのコマンドを使用すると、阻止されている型のリストが示されます (intercept に同じ)。-a を使用すると、リストから阻止された型すべてが削除されます。typename を使用すると、阻止リストから 1 つの型を削除することができます。-x は、特定の型を阻止から除外することをやめるために使用します。
このコマンドは、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 }