プログラムの開発では、言語は何であれデバッグ技術を習得することが重要です。本ブログでは、Visual Studio 2022 を使ったデバッグの基本と実践的なテクニックを、具体的なサンプルコードとともに紹介します。
Visual Studio 基本的なデバッグ手法
ブレークポイントの設定
ブレークポイントを使用すると、コードの特定の行で実行を一時停止し、変数の値や処理の流れを確認できます。
特定の行で必ず停止したい場合
1.コードエディタで停止したい行の左側をクリックするかF9を押下(赤い点が表示される)

2.F5キーでプログラムを実行すると、実行がブレークポイントで停止する

3.停止位置での変数の値の確認や、F10(ステップオーバー)や F11(ステップイン)で進めるようになる
下図は、F10(ステップオーバー)で「Console.WriteLine($”合計: {sum}”);」まで進んだところ

ある条件に達したら停止したい場合
1.コードエディタで停止したい行の左側を右クリックし、「条件付きブレークポイントの挿入」を選択

2.停止したい場合の条件を設定し「閉じる」ボタンをクリック
下記の例では、xの値が15に達したら停止するように条件を設定しています。

F5でプログラムを実行すると、x = 15 の時にブレークポイントで停止します。

注意点
コードが最適化されていると、一部の変数が見えない場合があるのでデバッグビルド(Debug モード)で実行すること。

ステップ実行の活用
ステップオーバー(F10)
デバッグ実行中に「今いる行の処理を実行して、次の行へ移動する」操作です。
関数やメソッドの呼び出しがある場合に、それを 「実行はするが中には入らずにスキップ」 します。
ブレークポイントを「int sum = Add(a, b);」に設定し、F5で実行します。実行停止後F10でステップ実行すると、Add関数を実行して「Console.WriteLine($”合計: {sum}”);」で停止します。


ステップイン(F11)
デバッグ中に関数(メソッド)呼び出しがある場合、その「関数の中に入って処理を1行づつ実行する」操作です。
ブレークポイントを「int sum = Add(a, b);」に設定し、F5で実行します。実行停止後F11でステップ実行すると、Add関数内に入ります。

ステップアウト(Shift + F11)
現在ステップ実行しているメソッド(関数等)の残りをすべて実行し、メソッド呼び出し元に戻ります。長い関数や入る必要がない関数に誤って入った場合など、関数を抜け出す為に使用します。
下記は、ブレークポイントからF11で「Add_roop」関数に入った後、(Shift + F11)でステップアウトした例です。

(Shift + F11)で、「Add_roop」関数を抜け出しました。

変数の値を確認する方法
1.ツールチップ(マウスホバー)での確認
ブレークポイントで値を確認したい変数にマウスをホバーして確認します。下図はsum2変数にマウスをホバーして値を表示しています。

2.「ローカル」ウィンドウで確認
メニューから → 「デバッグ
」 → 「ウィンドウ」
→ 「ローカル」
とすると、開いた「ローカル」ウィンドウに、現在のスコープ内のすべての変数とその値が表示されます。

3.「ウォッチ」ウィンドウで確認(特定の変数だけ見たいとき)
メニューから →「 デバッグ」
→ 「ウィンドウ
」 → 「ウォッチ
」 とすると、ウォッチ1 ウインドが開きます。そこに result
や x + y
など、好きな式を手入力すると式の評価結果がリアルタイムで確認できます。

イミディエイトウィンドウの活用
イミディエイトウィンドウを使うと、デバッグ中に下記の事項が実施可能です。「デバッグ」→「ウィンドウ」→「イミディエイト」で開きます。
1.変数の値を表示
2.メソッドの呼び出し
3.変数の値の変更
4.計算式の実行

※?の意味
? 式:その式の評価結果を表示します(代入や呼び出しは ? なしでOK)
呼び出し履歴で実行経路を確認する
デバッグ中に「どのメソッドから呼ばれて今ここにいるのか」を知りたい時は、呼び出し履歴を確認します。「デバッグ」→「ウィンドウ」→「呼び出し履歴」で確認できます。
下記の例は、main()関数の13行目から呼ばれて、現在 Add-roop()関数の27行目で停止している事を示しています。

Debug.WriteLine でログをデバッグウィンドウに表示
実行を確認したい箇所にログ出力のコードを書き込んでおきます。デバッグ時のみメッセージを出力したい場合は、Debug.WriteLine を使用します。

try-catch で例外をキャッチする
try ~ catch で例外を適切にキャッチしメッセージを表示します。
下記の例は、配列の範囲外アクセスを実行した場合です。

まとめ
Visual Studio 2022 でのデバッグテクニックを紹介しました。
- ブレークポイントを活用する
- ステップ実行でコードの流れを確認する
- ウォッチウィンドウやイミディエイトウィンドウで変数を操作する
- 条件付きブレークポイントで効率的にデバッグする
- Debug.WriteLine でログを出力する
- 例外を適切にキャッチしてバグを発見する
これらのテクニックを活用し、デバッグ効率を向上させましょう!