次: , 前: Disabling, 上: Breakpoints


5.1.6 ブレイクポイントの成立条件

最も単純なブレイクポイントは、 指定された箇所にプログラムが到達するたびに、 プログラムの実行を停止させます。 ブレイクポイントに対して条件を指定することも可能です。 ここで、 「条件」とは、 プログラムが記述された言語で表現された真偽値を表す式のことです (see Expressions)。 条件付きのブレイクポイントにプログラムが到達するたびに、 その式が評価されます。 そして、 その結果がであった場合だけ、 プログラムは停止します。

これは、 プログラムの正当性を検査するために診断式を使用するのとは逆になります。 診断式の場合は、 成立しないとき、 すなわち条件が偽であるときに、 プログラムを停止させます。 C言語でassertという診断式をテストするためには、 しかるべきブレイクポイントに`assert'という条件を設定します。

ウォッチポイントに対して条件を設定することもできます。 もともとウォッチポイントは、 ある式の値を検査するものですから、 これは必要ないかもしれません。 しかし、 ある変数の新しい値がある特定の値に等しいか否かを検査するのは条件式のほうに任せて、 ウォッチポイントの対象そのものは単にその変数の名前にしてしまうという設定の方が簡単でしょう。

ブレイクポイントの成立条件に副作用を持たせたり、 場合によってはプログラム内部の関数を呼び出させたりすることもできます。 プログラムの進行状況をログに取る関数を呼び出したり、 特別なデータ構造をフォーマットして表示するユーザ定義の関数を使用したい場合などに便利です。 この効果は、 同じアドレスに有効なブレイクポイントが別に設定されていない限り、 完全に予測可能です (別のブレイクポイントが設定されていると、 GDBはこのブレイクポイントを先に検出し、 他のブレイクポイントで設定した条件式をチェックすることなくプログラムを停止させてしまうかもしれません)。 あるブレイクポイントに到達したときに、 副作用を持つ処理を実行させるためには、 ブレイクポイント・コマンドの方がより便利であり、 より柔軟でしょう (see Breakpoint command lists)。

ブレイクポイントの成立条件は、 ブレイクポイントを設定する際に、 breakコマンドの引数に`if'を使用することによって、 設定できます。 See Setting breakpoints。 ブレイクポイントの成立条件は、 conditionコマンドによっていつでも変更できます。 watchコマンドは、 ifキーワードを認識しません。 ウォッチポイントに対して条件を追加設定する唯一の方法は、 conditionコマンドを使うことです。

condition bnum expression
bnumで指定される番号のブレイクポイント、 ウォッチポイント、 キャッチポイントの成立条件として、 expressionを指定します。 条件を設定した後、 番号bnumのブレイクポイントは、 expressionの値が真 (C言語の場合はゼロ以外の値) であるときのみ、 ユーザ・プログラムを停止させます。 conditionコマンドを使用すると、 GDBはただちにexpressionの構文の正当性、 および、 expressionの中で使用されるシンボル参照の、 ブレイクポイントのコンテキストにおける有効性をチェックします。 しかし、 conditionコマンドが実行されるときに、 expressionの値がGDBによって実際に評価されるわけではありません。 See Expressions
condition bnum
bnumで指定される番号のブレイクポイントから条件を削除します。 実行後、 それは通常の無条件ブレイクポイントになります。

ブレイクポイント成立条件の特別なものに、 ブレイクポイントに到達した回数がある数に達したときにプログラムを停止させるというものがあります。 これは大変便利なので、 それを実現するための特別な方法が提供されています。 それは、 ブレイクポイントの通過カウント (ignore count) を使用する方法です。 すべてのブレイクポイントは、 通過カウントと呼ばれる整数値を持っています。 ほとんどの場合、 この通過カウントの値はゼロであり、 何ら影響力を持ちません。 しかし、 通過カウントとして正の値を持つブレイクポイントに到達すると、 ユーザ・プログラムはそこで停止せず、 単に通過カウントの値を1減少させて処理を継続します。 したがって、 通過カウントがnであると、 ユーザ・プログラムがそのブレイクポイントに到達した回数がn以下の間は、 そのブレイクポイントにおいてプログラムは停止しません。

ignore bnum count
bnumで指定される番号のブレイクポイントの通過カウントをcountで指定される値に設定します。 ブレイクポイントへの到達回数がcount以下の間、 ユーザ・プログラムは停止しません。 この間、 GDBは、 通過カウントの値を1減少させる以外には何もしません。

次にブレイクポイントに到達したときにプログラムを停止させるには、 countにゼロを指定してください。

ブレイクポイントで停止した後にcontinueコマンドを使用して実行を再開する場合、 ignoreコマンドを使用することなく、 直接continueコマンドの引数に通過カウントを指定することができます。 See Continuing and stepping

ブレイクポイントが通過カウントとして正の値を持ち、 かつ、 成立条件を持つ場合、 成立条件はチェックされません。 通過カウントが0に達すると、 GDBは成立条件のチェックを再開します。

`$foo-- <= 0'のように、 評価のたびに値の減少するコンビニエンス変数を使用した評価式によって、 通過カウントと同様の効果を達成することができます。 See Convenience variables

通過カウントは、 ブレイクポイント、 ウォッチポイント、 キャッチポイントに適用されます。