C言語のプログラムを書いていて、
なんか結果がおかしいけど、どこが間違っているか分からない…
と困ったことはありませんか?
そんなとき役に立つのが、Visual Studioのデバッグ機能です。プログラムを1行ずつ実行しながら、変数の中身をリアルタイムで確認できます。
この記事では、以前作った成績管理システムのコードに、わざとバグを仕込んで、実際にデバッグ機能を使って原因を突き止めるところまでやってみます。
なぜこのお題にしたか
デバッグ機能の説明だけだと、ただの機能紹介で終わってしまいます。
実際にバグを仕込んで「デバッガーを使うとこうやって原因が見つかる」という過程を見せた方が、実践的でイメージが掴みやすいと思い、この形式にしました。
題材には、以前公開した成績管理システム(第1回)のコードを使います。複数の関数・配列・ループを使っているので、デバッグ機能の練習にちょうど良い題材です。

発生した症状
成績管理システムのcalc_average関数(平均点を計算する関数)のループ範囲を、以下のように書き換えました。
修正前(正しいコード)

修正後(バグを仕込んだコード)

実行結果

i = 0から始めるべきところをi = 1から始めてしまっているため、1人目の点数が合計に含まれず、平均点がズレて表示されます。
パッと見ただけでは「なんとなく数字がおかしい」程度にしか分からず、コードを読んだだけでは原因が見つけにくいバグです。
デバッグの基本操作
原因を探る前に、今回使うデバッグ機能の基本を押さえておきます。
ブレークポイントの設定
コードの行番号の左側(余白部分)をクリックすると、赤い丸が表示されます。
これが「ここで一時停止する」という目印(ブレークポイント)です。もう一度クリックすると解除できます。

F5とCtrl+F5の違い
- F5(デバッグ開始):ブレークポイントで一時停止しながら実行します。原因調査にはこちらを使います
- Ctrl+F5(デバッグなしで開始):ブレークポイントを無視してそのまま最後まで実行します。普段の動作確認用です

ステップイン/ステップオーバー/ステップアウト
ブレークポイントで一時停止した後、1行ずつ実行を進めるための操作です。
| 操作 | ショートカット | 内容 |
|---|---|---|
| ステップイン | F11 | 次の行を実行。関数呼び出しがあれば、その関数の中に入る |
| ステップオーバー | F10 | 次の行を実行。関数呼び出しがあっても中には入らず、1行として実行する |
| ステップアウト | Shift+F11 | 今実行中の関数の残りを全部実行して、呼び出し元に戻る |
「関数の中身も1行ずつ見たい」ときはステップイン、
「この関数は正しいと分かっているので中身は見なくていい」ときはステップオーバー、を使い分けます。

ウォッチウィンドウ
一時停止している間、変数の値をリアルタイムで確認できるウィンドウです。
確認したい変数名を入力しておくと、ステップ実行するたびに値がどう変化するか追跡できます。

ウォッチウィンドウはデバッグ時にしか表示されないため、「画面に出ていない!」という方はF5でデバッグ実行し、ブレークポイントで一時停止中に確認してみてください。
自分の環境だと自動でウォッチウィンドウが表示されましたが、
「ウォッチウィンドウが表示されない」「表示されてたのに閉じてしまった」
というような場合は、
「デバッグ」 → 「ウィンドウ」 → 「ウォッチ」の順に選択することで表示が可能です。

ウォッチが1~4までありますが、どれを選択してもOKです。
1つのウォッチウィンドウで確認できる変数に限りがあったり、変数の種類ごとにウォッチウィンドウを分けておくために複数用意されています。
参考:「自動」「ローカル」ウィンドウにも変数が表示される
「自動」「ローカル」ウィンドウにも、自動で変数が表示されます。
ローカル変数(デバッグしている関数内に閉じた変数)の場合は「ローカル」ウィンドウで確認できるため、「ウォッチ」ウィンドウにわざわざ変数を追加しなくても確認可能です。


実演:ウォッチウィンドウでバグを探してみた
以下の手順でデバッグをしてみました。
calc_average関数のforループの行にブレークポイントを設置- F5でデバッグ実行し、ブレークポイントで一時停止することを確認
- ウォッチウィンドウに
iとsumを追加 - F11(ステップイン)で1行ずつ進めながら、
iとsumの値がどう変化するかを確認 - 本来
i = 0から始まるはずが、i = 1から始まっていることに気づく
各手順の画像も載せていきます。
①calc_average関数のforループの行にブレークポイントを設置

②F5でデバッグ実行し、ブレークポイントで一時停止することを確認
「F5」キーをキーボード上で押せばOKですが、以下の塗りつぶし三角マークでも同じ結果になります。


③ウォッチウィンドウにiとsumを追加
「対象変数を右クリック」→「ウォッチの追加」で追加します。


④F11(ステップイン)で1行ずつ進めながら、iとsumの値がどう変化するかを確認
ステップインで関数の中に入って、78行目に来た時点の変数の値を確認します。


⑤本来i = 0から始まるはずが、i = 1から始まっていることに気づく
変数iが1、sumは92になっています。

ここで元のデータを見ると、92は2行目のSuzukiさんの点数のため、1行目のSatoさん(85点)が飛ばされていることが分かります。
i = 0から始まるはずが、i = 1から始まっているため、students[0]のデータが抜けてしまっていることが確認できました。

原因と修正
今回はバグを仕込んでいるため、原因はforループの初期値をi = 0ではなくi = 1にしてしまっていた、ということが分かっています。
修正後に再度実行して、変数iが0、sumは85になっていることを確認しました。


そのまま最後まで実行し、平均点も正しく計算されることを確認できました。

まとめ
- Visual Studioのデバッグ機能を使うと、プログラムを1行ずつ実行しながら変数の値を確認できる
- ブレークポイント・F5/Ctrl+F5・ステップイン/オーバー/アウト・ウォッチウィンドウが基本操作
- 今回のような「パッと見て気づきにくいバグ(オフバイワンエラー)」こそ、デバッガーの実力が発揮される場面
コードを読むだけで全部のバグに気づくのは難しいので、困ったときはぜひデバッグ機能を活用してみてください。
最後まで読んでいただき、ありがとうございました!





コメント