次: , 前: Set Breaks, 上: Breakpoints


5.1.2 ウォッチポイントの設定

ウォッチポイントを設定することで、 ある式の値が変化したときに、 プログラムの実行を停止させることができます。 その値の変更が、 プログラムのどの部分で行われるかをあらかじめ知っている必要はありません。

システムによって、 ウォッチポイントがソフトウェアによって実装されていることもあれば、 ハードウェアによって実装されていることもあります。 GDBは、 ユーザ・プログラムをシングル・ステップ実行して、 そのたびに変数の値をテストすることによって、 ソフトウェア・ウォッチポイントを実現しています。 これは、 通常の実行と比較すると、 何百倍も遅くなります。 (それでも、 プログラムのどの部分が問題を発生させたのか全く手掛りのない誤りを見つけることができるのであれば、 十分価値のあることかもしれません)。

HP-UXやLinuxのようなシステム上のGDBには、 ハードウェア・ウォッチポイントのサポートも組み込まれています。 これを使用すれば、 ユーザ・プログラムの実行が遅くなることはありません。

watch expr
exprで指定される式に対してウォッチポイントを設定します。 プログラムが式の値を書き換えるときに、 GDBはプログラムの実行を停止させます。


rwatch expr
exprで指定される対象が読み込みアクセスされるときにプログラムを停止させるウォッチポイントを設定します。 2つめのウォッチポイントとして設定するのであれば、 1つめのウォッチポイントもrwatchコマンドで設定されていなければなりません。


awatch expr
exprで指定される対象が読み込みアクセス、 書き込みアクセスされるときにプログラムを停止させるウォッチポイントを設定します。 2つめのウォッチポイントとして設定するのであれば、 1つめのウォッチポイントもawatchコマンドで設定されていなければなりません。


info watchpoints
ウォッチポイント、 ブレイクポイント、 キャッチポイントの一覧を表示します。 これは、 info breakと同じです。

GDBは、 可能であれば、 ハードウェア・ウォッチポイントを設定します。 ハードウェア・ウォッチポイントをセットした場合は高速な実行が可能であり、 デバッガは、 変更を引き起こした命令のところで、 値の変更を報告することができます。 ハードウェア・ウォッチポイントを設定できない場合、 GDBは、 ソフトウェア・ウォッチポイントを設定します。 これは、 実行速度も遅く、 値の変更は、 その変更が実際に発生した後に、 その変更を引き起こした命令のところではなく、 1つ後ろの文のところで報告されます

watchコマンドを実行すると、 ハードウェア・ウォッチポイントの設定が可能な場合には、 GDBは、 以下のような報告を行います。

     Hardware watchpoint num: expr

SPARClite DSUは、 デバッグ・レジスタに割り当てられた データ・アドレスや命令アドレスにプログラムがアクセスすると、 トラップを発生させます。 データ・アドレスについては、 DSUがwatchコマンドを支援しています。 しかし、 ハードウェアの提供するブレイクポイント・レジスタは、 データ・ウォッチポイントを2つまでしか取れず、 その2つは同じ種類のウォッチポイントでなければなりません。 例えば、 2つのウォッチポイントを、 両方ともwatchコマンドで設定すること、 両方ともrwatchコマンドで設定すること、 あるいは、 両方ともawatchコマンドで設定することは可能ですが、 それぞれを異なるコマンドで設定することはできません。 異なる種類のウォッチポイントを同時に設定しようとしても、 コマンドの実行をGDBが拒否します。 このような場合、 使用しないウォッチポイント・コマンドを削除または無効化してから、 新しいウォッチポイント・コマンドを設定してください。

printcallを使用して関数を対話的に呼び出すと、 それまでにセットされていたウォッチポイントはいずれも、 GDBが別の種類のブレイクポイントに到達するか、 あるいは、 関数の呼び出しが終了するまでの間は、 効果を持たなくなります。

注意: マルチスレッド・プログラムでは、 ウォッチポイントの有用性は限定されます。 現在のウォッチポイントの実装では、 GDBは、 単一スレッドの中 でしか式の値を監視することができません。 カレント・スレッドの処理の結果としてのみ、 その式の値が変更されること (かつ、 他のスレッドがカレント・スレッドにはならないこと) が確実であれば、 通常どおり、 ウォッチポイントを使用することができます。 しかし、 カレント・スレッド以外のスレッドが式の値を変更することがあると、 GDBは、 その変更に気付かないかもしれません。