5

私のクラスにcountというプライベート整数変数があるとしましょう。

コードですでにブレークポイントに到達しています。続行を押す前に、カウントが新しい値を割り当てられるたびにデバッガーが停止するようにします。

フィールドへのカウントを促進し、フィールドのsetメソッドにブレークポイントを設定する以外に、これを行う他の方法はありますか?

4

5 に答える 5

3

あなたが探しているものは、マネージド コードでは不可能です。C++ では、これはデータ ブレーク ポイントとして知られています。実行中のプログラムによってメモリのブロックが変更されるたびに、ブレークすることができます。ただし、これは純粋なネイティブ C++ コードでのみ使用できます。

これが実装されていない理由の簡単なバージョンは、マネージ コードでははるかに難しいということです。ネイティブ コードは素晴らしく、予測可能です。メモリを作成すると、新しいオブジェクトを作成しない限り (またはメモリを明示的にコピーしない限り)、移動しません。

マネージ コードはガベージ コレクション言語であるため、はるかに複雑です。CLR は通常、オブジェクトをメモリ内で移動します。したがって、メモリの一部を監視するだけでは十分ではありません。GC インタラクションが必要です。

これは、マネージド ブレーク ポイントの実装に関する問題の 1 つにすぎません。

于 2009-02-06T05:43:50.803 に答える
0

ChrisWがコメントしたように。「データブレークポイント」を設定できますが、ネイティブ(管理されていない)コードに対してのみ設定できます。ガベージコレクターは、ガベージコレクターの実行時に、割り当てられたメモリブロックを移動します。したがって、マネージコードではデータブレークポイントを使用できません。

そうでなければ、いいえ。「変更時に中断」するアイテムへのアクセスをカプセル化する必要があります。すでにプライベートメンバーなので、使用する場所にブレークポイントを設定するというKibbeeの提案に従うことをお勧めします。

于 2009-02-05T18:24:45.090 に答える
0

値の変化がどこから来たのかを見たいので、これをやろうとしていると思います。プロパティを作成し、set アクセサーで中断するという、私がいつも行ってきた方法を既に述べました (ただし、これを機能させるには、常にその set アクセサーを使用する必要があります)。

基本的に、プライベート フィールドはストレージにすぎないため、ブレークすることはできません。プライベート フィールドはブレーク可能な命令ではないためです。

于 2009-02-05T18:03:53.680 に答える
0

私が考えることができる唯一の方法は、変数を右クリックして「すべての参照を検索」を選択することです。すべての参照が見つかったら、変数に値が割り当てられているコード内の各ポイントに新しいブレークポイントを作成できます。別の関数への参照によって変数を渡し、そこで値を変更しない限り、これはおそらくかなりうまくいくでしょう。その場合、メモリ内の特定のポイントを監視して、いつ変更されたかを確認する方法が必要になります。そのようなツールがVSに存在するかどうかはわかりません。

于 2009-02-05T18:12:20.357 に答える