Next: , Previous: Set Watchpoints, Up: Breakpoints


5.1.3 キャッチポイントの設定

キャッチポイントを使用することによって、 C++例外や共用ライブラリのローディングのような、 ある種のプログラム・イベントが発生したときに、 デバッガを停止させることができます。 キャッチポイントを設定するには、 catchコマンドを使用します。

catch event
eventで指定されるイベントが発生したときに 停止します。 eventは、 以下のいずれかです。
throw
C++例外の発生。
catch
C++例外のキャッチ。
exec
execの呼び出し。 現在これは、 HP-UXにおいてのみ利用可能です。
fork
forkの呼び出し。 現在これは、 HP-UXにおいてのみ利用可能です。
vfork
vforkの呼び出し。 現在これは、 HP-UXにおいてのみ利用可能です。
load
load libname
任意の共用ライブラリの動的なローディング、 あるいは、 libnameで指定されるライブラリのローディング。 現在これは、 HP-UXにおいてのみ利用可能です。
unload
unload libname
動的にロードされた任意の共用ライブラリのアンローディング、 あるいは、 libnameで指定されるライブラリのアンローディング。 現在これは、 HP-UXにおいてのみ利用可能です。

tcatch event
1回だけ停止させるキャッチポイントを設定します。 最初にイベントが捕捉された後に、 キャッチポイントは自動的に削除されます。

カレントなキャッチポイントの一覧を表示するには、 info breakコマンドを使用します。

現在、 GDBにおけるC++の例外処理 (catch throwcatch catch) にはいくつかの制限があります。

catchコマンドが、 例外処理をデバッグする手段としては最適なものではないような場合もあります。 どこで例外が発生したのかを正確に知りたい場合、 例外ハンドラが呼び出されるにプログラムを停止させた方がよいでしょう。 なぜなら、 スタック・ポインタの調整が行われる前のスタックの状態を見ることができるからです。 例外ハンドラの内部にブレイクポイントを設定してしまうと、 どこで例外が発生したのかを調べるのは簡単ではないでしょう。

例外ハンドラが呼び出される直前で停止させるには、 実装に関する知識が若干必要になります。 gnu C++の場合、 以下のようなANSI Cインターフェイスを持つ __raise_exceptionというライブラリ関数を呼び出すことで例外を発生させます。

         /* addrは例外識別子が格納される領域
            idは例外識別子 */
         void __raise_exception (void **addr, void *id);

スタック・ポインタの調整が行われる前に、 すべての例外をデバッガにキャッチさせるには、 __raise_exceptionにブレイクポイントを設定します (see Breakpoints; watchpoints; and exceptions)。

idの値に依存する条件を付けたブレイクポイント (see Conditions) を使用することで、 特定の例外が発生したときにだけユーザ・プログラムを停止させることができます。 複数の条件付きブレイクポイントを設定することで、 複数の例外の中のどれかが発生したときにユーザ・プログラムを停止させることもできます。