9

変数値の変更時にブレークポイントを設定できるかどうか疑問に思っています (任意のプログラミング言語とツールで)。

たとえば、「変数「a」の値が変更されると、どこでも停止します」と言いたいです。

条件ブレークポイントを設定し、変数に特定の値がある場合に実行を停止する機能があることは知っていますが、変数の変更を監視することについては聞いていません。

できない場合、その理由は?

4

2 に答える 2

8

私の経験では、「メモリ ブレークポイント」または「メモリ ウォッチ ポイント」を使用してこれを実現できます。たとえば、gdb は次のように動作します: GDB の「メモリ アクセス」にブレークポイントを設定できますか?

書き込みウォッチポイントで見た限りでは、新しい値が古い値と等しいかどうかに関係なく、aがに書き込まれるとブレークが実際にトリガーされます。したがって、「変更された」が本当に「変更された」という意味である場合、例は少なくなります。書き込みウォッチポイントを実装していると仮定すると、変更のみのウォッチポイントを実装することが技術的に難しいとは思いませんが、おそらく何もありません。

一部の言語では、変数の種類によって違いが生じますa。たとえば、C または C++ では、最適化が有効になっている場合、変数をレジスタに「持ち上げる」ことができます。この場合、変数のアドレスのハードウェア メモリ ウォッチポイントは必ずしもすべての変更をキャッチするとは限りません。

スタック上の変数にも制限があります。関数が終了してもウォッチポイントがまだ設定されている場合、別の関数の別の変数に使用されている同じアドレスへのアクセスをキャッチする可能性があります。関数が後で (または再帰的に) 再度呼び出される場合、必ずしも同じスタック位置から開始するとは限りません。そうでない場合、ウォッチポイントは別の場所にある「同じ」変数へのアクセスをキャッチできません。

「コードの特定の行で特定の条件が真の場合に停止する」は、私の経験では「条件付きブレークポイント」と呼ばれます。一般に、別のメカニズムを使用します。デバッガーは、そのコード行にブレークポイント命令を配置する可能性が最も高いです。トリガーされるたびに、デバッガーは条件をチェックし、false の場合は実行を継続します。

于 2012-09-25T08:24:19.837 に答える
3

一部のプロセッサは、アドレスの読み取りまたは書き込み時にブレークするハードウェアブレークポイントをサポートしています。たとえば、アドレス0x10005060に4バイトの変数がある場合、次のようなハードウェアブレークポイントを設定できます(windbgを使用):baw40x10005060。4バイトのいずれかが書き込まれると、プロセッサが破損します。次のコマンドは、これらの4バイトのいずれかが読み取りまたは書き込み時にブレークするようにプロセッサに指示します:bar40x10005060。

于 2012-09-25T13:20:13.113 に答える