本稿では、データを表示するプログラムを例に、デバッグ機能を紹介していきます。

前回は、Visual Studioの基本的なデバッグ機能について紹介しました。今回は、本格的なソフトウェア開発に役立つ、以下のデバッグ機能について紹介していきます。

・ステップオーバー
・ステップアウト
・呼び出し履歴ウィンドウ
・ビジュアライザ
・ウォッチウィンドウ
・イミディエイトウィンドウ
・出力ウィンドウ
・例外処理アシスタント

プログラムの例

以下のサンプルは、データベースから書籍の一覧を取得して表示するアプリケーションです。[表示]ボタンをクリックすると、条件に合致した価格帯の書籍一覧と、それらの価格の合計を表示します。

1000円以上の書籍が表示されるが合計が間違っている

ドロップダウンリストで1000円を選択した場合、一覧に正しく表示されます。しかし合計額の計算結果が正しくは9000円のはずが4000円と間違っています。

2000円以上の書籍一覧が正しく表示されない

また、2000円を選択した場合には、正しくは3件のはずが2件しか表示されません。 この2つのバグ(合計ミスと抽出ミス)の原因を見つけて修正していきましょう。

サンプルプログラムの概要

デバッグを始める前に、プログラムの流れについて簡単に説明しておきます。

プログラムの構成

1.[表示]ボタンをクリックすると、btnSelect_Clickメソッドが呼ばれます。
2.データアクセス用に作ったDataAccessクラスのGetAllBooksメソッドを呼び出します。
3.GetAllBooksメソッドでは商品テーブルから全書籍データを取得してDataTable(テーブルのデータを格納できるクラス)にセットして戻します。
4. ドロップダウンで選択した価格の条件に応じてDataView(DataTableのデータを抽出したり並び替えしたりできるクラス)を使ってフィルタリングします。
5. DataViewをループして合計価格を算出します。
6.結果をWindowsフォームに反映させます。

なお、本稿は、Visual Studioのデバッグ機能について理解することが目的ですので、プログラムの詳細までは把握できなくても結構です(バグ修正前の全体のコードは最後のページに掲載しています)。

ステップオーバー

それではデバッグを始めていきましょう。 [表示]ボタンをクリックしたときの処理に問題がありますので、btnSelect_Clickメソッドにブレークポイントを設定します。そして、GetAllBooksメソッドを呼び出す行までステップイン(F11キー)で1行づつ実行します。

GetAllBooksメソッドを呼び出す前に一時停止したところ

ここでは[デバッグ]メニューの[ステップオーバー](F10キー)を利用してみましょう。

ステップオーバーした場合(GetAllBooksメソッドは背後で実行され、表示中のコードの次行に進む)

1000円以上の書籍表示は正常に動作していたのでGetAllBooksメソッドは問題ないと想像できます。このような時には、ステップインではなく、ステップオーバーを使うことでGetAllBooksメソッドを背後で実行して、表示中のコードでの次行に進むことができます。 もし、ステップインを使用すると、1行づつ実行するためGetAllBooksメソッドの中に入ってしまいます。

ステップアウト

もし間違って、動作を見なくて良いと思う関数(メソッドやプロパティ)の中に入ってしまった場合には、[デバッグ]メニューの[ステップアウト](Shift+F11)を利用できます。

関数の中に入った状態(GetAllBooksメソッドの中)

ステップアウトを利用すると、現在実行中の関数を即座に完了して、その関数の呼び出し元のコードに戻れます。

ステップアウトして呼び出し元に戻ってきたところ

ステップアウトすると、GetAllBooksメソッドの実行を完了して、その命令を呼び出したコードに戻ったところでストップします。

ステップ実行のまとめ

ステップ実行だけで3つも種類があるので複雑に感じるかもしれませんが、良く利用する機能なのでショートカットキーも含めて覚えておくと良いでしょう。

ステップ実行の種類

名前 ショートカットキー 意味
ステップイン F11 1行進む(関数の中に入る)
ステップオーバー F10 1行進む(関数の中に入らない)
ステップアウト Shift-F11 関数を抜けて呼び出し元に戻る

大抵のアプリケーションは、今回のサンプル以上に多くのプログラムから構成されています。そのため、プログラムの流れを把握するときはステップオーバーを重点的に使い、詳細を調査したい場所ではステップインとステップアウトを上手く使うと効率的にデバッグできるでしょう。