dbx でデータ変更ブレークポイントを使用すると、変数値や式がいつ変更されたかをメモしておくことができます。
特定のメモリーアドレスがアクセスされたときにプログラムを停止するには、次のように入力します。
(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 mode address-expression [, byte-size-expression ]」および 「stop コマンド」を参照してください。
指定した変数の値が変更された場合にプログラム実行を停止するには、次のように入力します。
(dbx) stop change variable |
stop change コマンドを使用する場合、次の点に注意してください。
dbx は、指定の変数の値に変更が発生した行の次の行でプログラムを停止します。
variable が関数に対しローカルである場合、関数が初めて入力されて variable の記憶領域が割り当てられた時点で、変数に変更が生じたものとみなされます。パラメータについても同じことが言えます。
このコマンドは、マルチスレッドのアプリケーションに対し機能しません。
change イベントを指定する詳細については、「change variable」 および 「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 は、ブロック局所変数 ({} でネストされている変数) の変更に対しブレークポイントを設定できません。「ネスト」されたブロック局所変数でブレークポイントまたはトレースを設定しようとすると、その操作を実行できない旨を伝えるエラーメッセージが表示されます。
change イベントよりも access イベントを使用した方が、迅速にデータ変更をチェックできます。自動的にプログラムのシングルステップを実行する代わりに、access イベントはハードウェアまたはオペレーティングシステムのはるかに高速なサービスを利用します。
条件文が真と評価された場合にプログラムを停止するには、次のように入力します。
(dbx) stop cond condition |
condition が発生すると、プログラムは処理を停止します。
stop cond コマンドを使用する場合、次の点に注意してください。
dbx は、条件が真と評価された行の「次」の行でプログラムを停止します。
このコマンドは、マルチスレッドのアプリケーションに対し機能しません。
condition イベントを指定する詳細については、「cond condition-expression」 および 「stop コマンド」を参照してください。