dbx セッション中にブレークポイントやトレースポイントを複数設定することがよくあります。dbx には、それらのポイントを表示したりクリアしたりするためのコマンドが用意されています。
すべての有効なブレークポイントのリストを表示するには、status コマンドを使用します。ブレークポイントは ID 番号付きで表示され、この番号はほかのコマンドで使用できます。
C++ の多重ブレークポイントのところでも説明したように、dbx はキーワード inmember、inclass、infunction で設定された多重ブレークポイントを、1 つのステータス ID 番号を使用してまとめて報告します。
status コマンドを使用してブレークポイントをリスト表示した場合、dbx は、各ブレークポイントの作成時に割り当てられた ID 番号を表示します。 delete コマンドを使用することで、ID 番号によってブレークポイントを削除したり、キーワード all により、プログラム内のあらゆる場所に現在設定されているブレークポイントをすべて削除することができます。
ブレークポイントを ID 番号 ID_number によって削除するには、次のように入力します。
(dbx) delete 3 5
dbx に現在読み込まれているプログラムに設定されているすべてのブレークポイントを削除するには、次のように入力します。
(dbx) delete all
ウォッチポイントは、変数または式の値が変化したときにイベントを発生させる dbx の一般的な機能です。
アドレスの内容に書き込みが行われたときにプログラムの実行を停止するには、次のように入力します。
(dbx) stop modify & variable
stop modify を使用するときの注意事項
変数 variable にそれまで設定されていた値と同じ値が書き込まれた場合でもイベントは発生します。
dbx が命令をエミュレートすることによって、メモリーに新しい内容が設定された場合でも、変数への書き込みを行なった命令が実行される前にイベントが発生します。
関数に局所的な自動変数など、スタック変数のアドレスを使用することはできません。
指定した変数の値が変化したときにプログラムの実行を停止するには、次のように入力します。
(dbx) stop change variable
stop change を使用するときの注意事項
dbx は、指定された変数の値に変更があった行の後ろの行でプログラムを停止します。
変数が関数の局所変数の場合、その関数に最初に制御が移り、変数のための記憶領域が割り当てられた時点で変更があったと見なします。パラメータについても、同じことが言えます。
dbx は、自動的なステップ実行を行い、各ステップで値を検査することによって stop change を実現しています。ステップ実行では、ライブラリ呼び出しは飛ばされます。したがって、制御の流れが次のようになっているとき、
user_routine calls library_routine, which calls user_routine2, which changes variable
dbx は入れ子になった user_routine2 をトレースしません。トレース時にライブラリ呼び出しと user_routine2 の呼び出しがスキップされるため、入れ子になった呼び出しをトレースしません。この結果、変数の値は user_routine2 ルーチンの中ではなく、ライブラリ呼び出しから戻った後に変更されたように示されます。
ブロック局所変数、すなわち、{} 内で定義された変数の変化に対するブレークポイントは設定できません。このような変数にブレークポイント (またはトレース) を設定しようとすると、その操作ができないことを示すエラーメッセージが出されます。
条件文が真になったときにプログラムの実行を停止するには、次のように入力します。
(dbx) stop cond condition
ウォッチポイントは、modify コマンドを使用すると簡単に設定できます。このコマンドは、プログラムを自動的にステップ実行する代わりに、はるかに高速のページ保護構造を使用します。処理速度は、デバッグ中のプログラムのシステム呼び出し率だけでなく、監視中の変数の存在するページが何回修正されるかによって異なります。