Skip to content

第21章 デバッグ操作を身につける

この章では、Visual Studio のデバッグ操作 を学習します。 操作キー・画面位置などの具体は、書籍「作って覚える Visual C# 2022 デスクトップアプリ超入門」の Chapter 5「デバッグモードで動作を確認する」 も参照できます。

プログラムは、書いたつもりどおりに動かないことがよくあります。

計算結果が違う
リストに入っているはずの値が見当たらない
どの子クラスのメソッドが呼ばれているのか分からない
例外でプログラムが落ちる
ボタンを押しても何も起きない(GUI)

このようなとき、Visual Studio のデバッグ機能 を使うと、プログラムを途中で止めたり、1 行ずつ実行したり、変数やオブジェクトの中身を覗いたりできます。

デバッグ操作はこの章だけでなく、今後のすべての C# プログラミングで使う必須スキル です。 コンソール・オブジェクト指向・DB 接続・Forms・Web アプリのどれでも、同じ操作が使えます。

この章で実際にデバッグするアプリ

第 19 章で作った SimpleCalc は、処理が短くデバッグの練習にはやや物足りません。そこでこの章では、オブジェクト指向で構造のある講義アプリ をデバッグの題材にします。

  • 第 13 章(継承とポリモーフィズム) の講義プロジェクト Ch13_InheritanceList<EmployeeBase> と、子クラスごとに動きが変わる GetPaymentAmount()「同じ呼び出しで、実際にはどの子クラスのメソッドが動くのか」をステップ実行で目撃 できます。
  • 第 15 章(例外処理) の講義プロジェクト Ch15_ExceptionHandlingint.Parse での例外発生を、デバッガーで観察します。

新しいプロジェクトは作りません。これまでに作った講義プロジェクトをそのまま開いて使います。


範囲内容
Chapter 5デバッグモードで動作を確認する

本研修では特に次の内容を重視します。

  • ブレークポイント
  • ステップ実行(ステップイン/ステップオーバー)
  • 変数の値の確認(マウスホバー、データヒント、ウォッチ)
  • 画面部品のプロパティの確認

この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • ブレークポイントを設定して、プログラムを途中で止められる
  • デバッグ実行を開始・停止できる
  • ステップ実行で 1 行ずつ処理を追える
  • 変数の値や画面部品のプロパティを確認できる
  • イベントハンドラーが実行されているか確認できる
  • 例外発生時に発生箇所と原因を読み取れる
  • 動作確認の結果をもとにプログラムを修正できる

項目内容
開発環境Visual Studio 2022
主に使うプロジェクト第 13 章 Ch13_Inheritance、第 15 章 Ch15_ExceptionHandling(新規作成は不要)
補助で使うプロジェクト第 19 章 SimpleCalc(GUI のデバッグを試したいとき)

この章では 新しいプロジェクトを作りません。これまでに作った講義プロジェクトをデバッグ実行して、操作を覚えます。

講義プロジェクトが手元にないときは

Ch13_Inheritance / Ch15_ExceptionHandling が見当たらない場合は、各章の本文のコードを新しいコンソールプロジェクトに貼り付ければ用意できます。デバッグの題材になればよいので、自分が書いた課題(Kadai13 など)のプロジェクトを使っても構いません。


  • 第 13 章 Ch13_Inheritance(または継承・ポリモーフィズムを使った自分の課題)が手元にある
  • 第 15 章 Ch15_ExceptionHandling(または例外処理を使った自分の課題)が手元にある
  • それぞれのプロジェクトが Visual Studio で開けて、F5 で実行できる

21-1 デバッグはエラー対応の基本ツール

Section titled “21-1 デバッグはエラー対応の基本ツール”

プログラムは、書いたつもりどおりに動かないことがよくあります。 そんなとき、次のような対応をしていませんか?

やりがちな対応問題点
コードを眺めて考え込む思い込みでバグを見落とす
Console.WriteLine をあちこちに入れるForms では出力先が見えにくい
動かないところを何度か書き直す偶然動くこともあるが、原因が分からない

これらに対して デバッグ操作 は、プログラムの実行を 一時停止して中を覗ける 強力な手段です。

コードを眺める 想像で原因を探す
デバッグで止めて値を見る 現実の動きを確認する

「想像」から「観察」に変わるのが、デバッグの大きな効果です。


ブレークポイント は、プログラムの実行を一時停止させる目印です。 気になる行に印を付けておくと、その行に到達した瞬間にプログラムが止まります。

操作効果
行番号の左側をクリックブレークポイントを設定/解除(赤い丸印)
「F5 でデバッグ実行」ブレークポイントで自動的に停止
「F5(続行)」停止状態から次のブレークポイントまで進む
「Shift+F5(停止)」デバッグを終了

具体的な画面操作・ショートカットキーは書籍 Chapter 5 を参照してください。

例: Ch13_InheritanceMain にある foreach の行にブレークポイントを置く

foreach (EmployeeBase employee in employees) // ← この行の左をクリックして赤丸を付ける
{
Console.WriteLine($"{employee.EmployeeName}:{employee.GetPaymentAmount()}");
}
  1. 行番号の左をクリックして赤丸を付ける
  2. F5 でデバッグ実行
  3. その行に到達した瞬間、プログラムが停止する

これだけで「いま、この行を実行しようとしている」ことが目で確認できます。停止中に employees の上にマウスを置けば、リストに 2 件入っていることも見えます。


ブレークポイントで止めた後は、ステップ実行 で 1 行ずつ進められます。

ステップの種類動き
ステップオーバー現在の行を実行し、次の行へ進む(メソッド呼び出しは中に入らない)
ステップインメソッド呼び出しがあれば、そのメソッドの中に入る
ステップアウト現在いるメソッドの 最後まで進んで、呼び出し元に戻る

迷ったら、まずはステップオーバー で 1 行ずつ進めてみてください。 メソッドの中を詳しく見たいときだけステップインします。

具体的なキー(F10、F11 など)は書籍を参照してください。

ステップインでポリモーフィズムを「目撃」する

Ch13_Inheritanceemployee.GetPaymentAmount() の行で ステップイン すると、どのクラスの GetPaymentAmount() に入るかが分かります。 1 件目(山田二郎)では RegularEmployeeGetPaymentAmount() に、2 件目(田中浩介)では ContractEmployeeGetPaymentAmount() に入ります。 呼び出しているコードは同じ 1 行なのに、実体に応じて違うメソッドへ飛ぶ ── 第 13 章で学んだポリモーフィズムが、実際に動いている様子をその目で確認できます。


21-4 変数とプロパティの値を確認する

Section titled “21-4 変数とプロパティの値を確認する”

停止中は、変数の 現在の値 を簡単に見られます。

方法操作
マウスホバー変数や式の上にマウスを置く → 値がツールチップで表示
データヒント値を表示したまま固定できる
ウォッチウィンドウ監視したい変数・式を一覧で常時表示
ローカルウィンドウ現在のメソッド内のローカル変数を自動表示

オブジェクトの中身も展開して見られます。リストや自作クラスのデバッグでは、これが非常に便利です。

監視できる例(Ch13_Inheritance の foreach で停止中)
employee ← いま処理中の社員オブジェクト
employee.EmployeeName ← 名前(山田二郎 など)
employee.GetType().Name ← 実際の型(RegularEmployee / ContractEmployee)
employees ← リスト全体(▶ を開くと [0] [1] と中身を展開できる)
employees.Count ← リストの件数(2)

employees のような リストや自作オブジェクトは、ウォッチやローカルウィンドウで を開くと中身を展開 できます。 「リストに何件、どんなオブジェクトが入っているか」「いま処理中の employee は実際には何型か」を、その場で確認できるのがデバッグの強みです。

employee の「本当の型」を見る

foreach の変数 employee の宣言型は EmployeeBase ですが、ウォッチで employee.GetType().Name を見ると、実体の型(RegularEmployeeContractEmployee)が分かります。ポリモーフィズムで「箱は親型、中身は子クラス」になっていることが、値として確認できます。


21-5 イベントハンドラーが実行されているか確認する

Section titled “21-5 イベントハンドラーが実行されているか確認する”

Forms アプリでよくあるつまずきの 1 つに、「ボタンを押しても何も起きない」があります。 この原因は、たいてい次のどれかです。

原因確認方法
イベントハンドラーが書かれていないコードに xxx_Click メソッドがあるか
ボタンと紐づいていないプロパティウィンドウの「イベント」タブで Click を確認
別のボタンに紐づいている同上
イベントが起きないコントロールに対して設定しているコントロール種類を確認

確認の流れ:

  1. イベントハンドラーの 1 行目にブレークポイントを設定
  2. デバッグ実行 → 該当ボタンをクリック
  3. 止まる → イベントハンドラーは動いている(別の問題)
  4. 止まらない → イベントハンドラーがボタンと結びついていない

「動かない」と言われたら まずブレークポイントで止まるか確認 ── これが Forms デバッグの第一歩です。


21-6 例外が発生したときの確認

Section titled “21-6 例外が発生したときの確認”

実行中に例外が発生すると、Visual Studio は 発生した行で自動的に停止 して、例外の情報を見せてくれます。

例:Ch15_ExceptionHandlingint.Parse(input) を呼び出し、input"abc" だと…

System.FormatException: 'The input string 'abc' was not in a correct format.'

このとき確認すべきこと:

観点確認方法
どの行で止まったかエディター上で黄色く強調表示される
例外の型FormatExceptionNullReferenceException など
例外メッセージ例外オブジェクトの Message プロパティ
原因の入力値その時点での変数値(input にマウスホバー)

try-catch がある版・ない版を見比べる

第 15 章のコードには、try-catch で囲んでいない版と囲んだ版があります。囲んでいない版は 例外の発生行で止まって落ちますtry-catch で囲んだ版を同じ "abc" で動かすと、catch の行に処理が移るのをステップ実行で追えます。 「例外が発生する → catch に飛ぶ」という第 15 章の流れを、デバッガーで実際に確認できます。


21-7 デバッグ操作のおすすめの使い方

Section titled “21-7 デバッグ操作のおすすめの使い方”

研修の中では、次のような場面でデバッグを積極的に使ってください。

場面使い方
アプリが「動かない」ときイベントハンドラーにブレークポイントを置く
計算結果が変なとき計算式の前後をステップ実行で 1 行ずつ確認
例外が出たとき自動で止まった行と変数値を見る
「ここの値はどう変わる?」と気になったときウォッチウィンドウで監視
ループの動きを追いたいときループ内にブレークポイント、F5 で 1 周ずつ進む

「分からないところがあれば とりあえずブレークポイントで止めて見てみる」というクセを付けると、エラーへの対応力が大きく上がります。


つまずき原因対応
ブレークポイントで止まらないデバッグ実行ではなく Ctrl+F5(デバッグなしの実行)を使っているF5(デバッグ実行)で起動
ブレークポイントの位置がずれる編集中に位置がずれたまま再実行一度解除してから設定し直す
変数の値がマウスホバーで見えない停止中ではないときブレークポイントで止まった状態で操作
ステップインがメソッドに入らないシステム側のメソッド(int.Parse など)はステップオーバーで進む自作メソッドはステップインで入れる
「処理が固まった」ように見えるブレークポイントで止まっているだけVisual Studio に切り替えて F5 で続行
例外でアプリが落ちる例外処理がない第 15 章の try-catch / int.TryParse を使う

  • ブレークポイントを設定・解除できる
  • F5(デバッグ実行)で起動して、ブレークポイントで止められる
  • ステップオーバー・ステップイン・ステップアウトの違いを説明できる
  • 変数や画面部品のプロパティの値を確認できる
  • ウォッチウィンドウで複数の値を監視できる
  • リストや自作オブジェクトの中身を展開して確認できる
  • ステップインで、ポリモーフィズムが実体に応じて違うメソッドに入ることを確認できる
  • イベントハンドラーが実行されているかを確認できる
  • 例外発生時に発生箇所と入力値を確認できる
  • エラー対応の手順としてデバッグを使えるようになった

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. ブレークポイントとは何ですか。
  2. ステップオーバーとステップインの違いは何ですか。
  3. List<EmployeeBase> の中身や、employee が実際には何型かを、デバッガーで確認するにはどうしますか。
  4. ステップインでポリモーフィズムが「見える」とは、どういうことですか。
  5. 例外が発生したとき、デバッガーから何が分かりますか。
  6. (GUI)「ボタンを押しても何も起きない」とき、まず何を確認しますか。

この章は デバッガの使い方を身につけること が目的です。プロジェクトの提出はありません。 講義で作った Ch13_InheritanceCh15_ExceptionHandling を題材に、デバッグ操作を実際に試してください。

進め方

第 16・17 章から始めた チームでの自走(役割分担=リーダー / 技術部長 / タイムキーパー。詳しくは第 17 章「ここからはチームで進める」)で進めます。本文を見ながら自分のペースで操作し、最後に「デバッグ観察メモ」を書いて、チーム内で一言ずつ共有します。

新しいプロジェクトは作りません。手元の講義プロジェクトを開いて操作します。


体験 21-1 ポリモーフィズムをステップ実行で目撃する(Ch13_Inheritance)

Section titled “体験 21-1 ポリモーフィズムをステップ実行で目撃する(Ch13_Inheritance)”

Ch13_Inheritance を開き、Mainforeach を題材に、ポリモーフィズムが動く様子を観察します。

手順

  1. foreach (EmployeeBase employee in employees) の行にブレークポイントを設定
  2. F5 でデバッグ実行 → その行で停止
  3. employees にマウスホバー(または を展開)→ 2 件入っていることを確認
  4. employee.GetPaymentAmount() の行で ステップイン(F11)
  5. どのクラスの GetPaymentAmount() に入ったか を確認(1 件目=RegularEmployee、2 件目=ContractEmployee)
  6. ステップアウトで foreach に戻り、F5 で次の周回へ。2 件目も同じように確認
  7. ウォッチに employee.GetType().Name を追加し、周回ごとに型が変わるのを観察

確認すること

  • ブレークポイントで止まり、ステップインできた
  • 1 件目と 2 件目で、入る GetPaymentAmount()クラスが違う ことを確認した
  • employee.GetType().NameRegularEmployeeContractEmployee と変わるのを見た
  • 戻り値(500000 / 216000)が、それぞれのクラスの計算で出ていることを確認した

ステップインがうまく GetPaymentAmount() に入らないとき

Console.WriteLine(...) の行には複数の呼び出しが含まれるため、F11 で EmployeeName の取得など別の場所に入ってしまうことがあります。そのときは Shift+F11(ステップアウト) で抜けて、もう一度 F11 を押すと、目的の GetPaymentAmount() に入れます。


体験 21-2 リストの中身をのぞく(Ch13_Inheritance)

Section titled “体験 21-2 リストの中身をのぞく(Ch13_Inheritance)”

同じ Ch13_Inheritance で、停止中に リストとオブジェクトの中身 を観察します。

手順

  1. foreach の行で停止した状態にする
  2. ローカルウィンドウ(またはウォッチ)で employees を開く
  3. [0] [1] を展開し、各社員の EmployeeName やフィールドの値を確認
  4. ウォッチに employees.Count を追加して件数を確認

確認すること

  • employees を展開して、各要素のプロパティ値を確認できた
  • employees.Count が 2 であることを確認できた
  • 「リストに何が入っているか」をデバッガーで確認し、言葉にできる

体験 21-3 例外の発生と catch への流れを追う(Ch15_ExceptionHandling)

Section titled “体験 21-3 例外の発生と catch への流れを追う(Ch15_ExceptionHandling)”

Ch15_ExceptionHandling を開き、例外発生時のデバッガーの動きを観察します。 第 15 章では int.Parsetry-catch で囲まない版(プログラムが落ちる)と 囲んだ版(catch で受け止める)の両方を書きました。手元の Program.cs がどちらでも体験できます。

手順

  1. int.Parse(input) の行にブレークポイントを設定
  2. F5 で実行し、整数を入力してください: と出たら abc(数値でない文字)を入力
  3. ブレークポイントで停止 → input にマウスホバーして値が "abc" であることを確認
  4. ステップオーバー(F10)int.Parse の行を実行する。すると例外が発生し…
    • try-catch で囲んでいない版:例外が処理されず、その行に 例外ヘルパー(例外の説明ポップアップ)が表示される → 例外の型(FormatException)とメッセージ を読む
    • try-catch で囲んだ版:実行が try の続きを飛ばして catch ブロックに移る のが見える(例外発生 → catch への流れ)。catch (Exception ex) の版なら、ex をウォッチに追加して型・メッセージを確認できる

確認すること

  • 停止中に input の値が "abc" であることを確認できた
  • 発生した例外の型が FormatException であることを確認できた
  • (try-catch の版)ステップ実行で catch ブロックに処理が移るのを確認できた

発展(任意):第 14 章 Ch14_Interface など、別の講義アプリでも同じデバッグ操作を試してみましょう。インターフェイス越しの呼び出しでも、ステップインで実体のメソッドに入る様子が観察できます。GUI に慣れたい人は、第 19 章の SimpleCalc でボタンの Click ハンドラーにブレークポイントを置く練習(21-5)もしておくと、第 23 章以降で役立ちます。


デバッグ観察メモを書く(成果の確認)

Section titled “デバッグ観察メモを書く(成果の確認)”

提出するプロジェクトはありませんが、何を観察できたかを「デバッグ観察メモ」 にまとめます。 テキストエディタ(メモ帳など)で デバッグ観察メモ.txt を作り、次の項目を自分の言葉で埋めてください。

■ デバッグ観察メモ(第21章) 氏名:〇〇
1. ポリモーフィズム(体験21-1)
- employee.GetPaymentAmount() でステップインしたとき、
1件目は( )クラス、2件目は( )クラスに入った
- employee.GetType().Name の値:1件目=( )、2件目=( )
2. リストの中身(体験21-2)
- employees の件数:( )件
- [0] の名前:( )、[1] の名前:( )
3. 例外(体験21-3)
- 止まった行:( )
- 例外の型:( )、メッセージの要点:( )
- 原因になった入力値:( )
4. 気づき・詰まったこと(一言)
-

チーム内で一言共有

書いたメモをもとに、チーム内で一人ずつ ごく簡単に共有 します。「ポリモーフィズムが実際に動くのを見てこう感じた」「例外がこの行で止まった」など、一言で十分です。 リーダーは全員が一度は話せるように、タイムキーパーは時間を見て進行を助けてください。 このメモは提出不要ですが、手元に残しておく と後でデバッグするときの自分用チェックリストになります。


  • Ch13_Inheritance をデバッグ実行し、ブレークポイントで止められた
  • ステップイン / ステップオーバー / ステップアウトを使い分けられた
  • ポリモーフィズムで、実体に応じて違うクラスのメソッドに入ることを確認できた
  • employees リストやオブジェクトの中身を展開して確認できた
  • Ch15_ExceptionHandling で、例外の発生行・型・メッセージを読み取れた
  • デバッグ後、不要なブレークポイントは解除した
  • デバッグ観察メモ.txt を書き、チーム内で一言共有した

この章では 新しいプロジェクトを作らず、Git への提出も行いません。 デバッグ操作を身につけ、デバッグ観察メモ.txt に観察結果を残せたことが、この章の成果です。

  • 観察メモは提出不要ですが、手元に保存しておきましょう(今後デバッグするときの自分用の手順メモになります)。
  • デバッグの過程で、講義プロジェクトに小さな修正や実験を加えてもかまいません(提出は不要です)。

デバッグ操作は、第 23 章以降の Windows フォーム・DB アプリでも繰り返し使います。「動かない・値が変・例外が出た」と思ったら、まずブレークポイントで止めて中を見る ── このクセをここで付けておきましょう。


  • デバッグ操作は、エラー対応・動作確認の 必須スキル
  • ブレークポイント で実行を一時停止できる
  • ステップ実行(オーバー/イン/アウト)で 1 行ずつ進められる
  • 停止中は 変数・画面部品のプロパティ をマウスホバー・ウォッチウィンドウで確認できる
  • 「動かない」ときは、まずイベントハンドラーにブレークポイントを置いて 動いているかを確認 する
  • 例外発生時は、Visual Studio が 発生箇所と例外情報 を示してくれる
  • 第 15 章の try-catch / int.TryParse と組み合わせて使う

ここまでで、オブジェクト指向のプログラムや GUI アプリを、デバッガーで 観察 する方法を学びました。「想像」ではなく「観察」でエラーに向き合う土台ができました。

次章 第 22 章「CSV 読み書きと DataGridView」 では、表形式のデータ を Windows フォームで扱う方法を学びます。 DataGridView という新しいコントロールが登場し、ここから先のアプリ作成で 必須の部品 になっていきます。

その先(第 23 章以降)では、本研修のオリジナル内容として、第 16・17 章で構築・操作した SQLServer の TrainingDB からデータを取得し、DataGridView に表示する社員管理アプリへと発展させていきます。