dbx でデータ変更ブレークポイント (またはウォッチポイントと呼ばれる) を使用して、変数の値または式が変更されたときに注意することができます。
メモリーアドレスにアクセスされたときに実行を停止するには、stop access コマンドを使用します。
(dbx) stop access mode address-expression [, byte-size-expression]
mode はメモリーのアクセス方法を指定します。有効なオプションは:
指定したアドレスのメモリーが読み取られたことを示します。
メモリーへの書き込みが実行されたことを示します。
メモリーが実行されたことを示します。
さらに mode には、次のいずれかの文字も指定することができます。
アクセス後にプロセスを停止します (デフォルト)。
アクセス前にプロセスを停止します。
いずれの場合も、プログラムカウンタはアクセスしている命令をポイントします。「前」と「後」は副作用を指しています。
address-expression は、その評価によりアドレスを生成できる任意の式です。記号式を指定すると、監視対象領域のサイズが自動的に推定されます。byte-size-expression を指定して、それをオーバーライドすることができます。さらに、シンボルを使用しない、型を持たないアドレス式を使用することもできますが、その場合はサイズが必須です。
次の例では、コマンドはメモリーアドレス 0x4762 以降のいずれかの 4 バイトが読み取られたあとに実行を停止します。
(dbx) stop access r 0x4762, 4
次の例では、変数 speed に書き込みが行われる前に実行が停止します。
(dbx) stop access wb &speed
stop access コマンドを使用する場合、次の点に注意してください。
変数に同じ値が書き込まれてもイベントが発生します。
デフォルトにより、変数に書き込まれた命令の実行後にイベントが発生します。命令が実行される前にイベントを発生させるように指示するには、モードを b に指定します。
access イベントを指定する詳細については、access イベント指定および stop コマンドを参照してください。
指定した変数の値が変更された場合にプログラム実行を停止するには、stop change コマンドを使用します。
(dbx) stop change variable
stop change コマンドを使用する場合は、次の点に注意してください。
dbx は、指定した変数の値に変更が発生した行の次の行でプログラムを停止します。
variable が関数に対しローカルである場合、関数が初めて入力されて variable の記憶領域が割り当てられた時点で、変数に変更が生じたものとみなされます。パラメータについても同じことが言えます。
このコマンドは、マルチスレッドのアプリケーションに対し機能しません。
change イベントを指定する詳細については、change イベント指定および stop コマンドを参照してください。
dbx は、自動シングルステップを実行しながら、各ステップで値をチェックして、stop change を実装します。ライブラリが -g オプションでコンパイルされていない場合、ステップ実行においてライブラリの呼び出しが省略されます。そのため、制御が次のように流れる場合、dbx はネストされた user_routine2 をトレースしません。トレースでは、ライブラリの呼び出しとネストされた user_routine2 の呼び出しがスキップされるためです。
user_routine calls library_routine, which calls user_routine2, which changes variable
variable の値の変更は、user_routin2 が実行されている最中ではなく、ライブラリが呼び出しから戻ったあとに発生したように見えます。
dbx は、ブロック局所変数 ({} でネストされている変数) の変更に対しブレークポイントを設定できません。ネストされたブロック局所変数にブレークポイントまたはトレースを設定しようとすると、dbx はその操作を実行できない旨を通知するエラーメッセージを発行します。
stop cond コマンドを使用して、 条件文が true に評価された場合にプログラム実行を停止します。
(dbx) stop cond condition
条件が発生すると、プログラムは実行を停止します。
stop cond コマンドを使用する場合、次の点に注意してください。
dbx は、条件が true に評価された行の次の行でプログラムを停止します。
このコマンドは、マルチスレッドのアプリケーションに対し機能しません。
条件イベントを指定する詳細については、cond イベント指定および stop コマンドを参照してください。