web-dev-qa-db-ja.com

Visual Studioデバッガーを使用して値が変更されたときにブレークする

変数にウォッチを配置し、その値が変更されたときにのみVisual Studioを中断させる方法はありますか?

トリッキーな状態の問題を見つけやすくなります。

これはできますか?

ブレークポイント条件には引き続きブレークポイントを設定する必要があり、ウォッチを設定して、Visual Studioに状態変化時にブレークポイントを設定させたいと思います。

185
FlySwat

Visual Studio 2005メニュー:

デバッグ-> 新しいブレークポイント-> 新しいデータブレークポイント

入る:

&myVariable
125
AShelly

コード内で明示的にブレークすることもできます。

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

MSDNから:

Debugger.Break:デバッガーがアタッチされていない場合、ユーザーはデバッガーをアタッチするかどうかを尋ねられます。はいの場合、デバッガーが開始されます。デバッガーが接続されている場合、デバッガーはユーザーブレークポイントイベントで通知され、デバッガーブレークポイントがヒットしたかのようにデバッガーはプロセスの実行を中断します。

ただし、これはフォールバックにすぎません。他のコメントで説明されているように、Visual Studioで条件付きブレークポイントを設定することをお勧めします。

27

本当に古い投稿ですが、誰かが気付いていない場合...

Visual Studio 2015では、自動実装プロパティのsetアクセサーにブレークポイントを配置でき、プロパティが更新されるとデバッガーが中断します

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

更新

または、 @AbdulRaufMujahidは、自動実装プロパティが単一行にある場合、get;またはset;にカーソルを置いてF9をヒットするとブレークポイントができることをコメントで指摘しています。それに応じて配置。いいね!

public bool IsUpdated { get; set; }
26
Craig

次の宣言を持つAというクラスがあるとします。

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

誰かが「m_value」の値を変更したときにプログラムを停止したい場合。

クラス定義に移動し、Aのコンストラクターにブレークポイントを配置します。

A::A()
{
    ... // set breakpoint here
}

プログラムを停止したら:

デバッグ->新しいブレークポイント->新しいデータブレークポイント...

アドレス:&(this-> m_value)
Byte Count: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* ); 

「呼び出しスタック」を見ると、変数の値を変更した関数を見ることができます。

13
momboco

変数をプロパティに変更し、setメソッドにブレークポイントを追加します。例:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}
9
Marcello

Visual Basic 6. を使用して説明した方法を覚えています。 Visual Studioでは、これまでに見つけた唯一の方法は、 ブレークポイント条件 を指定することです。

3
Gulzar Nazim

WPFを使用している場合、素晴らしいツールがあります: WPF Inspector

しかし、残念ながら、任意のプロパティまたは変数で同じことを実行できるツールは見つかりませんでした。

3
Julien N

ブレークポイントを右クリックするとうまく機能します(ほとんどの場合、特定の変数値の条件付きブレークポイントに使用しています。スレッド名を含む式のブレークでも機能します。

2
Oskar

ピーター・モーテンセンが書いたように:

Visual Studio 2005メニュー:

デバッグ->新しいブレークポイント->新しいデータブレークポイント

入力:&myVariable

追加情報:

明らかに、システムはメモリ内のどのアドレスを監視するかを知る必要があります。したがって-myVariable(またはmyClass.m_Variable)の初期化に通常のブレークポイントを設定します-システムを実行し、そのブレークポイントで停止するまで待ちます。 -これでメニューエントリが有効になり、&myVariableを入力して変数を監視したり、&myClass.m_Variableを入力してインスタンスを監視したりできます。これで、アドレスが適切に定義されました。

すでに与えられた解決策を説明することによって私が物事を間違えたとき、すみません。しかし、コメントを追加することはできませんでしたが、これに関するコメントがいくつかありました。

2
R Risack

オプションで変数の=演算子をオーバーロードし、特定の条件でオーバーロードされた関数内にブレークポイントを置くことができます。

1
PRIME

アンマネージコードでメモリウォッチポイントを使用できます。ただし、これらがマネージコードで使用可能かどうかはわかりません。

1

DebugBreak() 関数を巧妙に使用することができます。

1
wip

2019年の更新:

これは、.NET Core 3.0以降のVisual Studio 2019 Preview 2で正式にサポートされるようになりました。もちろん、IDEのプレビューバージョンを使用する場合の潜在的なリスクについては、いくつかの考えを置く必要があります。近い将来、これが公式のVisual Studioに含まれることになると思います。

https://blogs.msdn.Microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

幸いなことに、データブレークポイントは、Visual Studio 2019 Preview 2の.NET Core(3.0以降)で使用できるようになったため、C++専用ではなくなりました!

0
Matt