変数にウォッチを配置し、その値が変更されたときにのみVisual Studioを中断させる方法はありますか?
トリッキーな状態の問題を見つけるのが非常に簡単になります。
これはできますか?
ブレークポイント条件にはブレークポイントセットが必要です。ウォッチを設定し、状態の変化時にVisual Studioにブレークポイントを設定させます。
変数にウォッチを配置し、その値が変更されたときにのみVisual Studioを中断させる方法はありますか?
トリッキーな状態の問題を見つけるのが非常に簡単になります。
これはできますか?
ブレークポイント条件にはブレークポイントセットが必要です。ウォッチを設定し、状態の変化時にVisual Studioにブレークポイントを設定させます。
回答:
Visual Studio 2005メニュー:
デバッグ -> 新しいブレークポイント -> 新しいデータブレークポイント
入る:
&myVariable
コードで明示的に中断することもできます。
// Assuming C#
if (condition)
{
System.Diagnostics.Debugger.Break();
}
MSDNから:
Debugger.Break:デバッガーが接続されていない場合、ユーザーはデバッガーを接続するかどうかを尋ねられます。はいの場合、デバッガーが開始されます。デバッガーが接続されている場合、デバッガーはユーザーブレークポイントイベントで通知され、デバッガーブレークポイントにヒットした場合と同様に、デバッガーはプロセスの実行を中断します。
ただし、これはフォールバックにすぎません。他のコメントで説明されているように、Visual Studioで条件付きブレークポイントを設定する方が適切です。
本当に古い投稿ですが、誰かが知らない場合に備えて...
Visual Studio 2015、あなたは上のブレークポイントを置くことができset
、自動実装プロパティのアクセサとプロパティが更新されたときにデバッガが解除されます
public bool IsUpdated
{
get;
set; //set breakpoint on this line
}
更新
あるいは; @AbdulRaufMujahidがコメントで指摘しているように、自動実装プロパティが1行にある場合、カーソルをget;
またはに置いてset;
ヒットするF9
と、ブレークポイントがそれに応じて配置されます。いいね!
public bool IsUpdated { get; set; }
次の宣言を含むAというクラスがあるとします。
class A
{
public:
A();
private:
int m_value;
};
誰かが「m_value」の値を変更したときにプログラムを停止したい。
クラス定義に移動し、Aのコンストラクターにブレークポイントを設定します。
A::A()
{
... // set breakpoint here
}
プログラムを停止したら:
デバッグ->新しいブレークポイント->新しいデータブレークポイント...
アドレス:&(this-> m_value)
バイト数:4(intは4バイトなので)
これでプログラムを再開できます。値が変更されると、デバッガーは停止します。
継承クラスまたは複合クラスでも同じことができます。
class B
{
private:
A m_a;
};
アドレス:&(this-> m_a.m_value)
検査する変数のバイト数がわからない場合は、sizeof演算子を使用できます。
例えば:
// to know the size of the word processor,
// if you want to inspect a pointer.
int wordTam = sizeof (void* );
「コールスタック」を見ると、変数の値を変更した関数を確認できます。
WPFを使用している場合は、WPF Inspectorというすばらしいツールがあります。
自身をWPFアプリにアタッチし、すべてのプロパティを含むコントロールのツリー全体を表示します。これにより、(特に)プロパティの変更を中断できます。
しかし、残念なことに、任意のプロパティまたは変数で同じことを実行できるツールが見つかりませんでした。
Visual Basic 6.0を使用して説明した方法を覚えています。Visual Studioでこれまでに見つけた唯一の方法は、ブレークポイント条件を指定することです。
ピーター・モーテンセンが書いたように:
Visual Studio 2005メニュー:
デバッグ->新しいブレークポイント->新しいデータブレークポイント
入力:&myVariable
追加情報:
明らかに、システムはメモリ内のどのアドレスを監視するかを知っている必要があります。したがって、通常のブレークポイントをmyVariable
(またはmyClass.m_Variable
)の初期化に設定します。システムを実行し、そのブレークポイントで停止するまで待ちます。-これでメニューエントリが有効になり、と入力して変数を監視し&myVariable
たり、次のように入力してインスタンスを監視したりできます&myClass.m_Variable
。これでアドレスが明確になりました。
すでに与えられた解決策を説明することによって私が間違ったことをしたとき申し訳ありません。しかし、私はコメントを加えることができませんでした、そしてこれに関していくつかのコメントがありました。
おそらく、DebugBreak()関数を上手に使用できます。
myVariable
が使用されている場所を追跡し、その値を使用後に補助previousValue
変数に格納し、次にDebugBreak()を呼び出すことができmyVariable!=previousValue
ます。次に、どのコードブロックmyVariable
が変更されたかがわかります。しかし、AShellyのソリューションが最善であることに同意します。
2019年の更新:
これは、.Net Core 3.0以降のVisual Studio 2019 Preview 2で正式にサポートされるようになりました。もちろん、IDEのプレビューバージョンを使用することの潜在的なリスクを考慮しなければならない場合もあります。近い将来、これは公式のVisual Studioに含まれると思います。
幸い、データブレークポイントは、Visual Studio 2019 Preview 2の.NET Core(3.0以降)で使用できるようになったため、C ++専用ではなくなりました。