次の方法で共有


ウォッチ ウィンドウとクイック ウォッチを使用して変数をウォッチする

デバッグ中は、 ウォッチ ウィンドウと クイック ウォッチ を使用して変数と式を監視できます。 ウィンドウは、デバッグ セッション中にのみ使用できます。

ウォッチ ウィンドウでは、デバッグ中に一度に複数の変数を表示できます。 [クイック ウォッチ] ダイアログには一度に 1 つの変数が表示され、デバッグを続行する前に閉じる必要があります。 クイック ウォッチの使用方法の詳細については、「クイック ウォッチで 1 つの変数または式を観察する」を参照してください。

コードのデバッグを初めて使用する場合は、この記事を読む前に、 初心者向けのデバッグデバッグの手法とツール を読んでください。

ウォッチ ウィンドウで変数を観察する

複数のウォッチ ウィンドウを開き、 ウォッチ ウィンドウで複数の変数を 観察 できます。

たとえば、次のコードで ab、および c の値にウォッチを設定するには、

int main()
{
    int a, b, c;
    a = 1;
    b = 2;
    c = 0;

    for (int i = 0; i < 10; i++)
    {
        a++;
        b *= 2;
        c = a + b;
    }

    return 0;
}

  1. c = a + b;行にブレークポイントを設定するには、左余白をクリックするか、デバッグ>Toggle ブレークポイントを選択するか、F9 キーを押します。

  2. 緑色の [開始] 矢印または [デバッグ] [>の開始] を選択してデバッグを開始するか、F5 キーを押します。 ブレークポイントで実行が一時停止します。

  3. [デバッグ]>Watch>Watch> を選択するか、CtrlAlt+W+1>を押してウォッチ ウィンドウを開きます。

    ウィンドウ 23、または 4 を選択すると、その他のウォッチ ウィンドウを開くことができます。

  4. [ ウォッチ ] ウィンドウで、空の行を選択し、変数 aを入力します。 bcに対して同じ操作を行います。

    ウォッチ変数のスクリーンショット。

  5. デバッグ>ステップ インを選択するか、必要に応じて F11 キーを押してデバッグを続行します。 ループを反復処理すると、[for] ウィンドウの変数値が変わります。

C++ の場合のみ、

  • 変数名のコンテキスト、または変数名を使用する式を修飾することが必要になる場合があります。 コンテキストは、変数が配置されている関数、ソース ファイル、またはモジュールです。 コンテキストを修飾する必要がある場合は、[ウォッチ] ウィンドウの [名前]コンテキスト演算子 (C++) 構文を使用します。

  • < を使用して、[>] ウィンドウの [名前] にレジスタ<と変数名を追加できます。 詳細については、「 擬似変数」を参照してください。

ウォッチ ウィンドウで式を使用する

デバッガーによって認識される有効な式は、[ ウォッチ ] ウィンドウで確認できます。

たとえば、前のセクションのコードでは、[(a + b + c) / 3] ウィンドウに「」と入力すると、3 つの値の平均を取得できます。

** ウォッチエクスプレッションのスクリーンショット。

ウォッチ ウィンドウで式を評価する規則は、通常、コード言語で式を評価する規則と同じです。 式に構文エラーがある場合は、コード エディターと同じコンパイラ エラーが発生します。 たとえば、前の式に入力ミスがある場合、[ ウォッチ ] ウィンドウで次のエラーが発生します。

ウォッチ式評価エラーのスクリーンショット。

2 つの波線アイコンを持つ円が ウォッチ ウィンドウに表示される場合があります。 このアイコンは、スレッド間の依存関係が発生する可能性があるため、デバッガーが式を評価しないことを意味します。 コードを評価するには、アプリ内の他のスレッドを一時的に実行する必要がありますが、中断モードになっているため、通常、アプリ内のすべてのスレッドは停止されます。 他のスレッドの一時的な実行を許可すると、アプリの状態に予期しない影響を与える可能性があり、デバッガーはブレークポイントやそれらのスレッドの例外などのイベントを無視する可能性があります。

[ウォッチ] ウィンドウで検索する

各ウィンドウの上にある検索バーを使用して、[ ウォッチ ] ウィンドウの [名前]、[値]、[種類] 列でキーワードを検索できます。 Enter キーを押すか、矢印のいずれかを選択して検索を実行します。 継続的な検索をキャンセルするには、検索バーの [x] アイコンを選択します。

見つかった一致の間を移動するには、左右の矢印 (それぞれ Shift + F3 と F3) を使用します。

ウォッチ ウィンドウでの検索のスクリーンショット。

検索を詳細に行うには、[ウォッチ] ウィンドウの上部にある [詳細検索] ドロップダウンを使用して、入れ子になったオブジェクトを検索する深さのレベルを選択します。

ウォッチ ウィンドウでプロパティをピン留めする

この機能は、.NET Core 3.0 以降でサポートされています。

ピン留め可能なプロパティ ツールを使用すると、[ウォッチ] ウィンドウでオブジェクトのプロパティをすばやく調べることができます。 このツールを使用するには、プロパティにカーソルを合わせ、表示されるピン アイコンを選択するか、右クリックして、結果のコンテキスト メニューで [ メンバーをお気に入りにピン留め する] オプションを選択します。 このアクションにより、そのプロパティがオブジェクトのプロパティ リストの一番上にバブルアップされ、プロパティの名前と値が [値] 列に表示されます。 プロパティのピン留めを外すには、もう一度ピン アイコンを選択するか、コンテキスト メニューの [ メンバーをお気に入りとしてピン留め解除 ] オプションを選択します。

[ウォッチ] ウィンドウの [プロパティのピン留め] のスクリーンショット。

ウォッチ ウィンドウでオブジェクトのプロパティ リストを表示するときに、プロパティ名を切り替え、固定されていないプロパティを除外することもできます。 両方のオプションにアクセスするには、ウォッチ ウィンドウの上にあるツール バーのボタンを選択します。

ウォッチの値を更新する

式が評価されると、更新アイコン (円形の矢印) が ウォッチ ウィンドウに表示されることがあります。 更新アイコンは、エラーまたは古い値を示します。

値を更新するには、更新アイコンを選択するか、Space キーを押します。 デバッガーは式の再評価を試みます。 ただし、値が評価されなかった理由によっては、式を再評価したくない、または再評価できない場合があります。

更新アイコンにカーソルを合わせるか、 列を確認して式が評価されなかった理由を確認します。 理由は次のとおりです。

  • 前の例のように、式の評価中にエラーが発生しました。 タイムアウトが発生したり、変数がスコープ外になったりする可能性があります。

  • 式には、アプリで副作用をトリガーする可能性がある関数呼び出しがあります。 「 式の副作用」を参照してください。

  • プロパティと暗黙的な関数呼び出しの自動評価は無効になっています。

プロパティの自動評価と暗黙的な関数呼び出しが無効になっているために更新アイコンが表示される場合は、[ ツール>オプション ] メニューからデバッグ設定を更新できます。

更新アイコンの使用方法を示すには:

  1. [ツール] (または [デバッグ] >[オプション] ウィンドウの [>>] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオフにします。
  1. [ツール] (または [デバッグ] >[オプション] ダイアログの [デバッグ>General] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオフにします。
  1. 次のコードを入力し、[ ウォッチ ] ウィンドウで、 list.Count プロパティにウォッチを設定します。

    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        list.Add("hello");
        list.Add("goodbye");
    }
    
  2. デバッグを開始します。 [ウォッチ] ウィンドウには、次のようなメッセージが表示されます。

    ウォッチの更新のスクリーンショット。

  3. 値を更新するには、更新アイコンを選択するか、Space キーを押します。 検証:デバッガーは式を再評価します。

式の副作用

一部の式を評価すると、変数の値が変更されたり、アプリの状態に影響を与えたりする可能性があります。 たとえば、次の式を評価すると、 var1の値が変更されます。

var1 = var2

このコードは 副作用を引き起こす可能性があります。 副作用により、アプリの動作方法を変更することで、デバッグがより困難になる可能性があります。

副作用のある式は、最初に入力したときに 1 回だけ評価されます。 その後、[ ウォッチ ] ウィンドウに式が淡色表示され、それ以降の評価は無効になります。 ヒントまたは [値] 列では、式が副作用の原因であることを説明します。 値の横に表示される更新アイコンを選択すると、強制的に再評価できます。

副作用の指定を防ぐ 1 つの方法は、関数の自動評価をオフにすることです。 [ツール] (または [デバッグ] >[オプション] ウィンドウの [>>] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオフにします。

副作用の指定を防ぐ 1 つの方法は、関数の自動評価をオフにすることです。 [ツール] (または [デバッグ] >[オプション] ダイアログの [デバッグ>General] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオフにします。

C# の場合のみ、プロパティまたは暗黙的な関数呼び出しの評価がオフになっている場合は、[ウォッチ] ウィンドウの変数名にac 形式修飾子を追加して評価を強制できます。 C# の書式指定子を参照してください。

[ウォッチ] ウィンドウでオブジェクト ID を使用する (C# および Visual Basic)

特定のオブジェクトの動作を観察したい場合があります。 たとえば、その変数がスコープ外になった後に、ローカル変数によって参照されるオブジェクトを追跡できます。 C# と Visual Basic では、参照型の特定のインスタンスのオブジェクト ID を作成し、[ ウォッチ ] ウィンドウとブレークポイント条件で使用できます。 オブジェクト ID は、共通言語ランタイム (CLR) デバッグ サービスによって生成され、オブジェクトに関連付けられます。

オブジェクト ID は、オブジェクトがガベージコレクションされるのを妨げない弱い参照を作成します。 現在のデバッグ セッションに対してのみ有効です。

次のコードでは、 MakePerson() メソッドはローカル変数を使用して Person を作成します。

class Person
{
    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

public class Program
{
    static List<Person> _people = new List<Person>();
    public static void Main(string[] args)
    {
        MakePerson();
        DoSomething();
    }

    private static void MakePerson()
    {
        var p = new Person("Bob");
        _people.Add(p);
    }

    private static void DoSomething()
    {
        // more processing
         Console.WriteLine("done");
    }
}

Person メソッドでDoSomething()の名前を確認するには、[Person] ウィンドウで オブジェクト ID への参照を追加します。

  1. Person オブジェクトの作成後に、コードにブレークポイントを設定します。

  2. デバッグを開始します。

  3. ブレークポイントで実行が一時停止したら、デバッグ>> を選択して [ローカル] ウィンドウを開きます。

  4. [ ローカル] ウィンドウで、 Person 変数を右クリックし、[ オブジェクト ID の作成] を選択します。

    [$ ウィンドウにドル記号 () と数字が表示されます。これはオブジェクト ID です。

  5. [ ウォッチ ] ウィンドウにオブジェクト ID を追加するには、オブジェクト ID を右クリックし、[ ウォッチの追加] を選択します。

  6. DoSomething() メソッドに別のブレークポイントを設定します。

  7. デバッグを続行します。 DoSomething() メソッドで実行が一時停止すると、[ウォッチ] ウィンドウにPerson オブジェクトが表示されます。

    Person.Nameなど、オブジェクトのプロパティを表示する場合は、プロパティの評価を有効にする必要があります。

    ツール (またはデバッグ) >オプション] ウィンドウの [>>] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオンにします。

    [ツール] (または [デバッグ] >[オプション] ダイアログの [デバッグ>General] セクションで、[プロパティの評価とその他の暗黙的な関数呼び出しを有効にする] チェック ボックスをオンにします。

動的ビューとウォッチ ウィンドウ

一部のスクリプト言語 (JavaScript や Python など) では動的または アヒル 型指定が使用され、.NET バージョン 4.0 以降では通常のデバッグ ウィンドウでは観察が困難なオブジェクトがサポートされています。

[ウォッチ] ウィンドウには、これらのオブジェクトが動的オブジェクトとして表示され、IDynamicMetaObjectProvider インターフェイスを実装する型から作成されます。 動的オブジェクト ノードには動的オブジェクトの動的メンバーが表示されますが、メンバー値の編集は許可されません。

動的ビューの値を更新するには、動的オブジェクト ノードの横にある更新アイコンを選択します。

オブジェクトの動的ビューのみを表示するには、[ウォッチ] ウィンドウの動的オブジェクト名の後に動的書式指定子を追加します。

  • C# の場合: ObjectName, dynamic
  • Visual Basic の場合: $dynamic, ObjectName

  • 次のコード行にステップ インしても、C# デバッガーは 動的ビュー の値を自動的に再評価しません。
  • Visual Basic デバッガーは、 動的ビューを介して追加された式を自動的に更新します。
  • 動的ビューのメンバーを評価すると、副作用が生じます。

オブジェクトを動的オブジェクトにキャストする新しいウォッチ変数を挿入するには:

  1. ダイナミック ビューの任意の子を右クリックします。
  2. [ ウォッチの追加] を選択します。 object.name((dynamic) object).nameになり、新しいウォッチ ウィンドウに表示されます。

デバッガーでは、オブジェクトの 動的ビュー の子ノードも [自動変数 ] ウィンドウに追加されます。 [自動変数] ウィンドウを開くには、デバッグ中に [デバッグ>Windows>Autos] を選択します。

動的ビュー では、COM オブジェクトのデバッグも強化されます。 デバッガーは、 System.__ComObjectでラップされた COM オブジェクトに到達すると、オブジェクトの 動的ビュー ノードを追加します。

クイック ウォッチを使用して 1 つの変数または式を観察する

クイック ウォッチを使用して、1 つの変数を観察できます。

たとえば、次のコードを使用します。

static void Main(string[] args)
{
    int a, b;
    a = 1;
    b = 2;
    for (int i = 0; i < 10; i++)
    {
        a = a + b;
    }
}

a変数を観察するには、

  1. a = a + b;行にブレークポイントを設定します。

  2. デバッグを開始します。 ブレークポイントで実行が一時停止します。

  3. コード内の変数 a を選択します。

  4. [デバッグ>QuickWatch] を選択するか、Shift キー+F9 キーを押すか、右クリックして [クイック ウォッチ] を選択します。

    [クイック ウォッチ] ダイアログが表示されます。 a変数は、ボックスにあり、その1です。

    QuickWatch 変数のスクリーンショット。

  5. 変数を使用して式を評価するには、[a + bなどの式を入力し、[再評価] を選択します。

    クイック ウォッチ式のスクリーンショット。

  6. クイック ウォッチからウォッチ ウィンドウに変数または式を追加するには、[ウォッチ追加] を選択します。

  7. [ 閉じる] を選択して [クイック ウォッチ ]ウィンドウを閉じます。 (クイック ウォッチ はモーダル ダイアログなので、開いている限りデバッグを続けることはできません)。

  8. デバッグを続行します。 [ウォッチ] ウィンドウで変数を 確認 できます。

AI のサポートを受ける

Copilot を使用している場合は、ウォッチ ウィンドウで変数を見ている間に AI の支援を受けることができます。 変数を右クリックし、[Copilot に質問する] ボタンの [Copilot に質問する] のスクリーンショットを使用します。 このシナリオでは、Copilot は質問のコンテキストを既に認識しているため、チャットで自分でコンテキストを提供する必要はありません。 詳細については、「Copilotを使用したデバッグ」を参照してください。