Visual Studio 2017の[ウォッチ]ウィンドウを使うと、プログラムのデバッグ中に特定の変数の値を監視し続けたり、任意の式を評価して表示したりできる。
Visual Studio 2017(以下、VS 2017)でデバッグを行う際には、[ウォッチ]ウィンドウに変数やそのプロパティ、任意の式を追加することで、それらの値の変化を監視し続け、プログラムの動作をより詳しく把握できるようになる。本稿では、その基本的な使い方を紹介する。
ここでは以下のC#コードを例に話を進める。
using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
namespace WatchSample
{
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
class Program
{
static void Main(string[] args)
{
var plist = MakeProductList(); // ここにブレークポイントを設定
int sum = 0;
for (int i = 0; i < plist.Count(); i++)
{
WriteLine($"{plist[i].Name}: {plist[i].Price}");
sum += plist[i].Price;
}
WriteLine($"sum: {sum}");
ReadKey();
}
private static List<Product> MakeProductList()
{
var rnd = new Random();
var p1 = new Product() { Name = "tomato", Price = rnd.Next(1000) };
var p2 = new Product() { Name = "potato", Price = rnd.Next(1000) };
var p3 = new Product() { Name = "cabbage", Price = rnd.Next(1000) };
var plist = new List<Product>();
plist.Add(p1);
plist.Add(p2);
plist.Add(p3);
return plist;
}
}
}
VS 2017のIDEでブレークポイントを設定して、プログラムをデバッグ実行すると、ブレークポイントまで実行が進んだ時点で、実行が中断され、IDE下部に[ローカル]ウィンドウ、[ウォッチ 1]ウィンドウなどが表示される。ここではMakeProductListメソッドを呼び出している行にブレークポイントを設定している。
これらが表示されていない場合には、メニューバーの[デバッグ]−[ウィンドウ]−[ローカル]や[デバッグ]−[ウィンドウ]−[ウォッチ]−[ウォッチ 1]〜[ウォッチ 4]を選択することで表示できる。
本稿では[ウォッチ]ウィンドウと呼称するが、実際にはこのウィンドウは最大で4つ表示でき、[ウォッチ 1]〜[ウォッチ 4]までの名前が付いている。大規模なプログラムなどで、1つの[ウォッチ]ウィンドウにいろいろな情報を表示していると、わけが分からなくなりそうな場合には、関連性のある項目だけを特定の[ウォッチ X]ウィンドウにまとめて表示するとよいだろう。
[ローカル]ウィンドウには、そのスコープに存在するローカル変数の値が表示され、ステップ実行を進めていくのに合わせて各変数の値が変化していく。ローカル変数の値を確認したいだけなら、こちらを利用すればよい。
これに対して、[ウォッチ]ウィンドウではさまざまな変数(やそのプロパティ)に加えて、何らかの計算式を追加することで、より柔軟にプログラム実行時の情報を表示できる。[ウォッチ]ウィンドウに追加する変数やプロパティ、計算式のことをVSでは「ウォッチ式」と呼んでいる。これらは「式」なので、式として評価できる多くの要素を追加できる(ただし、プログラムの実行に影響を与える「副作用を持った式」は一度だけ評価され、その後は評価されない。後述)。「plist」のように単に変数名を記述すると、それはC#では「式」として扱われるので、[ウォッチ]ウィンドウに追加できるということだ。
[ウォッチ]ウィンドウにウォッチ式を追加する簡単な方法は、デバッグ実行が中断した状態で、ウォッチしたい対象を右クリックして、コンテキストメニューから[ウォッチの追加]を選択することだ。以下はplist変数にマウスカーソルを合わせたところだ。これだけでも、plist変数についての簡単な情報が表示される。
ここでplist変数を右クリックすると、以下のようなコンテキストメニューが表示される。コンテキストメニューから[ウォッチの追加]を選択すると、これが[ウォッチ]ウィンドウに追加される。
[ウォッチ]ウィンドウには、[ローカル]ウィンドウと同様に、その[名前][値][種類]が表示される。上の画像ではMakeProductListメソッドの呼び出し前なので、その値はnullになっている。以下はステップオーバー実行をしたところだ。MakeProductListメソッドにより、リストが作成されたので、[値]には「Count = 3」とその要素数が表示されている。このように、値に変化があった項目については赤字で表示されるので、プログラム実行でどのような変化が起きているかを把握しやすくなっている。また、[名前]欄の左側にある三角をクリックすることで、その要素を展開して表示することも可能だ(以下の画像はこれを行ったもの)。
なお、コンテキストメニューで[ウォッチの追加]ではなく、[クイック ウォッチ]を選択すると、[クイック ウォッチ]ウィンドウが表示される。このウィンドウは単一の変数専用の[ウォッチ]ウィンドウのようなもので、[ウォッチ]ウィンドウと同様に、[名前][値][種類]がそこに表示される。ここから[ウォッチ]ウィンドウに式を追加することも可能だ。
[ウォッチ]ウィンドウで[plist]をダブルクリックすると、編集可能状態になるので、必要に応じてその内容を修正することも可能だ。以下は、plist.Countプロパティの値を表示するように修正しているところだ。
ご覧の通り、IntelliSenseも利用できるので、とても快適にウォッチ式の編集ができるはずだ。なお、何もない[名前]欄をダブルクリックすれば、素の状態から任意の式を入力できる。以下は、合計(sum変数)をコンソールに出力する行まで実行を進めたところで、平均値を知りたくなったので、[ウォッチ]ウィンドウに「sum / plist.Count」と入力したところだ。
なお、プログラムの実行に影響を及ぼす「副作用を持った式」を[ウォッチ]ウィンドウに追加すると、最初の1回だけ評価が行われ、その後は無効となる。例えば、LINQを使いPriceプロパティの総和を求めようとして、「plist.Select(x => x.Price).Sum()」と入力したとする。最初はこの式が評価されるが、デバッグ実行をもう一度行うと、次のように「この式は副作用の原因になり、評価されません」と表示される。ただし、メッセージの隣にある矢印をクリックすれば、再評価が行われる。
[ウォッチ]ウィンドウに追加した式を削除するには、特定の要素を右クリックして、コンテキストメニューから[ウォッチ式の削除]を選択するか、全ての要素を削除するならコンテキストメニューから[すべてクリア]を選択する。
[ウォッチ]ウィンドウを使うと、プログラムのデバッグ実行時にさまざまな情報を、プログラマーが望む形で表示できるようになる。式の追加はとても簡単に行え、その編集もすぐにできる。また、大規模なプログラムでは、最大4つまでの[ウォッチ]ウィンドウに関連のある情報だけをまとめて表示することも可能だ。使いこなせば、デバッグをより効率的に行えるようになるだろう。
カテゴリ:Visual Studio 2017 処理対象:IDE
Copyright© Digital Advantage Corp. All Rights Reserved.