第21章 デバッグ操作を身につける
この章の目的
Section titled “この章の目的”この章では、Visual Studio のデバッグ操作 を学習します。 操作キー・画面位置などの具体は、書籍「作って覚える Visual C# 2022 デスクトップアプリ超入門」の Chapter 5「デバッグモードで動作を確認する」 も参照できます。
プログラムは、書いたつもりどおりに動かないことがよくあります。
計算結果が違うリストに入っているはずの値が見当たらないどの子クラスのメソッドが呼ばれているのか分からない例外でプログラムが落ちるボタンを押しても何も起きない(GUI)このようなとき、Visual Studio のデバッグ機能 を使うと、プログラムを途中で止めたり、1 行ずつ実行したり、変数やオブジェクトの中身を覗いたりできます。
デバッグ操作はこの章だけでなく、今後のすべての C# プログラミングで使う必須スキル です。 コンソール・オブジェクト指向・DB 接続・Forms・Web アプリのどれでも、同じ操作が使えます。
この章で実際にデバッグするアプリ
第 19 章で作った
SimpleCalcは、処理が短くデバッグの練習にはやや物足りません。そこでこの章では、オブジェクト指向で構造のある講義アプリ をデバッグの題材にします。
- 第 13 章(継承とポリモーフィズム) の講義プロジェクト
Ch13_Inheritance—List<EmployeeBase>と、子クラスごとに動きが変わるGetPaymentAmount()。「同じ呼び出しで、実際にはどの子クラスのメソッドが動くのか」をステップ実行で目撃 できます。- 第 15 章(例外処理) の講義プロジェクト
Ch15_ExceptionHandling—int.Parseでの例外発生を、デバッガーで観察します。新しいプロジェクトは作りません。これまでに作った講義プロジェクトをそのまま開いて使います。
この章で使用する書籍範囲
Section titled “この章で使用する書籍範囲”| 範囲 | 内容 |
|---|---|
| Chapter 5 | デバッグモードで動作を確認する |
本研修では特に次の内容を重視します。
- ブレークポイント
- ステップ実行(ステップイン/ステップオーバー)
- 変数の値の確認(マウスホバー、データヒント、ウォッチ)
- 画面部品のプロパティの確認
この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- ブレークポイントを設定して、プログラムを途中で止められる
- デバッグ実行を開始・停止できる
- ステップ実行で 1 行ずつ処理を追える
- 変数の値や画面部品のプロパティを確認できる
- イベントハンドラーが実行されているか確認できる
- 例外発生時に発生箇所と原因を読み取れる
- 動作確認の結果をもとにプログラムを修正できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| 主に使うプロジェクト | 第 13 章 Ch13_Inheritance、第 15 章 Ch15_ExceptionHandling(新規作成は不要) |
| 補助で使うプロジェクト | 第 19 章 SimpleCalc(GUI のデバッグを試したいとき) |
この章では 新しいプロジェクトを作りません。これまでに作った講義プロジェクトをデバッグ実行して、操作を覚えます。
講義プロジェクトが手元にないときは
Ch13_Inheritance/Ch15_ExceptionHandlingが見当たらない場合は、各章の本文のコードを新しいコンソールプロジェクトに貼り付ければ用意できます。デバッグの題材になればよいので、自分が書いた課題(Kadai13など)のプロジェクトを使っても構いません。
作業前チェック
Section titled “作業前チェック”- 第 13 章
Ch13_Inheritance(または継承・ポリモーフィズムを使った自分の課題)が手元にある - 第 15 章
Ch15_ExceptionHandling(または例外処理を使った自分の課題)が手元にある - それぞれのプロジェクトが Visual Studio で開けて、F5 で実行できる
21-1 デバッグはエラー対応の基本ツール
Section titled “21-1 デバッグはエラー対応の基本ツール”プログラムは、書いたつもりどおりに動かないことがよくあります。 そんなとき、次のような対応をしていませんか?
| やりがちな対応 | 問題点 |
|---|---|
| コードを眺めて考え込む | 思い込みでバグを見落とす |
Console.WriteLine をあちこちに入れる | Forms では出力先が見えにくい |
| 動かないところを何度か書き直す | 偶然動くこともあるが、原因が分からない |
これらに対して デバッグ操作 は、プログラムの実行を 一時停止して中を覗ける 強力な手段です。
コードを眺める 想像で原因を探す ↓デバッグで止めて値を見る 現実の動きを確認する「想像」から「観察」に変わるのが、デバッグの大きな効果です。
21-2 ブレークポイント
Section titled “21-2 ブレークポイント”ブレークポイント は、プログラムの実行を一時停止させる目印です。 気になる行に印を付けておくと、その行に到達した瞬間にプログラムが止まります。
| 操作 | 効果 |
|---|---|
| 行番号の左側をクリック | ブレークポイントを設定/解除(赤い丸印) |
| 「F5 でデバッグ実行」 | ブレークポイントで自動的に停止 |
| 「F5(続行)」 | 停止状態から次のブレークポイントまで進む |
| 「Shift+F5(停止)」 | デバッグを終了 |
具体的な画面操作・ショートカットキーは書籍 Chapter 5 を参照してください。
例: Ch13_Inheritance の Main にある foreach の行にブレークポイントを置く
foreach (EmployeeBase employee in employees) // ← この行の左をクリックして赤丸を付ける{ Console.WriteLine($"{employee.EmployeeName}:{employee.GetPaymentAmount()}円");}- 行番号の左をクリックして赤丸を付ける
- F5 でデバッグ実行
- その行に到達した瞬間、プログラムが停止する
これだけで「いま、この行を実行しようとしている」ことが目で確認できます。停止中に employees の上にマウスを置けば、リストに 2 件入っていることも見えます。
21-3 ステップ実行
Section titled “21-3 ステップ実行”ブレークポイントで止めた後は、ステップ実行 で 1 行ずつ進められます。
| ステップの種類 | 動き |
|---|---|
| ステップオーバー | 現在の行を実行し、次の行へ進む(メソッド呼び出しは中に入らない) |
| ステップイン | メソッド呼び出しがあれば、そのメソッドの中に入る |
| ステップアウト | 現在いるメソッドの 最後まで進んで、呼び出し元に戻る |
迷ったら、まずはステップオーバー で 1 行ずつ進めてみてください。 メソッドの中を詳しく見たいときだけステップインします。
具体的なキー(F10、F11 など)は書籍を参照してください。
ステップインでポリモーフィズムを「目撃」する
Ch13_Inheritanceのemployee.GetPaymentAmount()の行で ステップイン すると、どのクラスのGetPaymentAmount()に入るかが分かります。 1 件目(山田二郎)ではRegularEmployeeのGetPaymentAmount()に、2 件目(田中浩介)ではContractEmployeeのGetPaymentAmount()に入ります。 呼び出しているコードは同じ 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を見ると、実体の型(RegularEmployeeやContractEmployee)が分かります。ポリモーフィズムで「箱は親型、中身は子クラス」になっていることが、値として確認できます。
21-5 イベントハンドラーが実行されているか確認する
Section titled “21-5 イベントハンドラーが実行されているか確認する”Forms アプリでよくあるつまずきの 1 つに、「ボタンを押しても何も起きない」があります。 この原因は、たいてい次のどれかです。
| 原因 | 確認方法 |
|---|---|
| イベントハンドラーが書かれていない | コードに xxx_Click メソッドがあるか |
| ボタンと紐づいていない | プロパティウィンドウの「イベント」タブで Click を確認 |
| 別のボタンに紐づいている | 同上 |
| イベントが起きないコントロールに対して設定している | コントロール種類を確認 |
確認の流れ:
- イベントハンドラーの 1 行目にブレークポイントを設定
- デバッグ実行 → 該当ボタンをクリック
- 止まる → イベントハンドラーは動いている(別の問題)
- 止まらない → イベントハンドラーがボタンと結びついていない
「動かない」と言われたら まずブレークポイントで止まるか確認 ── これが Forms デバッグの第一歩です。
21-6 例外が発生したときの確認
Section titled “21-6 例外が発生したときの確認”実行中に例外が発生すると、Visual Studio は 発生した行で自動的に停止 して、例外の情報を見せてくれます。
例:Ch15_ExceptionHandling で int.Parse(input) を呼び出し、input が "abc" だと…
System.FormatException: 'The input string 'abc' was not in a correct format.'このとき確認すべきこと:
| 観点 | 確認方法 |
|---|---|
| どの行で止まったか | エディター上で黄色く強調表示される |
| 例外の型 | FormatException、NullReferenceException など |
| 例外メッセージ | 例外オブジェクトの Message プロパティ |
| 原因の入力値 | その時点での変数値(input にマウスホバー) |
try-catchがある版・ない版を見比べる第 15 章のコードには、
try-catchで囲んでいない版と囲んだ版があります。囲んでいない版は 例外の発生行で止まって落ちます。try-catchで囲んだ版を同じ"abc"で動かすと、catchの行に処理が移るのをステップ実行で追えます。 「例外が発生する →catchに飛ぶ」という第 15 章の流れを、デバッガーで実際に確認できます。
21-7 デバッグ操作のおすすめの使い方
Section titled “21-7 デバッグ操作のおすすめの使い方”研修の中では、次のような場面でデバッグを積極的に使ってください。
| 場面 | 使い方 |
|---|---|
| アプリが「動かない」とき | イベントハンドラーにブレークポイントを置く |
| 計算結果が変なとき | 計算式の前後をステップ実行で 1 行ずつ確認 |
| 例外が出たとき | 自動で止まった行と変数値を見る |
| 「ここの値はどう変わる?」と気になったとき | ウォッチウィンドウで監視 |
| ループの動きを追いたいとき | ループ内にブレークポイント、F5 で 1 周ずつ進む |
「分からないところがあれば とりあえずブレークポイントで止めて見てみる」というクセを付けると、エラーへの対応力が大きく上がります。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
| ブレークポイントで止まらない | デバッグ実行ではなく Ctrl+F5(デバッグなしの実行)を使っている | F5(デバッグ実行)で起動 |
| ブレークポイントの位置がずれる | 編集中に位置がずれたまま再実行 | 一度解除してから設定し直す |
| 変数の値がマウスホバーで見えない | 停止中ではないとき | ブレークポイントで止まった状態で操作 |
| ステップインがメソッドに入らない | システム側のメソッド(int.Parse など)はステップオーバーで進む | 自作メソッドはステップインで入れる |
| 「処理が固まった」ように見える | ブレークポイントで止まっているだけ | Visual Studio に切り替えて F5 で続行 |
| 例外でアプリが落ちる | 例外処理がない | 第 15 章の try-catch / int.TryParse を使う |
学んだことチェック
Section titled “学んだことチェック”- ブレークポイントを設定・解除できる
- F5(デバッグ実行)で起動して、ブレークポイントで止められる
- ステップオーバー・ステップイン・ステップアウトの違いを説明できる
- 変数や画面部品のプロパティの値を確認できる
- ウォッチウィンドウで複数の値を監視できる
- リストや自作オブジェクトの中身を展開して確認できる
- ステップインで、ポリモーフィズムが実体に応じて違うメソッドに入ることを確認できる
- イベントハンドラーが実行されているかを確認できる
- 例外発生時に発生箇所と入力値を確認できる
- エラー対応の手順としてデバッグを使えるようになった
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
- ブレークポイントとは何ですか。
- ステップオーバーとステップインの違いは何ですか。
List<EmployeeBase>の中身や、employeeが実際には何型かを、デバッガーで確認するにはどうしますか。- ステップインでポリモーフィズムが「見える」とは、どういうことですか。
- 例外が発生したとき、デバッガーから何が分かりますか。
- (GUI)「ボタンを押しても何も起きない」とき、まず何を確認しますか。
この章は デバッガの使い方を身につけること が目的です。プロジェクトの提出はありません。
講義で作った Ch13_Inheritance と Ch15_ExceptionHandling を題材に、デバッグ操作を実際に試してください。
進め方
第 16・17 章から始めた チームでの自走(役割分担=リーダー / 技術部長 / タイムキーパー。詳しくは第 17 章「ここからはチームで進める」)で進めます。本文を見ながら自分のペースで操作し、最後に「デバッグ観察メモ」を書いて、チーム内で一言ずつ共有します。
新しいプロジェクトは作りません。手元の講義プロジェクトを開いて操作します。
体験 21-1 ポリモーフィズムをステップ実行で目撃する(Ch13_Inheritance)
Section titled “体験 21-1 ポリモーフィズムをステップ実行で目撃する(Ch13_Inheritance)”Ch13_Inheritance を開き、Main の foreach を題材に、ポリモーフィズムが動く様子を観察します。
手順
foreach (EmployeeBase employee in employees)の行にブレークポイントを設定- F5 でデバッグ実行 → その行で停止
employeesにマウスホバー(または▶を展開)→ 2 件入っていることを確認employee.GetPaymentAmount()の行で ステップイン(F11)- どのクラスの
GetPaymentAmount()に入ったか を確認(1 件目=RegularEmployee、2 件目=ContractEmployee) - ステップアウトで
foreachに戻り、F5 で次の周回へ。2 件目も同じように確認 - ウォッチに
employee.GetType().Nameを追加し、周回ごとに型が変わるのを観察
確認すること
- ブレークポイントで止まり、ステップインできた
- 1 件目と 2 件目で、入る
GetPaymentAmount()の クラスが違う ことを確認した -
employee.GetType().NameがRegularEmployee→ContractEmployeeと変わるのを見た - 戻り値(500000 / 216000)が、それぞれのクラスの計算で出ていることを確認した
ステップインがうまく
GetPaymentAmount()に入らないとき
Console.WriteLine(...)の行には複数の呼び出しが含まれるため、F11 でEmployeeNameの取得など別の場所に入ってしまうことがあります。そのときは Shift+F11(ステップアウト) で抜けて、もう一度 F11 を押すと、目的のGetPaymentAmount()に入れます。
体験 21-2 リストの中身をのぞく(Ch13_Inheritance)
Section titled “体験 21-2 リストの中身をのぞく(Ch13_Inheritance)”同じ Ch13_Inheritance で、停止中に リストとオブジェクトの中身 を観察します。
手順
foreachの行で停止した状態にする- ローカルウィンドウ(またはウォッチ)で
employeesの▶を開く [0][1]を展開し、各社員のEmployeeNameやフィールドの値を確認- ウォッチに
employees.Countを追加して件数を確認
確認すること
-
employeesを展開して、各要素のプロパティ値を確認できた -
employees.Countが 2 であることを確認できた - 「リストに何が入っているか」をデバッガーで確認し、言葉にできる
体験 21-3 例外の発生と catch への流れを追う(Ch15_ExceptionHandling)
Section titled “体験 21-3 例外の発生と catch への流れを追う(Ch15_ExceptionHandling)”Ch15_ExceptionHandling を開き、例外発生時のデバッガーの動きを観察します。
第 15 章では int.Parse を try-catch で囲まない版(プログラムが落ちる)と 囲んだ版(catch で受け止める)の両方を書きました。手元の Program.cs がどちらでも体験できます。
手順
int.Parse(input)の行にブレークポイントを設定- F5 で実行し、
整数を入力してください:と出たらabc(数値でない文字)を入力 - ブレークポイントで停止 →
inputにマウスホバーして値が"abc"であることを確認 - ステップオーバー(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. 気づき・詰まったこと(一言) -チーム内で一言共有
書いたメモをもとに、チーム内で一人ずつ ごく簡単に共有 します。「ポリモーフィズムが実際に動くのを見てこう感じた」「例外がこの行で止まった」など、一言で十分です。 リーダーは全員が一度は話せるように、タイムキーパーは時間を見て進行を助けてください。 このメモは提出不要ですが、手元に残しておく と後でデバッグするときの自分用チェックリストになります。
体験完了のチェックリスト
Section titled “体験完了のチェックリスト”-
Ch13_Inheritanceをデバッグ実行し、ブレークポイントで止められた - ステップイン / ステップオーバー / ステップアウトを使い分けられた
- ポリモーフィズムで、実体に応じて違うクラスのメソッドに入ることを確認できた
-
employeesリストやオブジェクトの中身を展開して確認できた -
Ch15_ExceptionHandlingで、例外の発生行・型・メッセージを読み取れた - デバッグ後、不要なブレークポイントは解除した
-
デバッグ観察メモ.txtを書き、チーム内で一言共有した
この章の成果について
Section titled “この章の成果について”この章では 新しいプロジェクトを作らず、Git への提出も行いません。
デバッグ操作を身につけ、デバッグ観察メモ.txt に観察結果を残せたことが、この章の成果です。
- 観察メモは提出不要ですが、手元に保存しておきましょう(今後デバッグするときの自分用の手順メモになります)。
- デバッグの過程で、講義プロジェクトに小さな修正や実験を加えてもかまいません(提出は不要です)。
デバッグ操作は、第 23 章以降の Windows フォーム・DB アプリでも繰り返し使います。「動かない・値が変・例外が出た」と思ったら、まずブレークポイントで止めて中を見る ── このクセをここで付けておきましょう。
この章のまとめ
Section titled “この章のまとめ”- デバッグ操作は、エラー対応・動作確認の 必須スキル
- ブレークポイント で実行を一時停止できる
- ステップ実行(オーバー/イン/アウト)で 1 行ずつ進められる
- 停止中は 変数・画面部品のプロパティ をマウスホバー・ウォッチウィンドウで確認できる
- 「動かない」ときは、まずイベントハンドラーにブレークポイントを置いて 動いているかを確認 する
- 例外発生時は、Visual Studio が 発生箇所と例外情報 を示してくれる
- 第 15 章の
try-catch/int.TryParseと組み合わせて使う
ここまでで、オブジェクト指向のプログラムや GUI アプリを、デバッガーで 観察 する方法を学びました。「想像」ではなく「観察」でエラーに向き合う土台ができました。
次章 第 22 章「CSV 読み書きと DataGridView」 では、表形式のデータ を Windows フォームで扱う方法を学びます。
DataGridView という新しいコントロールが登場し、ここから先のアプリ作成で 必須の部品 になっていきます。
その先(第 23 章以降)では、本研修のオリジナル内容として、第 16・17 章で構築・操作した SQLServer の TrainingDB からデータを取得し、DataGridView に表示する社員管理アプリへと発展させていきます。