まずはダイアログベースのアプリで・・・3.デバッグ


■ デバッグとは
デバッグとは、既に皆さんご存知でしょうがいわゆる「バグつぶし」すなわち「虫取り」です。世の中にコンピュータができたころ、それはまだ真空管を使った巨大な機械でした。そんな複雑な機械の中を虫が徘徊し部品をダメにした、本当かウソかこんなバグの由来を聞いたことがあります。現在は、殆どソフトウェアの不具合にこの言葉を用いますが、よほどシンプルなプログラムで無い限りバグの無いプログラムは無いと思います。そしてプログラミングの中で最も重要かつ困難な作業がこのバグ取り、デバッグです。
このページでは、VisualC++のデバッグの作業の一部を紹介したいと思います。
以下のサンプルは前回までに作成したダイアローグベースのアプリdlgtestを使って進めます。
(デバッグのやり方がメインなので、手元にこのサンプルが無くても分かると思います)
■ 変数の値を見る
デバッグを行うためには、プログラムをDebugモードで作成する必要があります。ウィザードでプロジェクトを作成した場合、初期状態はデバッグモードになっています。これは、ビルト時に実行ファイル(exe)中とデバッグ情報ファイルにデバッグに必要なデータを作成するモードで当然実行ファイルのサイズも大きくなります。逆にリリースモードはこれらの情報が無く、すっきりした形になっていて、プログラムの出荷はリリースモードで作成したファイルを使います。モードの切り替えは[プロジェクト]メニューの下の[設定]を選択し、[プロジェクトの設定]ダイアログの中の[設定の対象]のコンボボックスで切り替えます。
では、まずデバッグの1つの方法として、TRACE文の使い方を覚えましょう。
よくあるケースとして、ある変数の内容がどうなっているのか知りたい時があります。このサンプルとしてdlgtestで使ったint変数のm_nCountを見てみましょう。確認する場所は、この変数を更新しているCDlgtest::Counter()の中とします。
        void CDlgtestDlg::Counter()
        {
                TRACE( "カウンター=%d\n", m_nCount);
                m_nCount ++;
                m_msg.Format( "%d回ボタンが押されました", m_nCount);
        }
関数内の1行目がTRACE文です。お気づきでしょうが、これはprintf()あるいはCString::Format()と同じ形式です。
結果はアウトプットに表示されます。

実行結果は、上図のようになります。このサンプルではボタンを2回押しました。
■ 指定した位置でプログラムを止める
指定した位置でプログラムを停止させる方法をご紹介します。まず前回のTRACE文のところで止めてみましょう。
まずカーソルをTRACE文の行に持ってきます。その状態で[ビルド]メニューの下の[デバッグの開始]の[カーソル行の前まで実行]を選択します。面倒なので[Ctrl]+F10の方が便利です。コンパイルや実行やこれから後の作業はファンクションキーの方がおすすめです。
実行後に、ダイアログ上に作成した[テストボタン]を押してください。プログラムが中断されカーソルの位置で停止します。

このときはまだTRACE文は実行されていないので、アウトプットにはこの内容は表示されていません。
次に、[デバッグ]の[ステップオーバー](F10)を実行します。この処理は現在の行を実行するものです。TRACEも関数ですが、この処理の中は飛ばして次の行に進むということです。ここで、アウトプットにTRACEの内容が表示されます。
もう一度F10を押すとm_nCountの増加が実行されますが、ここで変数のウィンドウの中のm_nCountが赤字に変わり変数が更新されたことを示します。もう一つの変数の見方として、マウスの矢印カーソルをソース中の変数の上に当ててみてください。自動的に現在の変数が表示されます。これは、とても便利な機能です。

もう、デバックを止めプログラムを通常に進めたい場合は、[実行]F5を選択します。プログラムを中断する場合は、[デバッグの中止](Shift+F5)を選択します。
■ ブレークポイント
前項は、カレント行までの実行でしたが、他のプログラムの停止方法としてブレークポイントの設定があります。ブレークポイントとは、プログラムを停止させる位置を指定することであり、複数のブレークポイントを指定することができます。また、条件を加えることにより、更に複雑なブレークポイントの設定が可能です。例えば、このサンプルで言うとm_nCountの値が5になったら止めるとかもできます。
指定方法ですが、[編集]メニューの下の[ブレークポイント]を選択するとダイアログが表示され、条件により設定しますが、通常はあまり条件を指定することは少ないので、[ビルド]か[ビルド ミニ バー]のツールバーを表示させこの中の手のアイコン[ブレークポイントの挿入/削除]F9を使って設定すると便利です。これはある行を1回選択するとブレークポイントが設定され、もう一度同じ行を選択すると解除されます。選択状態は、ソースウィンドウに●印が表示されるので分かります。
先ほどと同じようにTRACE文をブレークポイントにして実行してみましょう。[テスト ボタン]を押すと先ほどと同じように停止します。

ここから、先は前項と同じです。ただし、ブレークポイントを解除しないと毎回ここで停止してしまいますので、解除を忘れないで下さい。[ブレークポイント]ダイアログの[全て削除]ボタンを押すと全て解除できます。ちなみに、この処理はツールバーに無いので私はツールバーの[カスタマイズ]で[デバッグ]のグループの[全てのブレークポイントを削除]のボタン(手にバッテン)を追加して使っています。
なお、ブレークポイントは、プログラムの実行中でも設定することができます。
■ サンプルプロジェクトファイルのダウンロード
サンプルは、1章と同じファイルです。