ウォッチを使って変数の中身を確認しよう
概要
最終更新日:2020/03/04 デバッグ機能の一つであるウォッチの機能や使い方について書いた記事です。 主に次の項目に該当する方に向けて書いています。
- ウォッチとは何か知りたい
- ウォッチで出来ることを知りたい
- ウォッチの種類を知りたい
サンプル
サンプルはここからダウンロードできます。 環境については以下の内容となっています。
VSのバージョン | VisualStudio 2019 |
---|---|
説明 | 今回のウォッチのスクリーンショットをとるために作ったサンプルです。 |
ウォッチとは
ウォッチとはVisualStudioなどのIDEで実装されているデバッグ機能の一つで、 値の確認や編集をすることができます。 この機能を使用することで、どの変数のどのような値によって、 バグが生じているのかを見つけることができます。 今回はVisualStudioで説明を行いますが基本的な機能は ほとんどのIDEに実装されてい機能が多いので参考になると思います。
ウォッチの特性
ウォッチはブレークポイントを使用して処理を一時停止させている間だけ使うことができます。 停止中に専用のウィンドウやマウスカーソルを合わせることで、 値の確認をすることができます。 ブレークポイントの機能で処理をトレースする際にif文やswitchの条件チェックなどを、 値を確認しながら進めていけるので、初心者の方の理解促進にも繋がります。
ウォッチの種類
ウォッチで値を確認する方法は複数用意されています。
- 自動変数ウィンドウ
- ローカルウィンドウ
- ウォッチウィンドウ
- マウスカーソルを合わせる
ウィンドウの共通仕様
自動変数ウィンドウ、ローカルウィンドウ、ウォッチウィンドウで 行えることはほとんど同じで、表示させる変数の種類が異なるだけです。 そこで、共通している仕様について先に説明します。
- 表示
- ウィンドウ構成
- 値の確認
- 値の編集
- 値の変更時の中断設定
- 16 <=> 10進数表示切替
表示
ウォッチのウィンドウはプログラム実行中に表示されます。 もし、表示されていなかった場合、以下の手順で表示できます。
- 上段メニューの「デバッグ」を選択
- 「ウィンドウ」を選択
- 「ウォッチ」「自動変数」「ローカル」のいずれかを選択
ウォッチウィンドウのみウォッチ項目から更に選択が必要です。
ウィンドウ構成
ウォッチのウィンドウ構成は全て同じです。
番号 | 項目名 | 説明 |
---|---|---|
① | 名前 | ウォッチ対象になっている変数の名前が表示される |
② | 値 | 変数の値が表示される |
③ | 種類 | 変数の型の種類が表示される |
値の確認
変数の値を確認はウィンドウの値の項目で行えます。 また、値はブレークポイントの機能を使い処理を進めていく中で、 変化が起こったら赤色になります。 例としてmaxの値の変化を追ってみたいと思います。 下の画像ではmaxの値は-1です。 maxの値が変更されるところまで処理を進めます。 一つ処理を進めることでmaxの値が変更します。 その結果、ウィンドウ内のmaxの値も変更され、色も赤色に変化しています。 値の色の変化は変更直後しか起きません。 次の処理に進んだら色は元の色に戻ります。 このように値の項目を確認することで、停止中の変数の値を確認することができます。
値の編集
ウィンドウの値の項目から変数の値を編集することができます。 この機能を使用することで、条件判定のテストなどを行えます。 今回はmaxの値を条件判定のタイミングで編集したいと思います。 まずは変更したい位置まで処理を進めます。 次はウィンドウの対象の値を編集しますが、方法が複数あるので、 ここでは編集モードにしてから変更する方法の説明をします。 ウィンドウ上の対象の値をダブルクリックすることで、編集モードになります。 この状態の時に値を変更すれば値が書き変わります。 このようにウォッチでは停止中の変数の値を編集することができます。
直接編集する
ウィンドウ内の変数が選択状態になっていたら値をダブルクリックしなくとも、 そのまま数字や文字を入力すれば、自動で編集モードになるので簡単に変更できます。
メニューから編集を選択する
ウィンドウ内の変数を右クリックするとメニューが表示されるので、 その中の「値の編集」を選択すれば編集モードになります。
値の変更時の中断設定
ウォッチでは指定した値が変更された場合に処理を停止させることができます。 手順は以下の通りです。
- ウィンドウで対象の項目を右クリック
- 表示されたメニューから「値が変更された時に中断」を選択
- 項目に赤丸が表示されたら設定成功
- 処理を再開する
処理再開後に中断設定を行った変数の値が変更されたら通知が表示されます。 ×マークの入った〇は停止した場所を指しています。 また、この停止はバグなどではないので、そのまま処理を進めることができます。 このように値が変更された場合にだけ中断設定を行うことができるので、 不正な値のチェックをする際などに、代入処理を行っている様々な場所に ブレークポイントを設置する必要がなくなります。
16 <=> 10進数表示切替
ウォッチウィンドウの基本数値表現は10進数で行われていますが、 以下の手順で16進数に切り替えることもできます。
- ウィンドウで右クリック
- 表示されたメニューから「16進数で表示」を選択
- ウィンドウの値が16進数に変更されたら設定成功
16進数変換は一つの項目だけではなく、全て対象となります。 また、10進数に戻す場合は「16進数で表示」を再度選択すれば戻ります。 この値の変換機能は値をビットとして扱っている場合などに重宝します。
自動変数ウィンドウ
自動変数ウィンドウは停止している位置に関係があると判断された 変数だけを表示するウィンドウです。 まず、for文の位置での自動変数ウィンドウの内容です。 関連がある変数として判断された変数は以下の通りです。
- i
- score_list
- value
次に、処理を一つ進めた自動変数ウィンドウの内容です。 先ほど表示されていた「value」がなくなり、新しく「score_list[i]」が追加されています。 このように自動変数ウィンドウでは現在の処理位置に関係がある変数は表示、 関係がない変数は非表示になっています。 その為、変数が多い関数などでは、その処理の必要最低限の変数だけに絞って 確認できるので、情報の把握が効率よくできます。
ローカルウィンドウ
ローカルウィンドウは停止した位置のブロック内に 宣言されている変数を表示するウィンドウです。 まず、for文の位置での自動変数ウィンドウの内容です。 main関数のブロック内で宣言されている以下の変数が表示されています。
- max_score
- score_list
- value
ここで、ポイントとなるのは、停止している処理の位置ではまだ宣言されていない 「max_value」が含まれていることです。 この変数はmain関数の終盤で宣言しています。 ローカルウィンドウはそのブロック内の変数全てを表示しますが、 ブロック内に別のブロックが存在した場合、処理位置がそのブロックに到達するまでは そのブロック内の変数は表示されません。 証明として、先ほどの位置から38行目まで位置まで進めてみると、 「test_01」と「test_02」が追加されます。 これは33行目のif文のブロックの中に処理が進んだので、 このif文ブロックがローカルの表示範囲と判断され、 ブロック内宣言されている変数がリストに追加されたということです。 では、ブロックを抜けた場合はどうなるかというと、 ブロックで宣言されていた変数がウィンドウから削除されます。 次の画像は処理を41行目まで進めた内容ですが、 先ほど表示されていた「test_01」と「test_02」が消えています。 40行目は33行目のブロックから抜け出しているので、 33行目のブロック内で宣言されていた変数が削除された形になります。 このようにローカルウィンドウではブロック内の変数が表示されるので、 関数内等の情報をまとめて確認したい場合などに効率よく確認できます。
ウォッチウィンドウ
ウォッチウィンドウは登録した変数の値を確認、編集できるウィンドウです。 自動変数やローカルはグローバル変数や関数をまたいだ変数の値を 確認することはできませんが、ウォッチウィンドウは可能です。 ウォッチウィンドウは登録式なので、初期のウィンドウには何も表示されていません。
登録方法
変数の登録方法は以下の通り複数用意されています。
- ウィンドウから追加
- 変数を指定して追加
登録した変数は別の名前に変更することが可能です。
ウィンドウから追加
ウィンドウから追加する方法は項目を選択状態にしておき、 名前をダブルクリックして編集モードにするか、変数名を入力することで追加できます。
変数を指定して追加
変数を指定して追加する方法の手順は以下の通りです。
- 追加したい変数を右クリック
- 「ウォッチの追加」を選択
削除方法
変数の登録方法は以下の通り複数用意されています。
- メニューから削除
- キー入力で削除
どちらの方法でも、選択状態になっていることが前提条件です。
メニューから削除
メニューから削除する方法の手順は以下の通りです。
- 削除したい変数を右クリック
- 「ウォッチ式の削除」を選択
キー入力で削除
キー入力で削除は削除する変数を選択した状態で「delete」キーを押せば削除されます。
変数表示の管理
ウォッチウィンドウは一つだけではなく、複数用意されています。 これは表示する変数をウィンドウごとに分けることで管理しやすいために用意されています。 ウォッチウィンドウは他のウィンドウと比べて追加、削除は開発側にゆだねられているので、 多くの変数を表示することがあるかもしれません。 そのような時に、ウィンドウごとで表示する変数の種類を決めれば 変数の値を確認する際の効率が上がります。
マウスカーソルを合わせる
文字通り、マウスカーソルを変数に合わせるだけで、その変数の値を確認できます。 表示された値をダブルクリックすれば編集モードになるので変更も可能です。 この機能はウォッチをVisual Studioが拡張しているので、 ウォッチの基本機能である確認や編集も、もちろんできますが、 プログラムを動かしていない状態でも使用できます。 その際は、カーソルを合わせることで変数の型情報や関数の引数や戻り値の情報を 確認することができるようになっています。 また、値だけではなくif文などの条件式を部分選択すると 判定結果を表示してくれます。
以上がウォッチ機能の説明と使い方になります。 デバッグ機能を使いこなすと、作業効率が格段に上がるので、 是非、使ってみてください。