ウォッチを使って変数の中身を確認しよう

概要

最終更新日:2020/03/04

デバッグ機能の一つであるウォッチの機能や使い方について書いた記事です。
主に次の項目に該当する方に向けて書いています。
  • ウォッチとは何か知りたい
  • ウォッチで出来ることを知りたい
  • ウォッチの種類を知りたい

サンプル

サンプルはここからダウンロードできます。
環境については以下の内容となっています。

開発環境
VSのバージョン VisualStudio 2019
説明 今回のウォッチのスクリーンショットをとるために作ったサンプルです。


ウォッチとは

ウォッチとはVisualStudioなどのIDEで実装されているデバッグ機能の一つで、
値の確認や編集をすることができます。
この機能を使用することで、どの変数のどのような値によって、
バグが生じているのかを見つけることができます。

今回はVisualStudioで説明を行いますが基本的な機能は
ほとんどのIDEに実装されてい機能が多いので参考になると思います。

ウォッチの特性

ウォッチはブレークポイントを使用して処理を一時停止させている間だけ使うことができます。
停止中に専用のウィンドウやマウスカーソルを合わせることで、
値の確認をすることができます。

ブレークポイントの機能で処理をトレースする際にif文やswitchの条件チェックなどを、
値を確認しながら進めていけるので、初心者の方の理解促進にも繋がります。

ウォッチの種類

ウォッチで値を確認する方法は複数用意されています。
  • 自動変数ウィンドウ
  • ローカルウィンドウ
  • ウォッチウィンドウ
  • マウスカーソルを合わせる

ウィンドウの共通仕様

自動変数ウィンドウ、ローカルウィンドウ、ウォッチウィンドウで
行えることはほとんど同じで、表示させる変数の種類が異なるだけです。
そこで、共通している仕様について先に説明します。
  • 表示
  • ウィンドウ構成
  • 値の確認
  • 値の編集
  • 値の変更時の中断設定
  • 16 <=> 10進数表示切替

表示

ウォッチのウィンドウはプログラム実行中に表示されます。

debug_0056

もし、表示されていなかった場合、以下の手順で表示できます。
  1. 上段メニューの「デバッグ」を選択
  2. 「ウィンドウ」を選択
  3. 「ウォッチ」「自動変数」「ローカル」のいずれかを選択
debug_0057

ウォッチウィンドウのみウォッチ項目から更に選択が必要です。

debug_0058

ウィンドウ構成

ウォッチのウィンドウ構成は全て同じです。

debug_0040
番号 項目名 説明
名前 ウォッチ対象になっている変数の名前が表示される
変数の値が表示される
種類 変数の型の種類が表示される

値の確認

変数の値を確認はウィンドウの値の項目で行えます。
また、値はブレークポイントの機能を使い処理を進めていく中で、
変化が起こったら赤色になります。

例としてmaxの値の変化を追ってみたいと思います。
下の画像ではmaxの値は-1です。

debug_0041

maxの値が変更されるところまで処理を進めます。

debug_0042

一つ処理を進めることでmaxの値が変更します。
その結果、ウィンドウ内のmaxの値も変更され、色も赤色に変化しています。

debug_0044

値の色の変化は変更直後しか起きません。
次の処理に進んだら色は元の色に戻ります。

debug_0045

このように値の項目を確認することで、停止中の変数の値を確認することができます。

値の編集

ウィンドウの値の項目から変数の値を編集することができます。
この機能を使用することで、条件判定のテストなどを行えます。

今回はmaxの値を条件判定のタイミングで編集したいと思います。
まずは変更したい位置まで処理を進めます。

debug_0045

次はウィンドウの対象の値を編集しますが、方法が複数あるので、
ここでは編集モードにしてから変更する方法の説明をします。
ウィンドウ上の対象の値をダブルクリックすることで、編集モードになります。

debug_0047

この状態の時に値を変更すれば値が書き変わります。

debug_0048

このようにウォッチでは停止中の変数の値を編集することができます。

直接編集する

ウィンドウ内の変数が選択状態になっていたら値をダブルクリックしなくとも、
そのまま数字や文字を入力すれば、自動で編集モードになるので簡単に変更できます。

debug_0049

メニューから編集を選択する

ウィンドウ内の変数を右クリックするとメニューが表示されるので、
その中の「値の編集」を選択すれば編集モードになります。

debug_0050

値の変更時の中断設定

ウォッチでは指定した値が変更された場合に処理を停止させることができます。
手順は以下の通りです。
  1. ウィンドウで対象の項目を右クリック
  2. 表示されたメニューから「値が変更された時に中断」を選択
  3. 項目に赤丸が表示されたら設定成功
  4. 処理を再開する
debug_0051

debug_0052

処理再開後に中断設定を行った変数の値が変更されたら通知が表示されます。
×マークの入った〇は停止した場所を指しています。
また、この停止はバグなどではないので、そのまま処理を進めることができます。

debug_0053

このように値が変更された場合にだけ中断設定を行うことができるので、
不正な値のチェックをする際などに、代入処理を行っている様々な場所に
ブレークポイントを設置する必要がなくなります。

16 <=> 10進数表示切替

ウォッチウィンドウの基本数値表現は10進数で行われていますが、
以下の手順で16進数に切り替えることもできます。
  1. ウィンドウで右クリック
  2. 表示されたメニューから「16進数で表示」を選択
  3. ウィンドウの値が16進数に変更されたら設定成功
debug_0054

debug_0055

16進数変換は一つの項目だけではなく、全て対象となります。
また、10進数に戻す場合は「16進数で表示」を再度選択すれば戻ります。

この値の変換機能は値をビットとして扱っている場合などに重宝します。

自動変数ウィンドウ

自動変数ウィンドウは停止している位置に関係があると判断された
変数だけを表示するウィンドウです。

まず、for文の位置での自動変数ウィンドウの内容です。
関連がある変数として判断された変数は以下の通りです。
  • i
  • score_list
  • value
debug_0059

次に、処理を一つ進めた自動変数ウィンドウの内容です。
先ほど表示されていた「value」がなくなり、新しく「score_list[i]」が追加されています。

debug_0060

このように自動変数ウィンドウでは現在の処理位置に関係がある変数は表示、
関係がない変数は非表示になっています。
その為、変数が多い関数などでは、その処理の必要最低限の変数だけに絞って
確認できるので、情報の把握が効率よくできます。

ローカルウィンドウ

ローカルウィンドウは停止した位置のブロック内に
宣言されている変数を表示するウィンドウです。

まず、for文の位置での自動変数ウィンドウの内容です。
main関数のブロック内で宣言されている以下の変数が表示されています。
  • max_score
  • score_list
  • value
debug_0061

ここで、ポイントとなるのは、停止している処理の位置ではまだ宣言されていない
「max_value」が含まれていることです。
この変数はmain関数の終盤で宣言しています。

debug_0062

ローカルウィンドウはそのブロック内の変数全てを表示しますが、
ブロック内に別のブロックが存在した場合、処理位置がそのブロックに到達するまでは
そのブロック内の変数は表示されません。

証明として、先ほどの位置から38行目まで位置まで進めてみると、
「test_01」と「test_02」が追加されます。

debug_0063

これは33行目のif文のブロックの中に処理が進んだので、
このif文ブロックがローカルの表示範囲と判断され、
ブロック内宣言されている変数がリストに追加されたということです。

では、ブロックを抜けた場合はどうなるかというと、
ブロックで宣言されていた変数がウィンドウから削除されます。
次の画像は処理を41行目まで進めた内容ですが、
先ほど表示されていた「test_01」と「test_02」が消えています。

debug_0064

40行目は33行目のブロックから抜け出しているので、
33行目のブロック内で宣言されていた変数が削除された形になります。

このようにローカルウィンドウではブロック内の変数が表示されるので、
関数内等の情報をまとめて確認したい場合などに効率よく確認できます。

ウォッチウィンドウ

ウォッチウィンドウは登録した変数の値を確認、編集できるウィンドウです。
自動変数やローカルはグローバル変数や関数をまたいだ変数の値を
確認することはできませんが、ウォッチウィンドウは可能です。
ウォッチウィンドウは登録式なので、初期のウィンドウには何も表示されていません。

debug_0065

登録方法

変数の登録方法は以下の通り複数用意されています。
  • ウィンドウから追加
  • 変数を指定して追加
登録した変数は別の名前に変更することが可能です。

ウィンドウから追加

ウィンドウから追加する方法は項目を選択状態にしておき、
名前をダブルクリックして編集モードにするか、変数名を入力することで追加できます。

変数を指定して追加

変数を指定して追加する方法の手順は以下の通りです。
  1. 追加したい変数を右クリック
  2. 「ウォッチの追加」を選択
debug_0067

削除方法

変数の登録方法は以下の通り複数用意されています。
  • メニューから削除
  • キー入力で削除
どちらの方法でも、選択状態になっていることが前提条件です。

メニューから削除

メニューから削除する方法の手順は以下の通りです。
  1. 削除したい変数を右クリック
  2. 「ウォッチ式の削除」を選択
debug_0068

キー入力で削除

キー入力で削除は削除する変数を選択した状態で「delete」キーを押せば削除されます。

変数表示の管理

ウォッチウィンドウは一つだけではなく、複数用意されています。

debug_0069

これは表示する変数をウィンドウごとに分けることで管理しやすいために用意されています。
ウォッチウィンドウは他のウィンドウと比べて追加、削除は開発側にゆだねられているので、
多くの変数を表示することがあるかもしれません。
そのような時に、ウィンドウごとで表示する変数の種類を決めれば
変数の値を確認する際の効率が上がります。

マウスカーソルを合わせる

文字通り、マウスカーソルを変数に合わせるだけで、その変数の値を確認できます。

debug_0070

表示された値をダブルクリックすれば編集モードになるので変更も可能です。

debug_0071

この機能はウォッチをVisual Studioが拡張しているので、
ウォッチの基本機能である確認や編集も、もちろんできますが、
プログラムを動かしていない状態でも使用できます。
その際は、カーソルを合わせることで変数の型情報や関数の引数や戻り値の情報を
確認することができるようになっています。

debug_0072

また、値だけではなくif文などの条件式を部分選択すると
判定結果を表示してくれます。

debug_0073
以上がウォッチ機能の説明と使い方になります。
デバッグ機能を使いこなすと、作業効率が格段に上がるので、
是非、使ってみてください。