ウォッチ ウィンドウとクイック ウォッチを使用して変数を監視する
デバッグ中に [ウォッチ] ウィンドウとクイック ウォッチを使用して、変数と式を監視できます。 ウィンドウは、デバッグ セッション中にのみ使用できます。
[ウォッチ] ウィンドウでは、デバッグ中に複数の変数を同時に表示できます。 [クイック ウォッチ] ダイアログには一度に 1 つの変数が表示され、デバッグを続行する前にダイアログを閉じる必要があります。 QuickWatch の使用に関する詳細については、「クイック ウォッチで 1 つの変数または式を観察する」を参照してください。
注意
コードのデバッグを試みるのが今回初めてである場合は、この記事を先に進む前に「入門者向けのデバッグ」および「デバッグの技術とツール」を参照することをお勧めします。
ウォッチ ウィンドウを使用して変数を観察する
複数のウォッチ ウィンドウを開くことができ、1 つのウォッチ ウィンドウで複数の変数を観察できます。
たとえば、次のコードの a
、b
、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;
}
左側の余白をクリックし、 [デバッグ]>[ブレークポイントの設定/解除] を選択するか、F9 キーを押して、
c = a + b;
の行にブレークポイントを設定します。緑色の [開始] 矢印を選択するか、 [デバッグ]>[デバッグの開始] を選択するか、F5 キーを押して、デバッグを開始します。 ブレークポイントで実行が一時停止します。
[デバッグ]>[ウィンドウ]>[ウォッチ]>[ウォッチ 1] を選択するか、Ctrl+Alt+W キー >1 キーの順に押して、 [ウォッチ] ウィンドウを開きます。
ウィンドウ 2、3、4 を選択することで、追加の [ウォッチ] ウィンドウを開くことができます。
[ウォッチ] ウィンドウで空の行を選択し、「variable
a
」と入力します。b
とc
に対しても同じ操作を行います。デバッグを続行するには、必要に応じて [デバッグ]>[ステップイン] を選択するか、F11 キーを押します。
for
ループを繰り返すと、 [ウォッチ] ウィンドウの変数の値が変化します。
注意
C++ の場合のみ
変数名または変数名を使用する式のコンテキストを修飾することが必要になる場合があります。 コンテキストとは、変数が配置される、関数、ソース ファイル、またはモジュールです。 コンテキストを修飾する必要がある場合は、 [ウォッチ] ウィンドウの [名前] でコンテキスト演算子 (C++) 構文を使用します。
[ウォッチ] ウィンドウの [名前] に $<レジスタ名> または @<レジスタ名> を使用して、レジスタ名と変数名を追加できます。 詳細については、「 Pseudovariables」を参照してください。
ウォッチ ウィンドウで式を使用する
[ウォッチ] ウィンドウでは、デバッガーによって認識される有効な式を観察できます。
たとえば、前のセクションのコードでは、 [ウォッチ] ウィンドウに「(a + b + c) / 3
」と入力して、3 つの値の平均を取得できます。
一般に、ウォッチ ウィンドウで式を評価する場合の規則は、コーディング言語で式を評価する場合の規則と同じです。 式に構文エラーがある場合は、コード エディターと同じコンパイラ エラーが表示されます。 たとえば、前の式に入力ミスがあると、 [ウォッチ] ウィンドウに次のエラーが生成されます。
[ウォッチ] ウィンドウには、2 つの波線が含まれる円のアイコンが表示される場合があります。 このアイコンは、スレッド間の依存関係があるため、デバッガーで式が評価されないことを意味します。 コードを評価するには、アプリ内の他のスレッドを一時的に実行する必要がありますが、中断モードになっているため、通常はアプリ内のすべてのスレッドが停止されます。 他のスレッドを一時的に実行できるようにすると、アプリの状態に予測できない影響を及ぼすことがあり、ブレークポイントやスレッドでの例外などのイベントがデバッガーで無視される可能性があります。
ウォッチ ウィンドウで検索する
各ウィンドウの上にある検索バーを使用して、 [ウォッチ] ウィンドウの [名前]、[値]、[種類] 列のキーワードを検索できます。 Enter キーを押すか、いずれかの矢印を選択して検索を実行します。 進行中の検索を取り消すには、検索バーの [x] アイコンを選択します。
検出された一致の間を移動するには、左矢印と右矢印 (それぞれ、Shift + F3 キーと F3 キー) を使用します。
検索の詳細さを変更するには、 [ウォッチ] ウィンドウの上部にある [詳細検索] ドロップダウンを使用して、入れ子になったオブジェクトを検索するレベルの深さを選択します。
ウォッチ ウィンドウでプロパティを固定する
注意
この機能は、.NET Core 3.0 以降でサポートされています。
ピン留め可能なプロパティ ツールを使用して、ウォッチ ウィンドウのプロパティでオブジェクトをすばやく調べることができます。 このツールを使用するには、プロパティをポイントして、表示されるピン アイコンを選択するか、右クリックし、表示されるコンテキスト メニューの [メンバーをお気に入りとしてピン留め] オプションを選択します。 これにより、そのプロパティがオブジェクトのプロパティ リストの先頭に表示され、プロパティの名前と値が [値] 列に表示されます。 プロパティの固定を解除するには、ピン アイコンをもう一度選択するか、コンテキスト メニューの [メンバーをお気に入りから削除] オプションを選択します。
また、ウォッチ ウィンドウでオブジェクトのプロパティ リストを表示するときに、プロパティ名を切り替えたり、ピン留めされていないプロパティをフィルターで除外したりすることもできます。 どちらのオプションも、アクセスするには、ウォッチ ウィンドウの上のツール バーにあるボタンを選択します。
ウォッチ値を最新の情報に更新する
式が評価されると、 [ウォッチ] ウィンドウに更新アイコン (円形の矢印) が表示されることがあります。 更新アイコンは、エラーまたは古い値を示します。
値を更新するには、更新アイコンを選択するか、Space キーを押します。 デバッガーで、式の再評価が試行されます。 ただし、値が評価されなかった理由によっては、式を再評価する必要がない場合や、再評価できない場合があります。
式が評価されなかった理由を確認するには、更新アイコンをポイントするか、 [値] 列を参照します。 原因は次のとおりです。
前の例のように、式の評価中にエラーが発生しました。 タイムアウトが発生したか、変数がスコープ外になっている可能性があります。
式に、アプリに副作用を発生させる関数呼び出しがあります。 「式の副作用」を参照してください。
プロパティの自動評価と暗黙的な関数の呼び出しが無効になっています。
プロパティの自動評価と暗黙的な関数の呼び出しが無効になっているために更新アイコンが表示された場合は、 [ツール]>[オプション]>[デバッグ]>[全般] で [プロパティの評価とその他の暗黙的な関数の呼び出しを有効にする] を選択して、有効にすることができます。
更新アイコンの使用方法を確認するには:
[ツール]>[オプション]>[デバッグ]>[全般] で、 [プロパティの評価とその他の暗黙的な関数の呼び出しを有効にする] チェック ボックスをオフにします。
次のコードを入力し、 [ウォッチ] ウィンドウで、
list.Count
プロパティにウォッチを設定します。static void Main(string[] args) { List<string> list = new List<string>(); list.Add("hello"); list.Add("goodbye"); }
デバッグを開始します。 [ウォッチ] ウィンドウに、次のようなメッセージが表示されます。
値を更新するには、更新アイコンを選択するか、Space キーを押します。 デバッガーによって式が再評価されます。
式の副作用
式を評価すると、変数の値が変わる場合や、アプリの状態に影響が及ぶ場合があります。 たとえば、次の式を評価すると、 var1
の値が変わります。
var1 = var2
このコードにより、副作用が発生する可能性があります。 副作用によってアプリの動作方法が変わると、デバッグがさらに困難になります。
副作用のある式は、最初に入力したときに 1 回だけ評価されます。 その後、その式は [ウォッチ] ウィンドウで淡色表示され、それ以上の評価が無効になります。 ツールヒントまたは [値] 列に、式によって副作用が発生することの説明が表示されます。 値の横に表示される更新アイコンを選択することで、再評価を強制できます。
副作用を回避する 1 つの方法は、関数の自動評価をオフにすることです。 [ツール]>[オプション]>[デバッグ]>[全般] で、 [プロパティの評価とその他の暗黙的な関数の呼び出しを有効にする] をオフにします。
C# の場合のみ、プロパティの評価または暗黙的な関数呼び出しがオフに設定されている場合でも、 [ウォッチ] ウィンドウで変数の [名前] に ac 書式修飾子を追加して、強制的に評価できます。 「C# の書式指定子」を参照してください。
ウォッチ ウィンドウでオブジェクト ID を使用する (C# および Visual Basic)
特定のオブジェクトの動作を観察しなければならないことがあります。 その一例は、ローカル変数がスコープ外になった後、その変数が参照するオブジェクトを追跡する必要がある場合です。 C# と Visual Basic では、参照型の特定のインスタンスのオブジェクト ID を作成し、それらの ID をウォッチ ウィンドウやブレークポイントの条件で使用できます。 オブジェクト ID は、共通言語ランタイム (CLR) のデバッグ サービスで生成されて、オブジェクトに関連付けられます。
Note
オブジェクト ID による参照は弱参照であり、これによって、オブジェクトがガベージ コレクションの対象から外れることはありません。 オブジェクト 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");
}
}
DoSomething()
メソッドでの Person
の名前を確認するには、 [ウォッチ] ウィンドウで Person
のオブジェクト ID への参照を追加します。
Person
オブジェクトが作成された後のコードにブレークポイントを設定します。デバッグを開始します。
ブレークポイントで実行が一時停止したら、 [デバッグ]>[ウィンドウ]>[ローカル] を選択して、 [ローカル] ウィンドウを開きます。
[ローカル] ウィンドウで、
Person
変数を右クリックして、 [オブジェクト ID の作成] を選択します。[ローカル] ウィンドウに、ドル記号 ( $ ) と数字が表示されます。それがオブジェクト ID です。
オブジェクト ID を右クリックし、 [ウォッチの追加] を選択して、オブジェクト ID を [ウォッチ] ウィンドウに追加します。
DoSomething()
メソッドに別のブレークポイントを設定します。デバッグを続行します。
DoSomething()
メソッドで実行が一時停止すると、 [ウォッチ] ウィンドウにPerson
オブジェクトが表示されます。注意
オブジェクトのプロパティ (
Person.Name
など) を見たい場合は、 [ツール]>[オプション]>[デバッグ]>[全般]>[プロパティの評価とその他の暗黙的な関数の呼び出しを有効にする] を選択して、プロパティの評価を有効にする必要があります。
動的ビューとウォッチ ウィンドウ
一部のスクリプト言語 (JavaScript や Python など) では、動的型付けまたは ダック タイピングが使用されています。また、.NET バージョン 4.0 以降では、通常のデバッグ ウィンドウでは観察が困難なオブジェクトがサポートされています。
[ウォッチ] ウィンドウには、これらのオブジェクトが動的オブジェクトとして表示されます。これらのオブジェクトは、IDynamicMetaObjectProvider インターフェイスを実装する型から作成されます。 動的オブジェクト ノードには動的オブジェクトの動的メンバーが表示されますが、そのメンバーの値を編集することはできません。
動的ビューの値を更新するには、動的オブジェクト ノードの横にある更新アイコンを選択します。
オブジェクトの動的ビューだけを表示するには、 [ウォッチ] ウィンドウで動的オブジェクト名の後に dynamic 書式指定子を追加します。
- C# の場合:
ObjectName, dynamic
- Visual Basic の場合:
$dynamic, ObjectName
Note
- C# デバッガーでは、次のコード行に移動したときに、動的ビューの値は自動的に再評価されません。
- Visual Basic デバッガーでは、動的ビューで追加された式は自動的に最新の情報に更新されます。
- 動的ビューのメンバーを評価すると、副作用が発生する場合があります。
オブジェクトを動的オブジェクトにキャストする新しいウォッチ変数を挿入するには:
- 動的ビューの任意の子を右クリックします。
- [ウォッチの追加] を選択します。
object.name
が((dynamic) object).name
になり、新しい [ウォッチ] ウィンドウに表示されます。
また、デバッガーでは、オブジェクトの動的ビューの子ノードが、 [自動変数] ウィンドウに追加されます。 [自動変数] ウィンドウを開くには、デバッグ中に、 [デバッグ]>[ウィンドウ]>[自動変数] を選択します。
動的ビューでは、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
変数を観察するには、次のようにします。
a = a + b;
の行にブレークポイントを設定します。デバッグを開始します。 ブレークポイントで実行が一時停止します。
コードで
a
変数を選択します。[デバッグ]>[クイック ウォッチ] を選択するか、Shift+F9 キーを押すか、右クリックして [クイック ウォッチ] を選択します。
[クイック ウォッチ] ダイアログ ボックスが表示されます。
a
変数が [式] ボックスに表示され、値は 1 です。変数を使用して式を評価するには、
a + b
などの式を [式] ボックスに入力し、 [再評価] を選択します。[クイック ウォッチ] から [ウォッチ] ウィンドウに変数または式を追加するには、 [ウォッチの追加] を選択します。
[閉じる] を選択して、 [クイック ウォッチ] ウィンドウを閉じます。 ( [クイック ウォッチ] はモーダル ダイアログであるため、このウィンドウが開いている限り、デバッグを続行することはできません)。
デバッグを続行します。 [ウォッチ] ウィンドウで変数を観察できます。