プライベートメンバ変数が値を変更すると、Visual Studioのデバッガで実行をIをどのように停止することができますか?
-
21-08-2019 - |
質問
のは、私のクラスは、カウントと呼ばれるプライベート整数変数を持っているとしましょう。
私はすでに私のコードにブレークポイントにヒットしました。私は続け押す前に今、私は、デバッガがいつでもカウントがそれに割り当てられた新しい値を取得しなくなりますので、それを作りたい。
フィールドに数を促進し、フィールドの設定方法にブレークポイントを設定するだけでなく、これを行うための他の方法はありますか?
解決
あなたが探しているのは、マネージコードでは不可能です。 C ++では、これはデータブレークポイントとして知られています。これは、メモリのブロックが実行されるプログラムによって変更されるたびに、あなたが破損することができます。しかし、これは純粋なネイティブのC ++コードでのみ使用可能です。
これが実装されていない理由のショートバージョンが、それは、マネージコードではるかに困難だということです。ネイティブコードは素晴らしく、予測可能です。あなたは、メモリを作成し、新しいオブジェクトを作成(または明示的にメモリをコピー)しない限り、それは周りに移動しません。
それはごみ収集の言語だからマネージドコードは、はるかに複雑です。 CLRは、一般的にメモリに周りのオブジェクトを移動します。したがって、単にメモリのビットを見ていることは十分ではありません。これは、GCの相互作用を必要とします。
これは単に管理ブレークポイントを実装すると問題の一つです。
他のヒント
私はあなたが値の変化がどこから来たのか見てみたいので、あなたがこれを行うにしようとしていると仮定します。あなたはすでに私はいつもそれをやった方法次のように述べています。(あなたは、常に動作するように、このために、そのセットのアクセサを使用しなければならないことを除いて)プロパティを作成し、setアクセサでブレークを
基本的に、私はプライベートフィールド以来、プライベートフィールドが破壊可能な命令ではないので、あなたがそれを壊すことができない唯一のストレージであることを言うと思います。
私はこれを行うのですか考えることができる唯一の方法は、変数を右クリックし、「すべての参照を検索する」を選択することです。それはすべての参照を見つけたら、変数に値が割り当てられているコード内の各ポイントで新しいブレークポイントを作成することができます。これは、可能性の高い仕事かなりよく、あなたが別の関数を参照することにより、変数の中に通過させ、そこに値を変更した場合を除きます。その場合、あなたはそれが変わったときに見にメモリ内の特定のポイントを見ていくつかの方法が必要に思います。私は、このようなツールはVSに存在するかどうかわからないんだけど。
のようにChrisWはコメントしています。あなたは、「データブレークポイント」だけネイティブのための(非管理)のコードを設定することができます。ガベージコレクタは、ガベージコレクタの実行時に周りを割り当てられたメモリ・ブロックを移動します。このように、データブレークポイントは、マネージコードのために可能ではありません。
それ以外の場合は、なし。あなたは「を変更でブレーク」したいあなたの商品へのアクセスをカプセル化しなければなりません。すでにそのプライベートメンバ以来、私はその使用場所にブレークポイントを設定するKibbeeの提案を、次のことをお勧めします。
フィールドに数を促進し、フィールドの設定方法にブレークポイントを設定するだけでなく、これを行うための他の方法はありますか?
、それを別のクラスのプロパティを作成したクラスのインスタンスを作成し、プロパティにブレークポイントを設定します。
の代わりに...
test()
{
int i = 3;
...etc...
i = 4;
}
...が...
class Int
{
int m;
internal Int(int i) { m = i; }
internal val { set { m = value; } get { return m; } }
}
test()
{
Int i = new Int(3);
...etc...
i.val = 4;
}
、したがって、デバッガが簡単にレジスタをデバッグするCPUの「メモリ・アクセスのブレーク」を使用することはできません、それはへのデバッガのために簡単です:のものはC#を使用して、すべての実際のメモリ位置が絶えず移動している、ということです代わりに、コード位置のブレークポイントを実装します。