デバッグの基本は、問題となっている可能性の高い個所のコードを1ステップ(=1文)ずつ追跡して調べていくことである。それを行うには、怪しいと思われる個所の一歩手前でプログラムの実行を一時的に停止させる必要がある。このプログラムの実行を一時停止する機能を「ブレークポイント」と呼ぶ。このデバッグ方法は、例えていうならば、DVDビデオを一時停止して(=ブレークポイント)、そこからコマ送りで再生する(=1ステップずつ追って調べる)という操作に似ている。
今回のプログラムで問題となっている可能性の高いコードは、先ほど追加したフェード・アウトのコードだ。そこで、menuItemClose_Clickメソッドの中にあるFormFadeOutメソッドにブレークポイントを仕掛けてみることにしよう。次の画面は、実際にブレークポイントを設定しているところだ。
ブレークポイントを設定したら、[F5]キーを押すか、メニュー・バーから[デバッグ]−[デバッグ開始]をクリックして、デバッグ実行を開始する。
デバッグが開始されると「時計」アプリケーションが起動するので、右クリックでコンテキスト・メニューを表示して[終了]を実行してみよう。すると、次の画面のようにブレークポイントを設定した位置で処理が停止するはずだ。
処理を1ステップ(=1文)進めるには、[F10]キーを押す(「ステップ・オーバー」と呼ばれる)。また、メソッド内の処理に入るには、[F11]キーを押す(「ステップ・イン」と呼ばれる)。ここでは、FormFadeOutメソッド内部の処理を調べたいので、ステップ・インの[F11]キーを押す。すると、次の画面のように、FormFadeOutメソッドの内部に移って処理が停止する。
次に[F10]キーでステップ・オーバーして、FormFadeOutメソッドの処理を1ステップずつ進めていってみよう。すると、forループの間をぐるぐると繰り返し実行しているのが分かるだろう。ここで、forループ内にある、変数「n」の値やOpacityプロパティの値がバグの原因として疑わしいので、どうなっているか調べてみよう。これを調べるには、次の画面のように[ウォッチ]ウィンドウを使う。
[ウォッチ]ウィンドウで変数「n」の値を参照すると、「49」から減るはずの値が「51」と逆に増えている。つまりforループのコードで、カウント・アップ(=インクリメント)するのは間違いなのだ(「n++」は1つずつカウント・アップするという意味)。
for (int n = 49; n >= 0; n++)
正しくは、次のようにカウント・ダウン(=デクリメント)しなければならなかったわけだ(「n--」は1つずつカウント・ダウンするという意味)。
for (int n = 49; n >= 0; n--)
このコーディング・ミスにより、プログラムは無限に(厳密には数値の範囲があるので有限だが……)カウント・アップし続け、アプリケーションがフリーズした(「応答なし」の)状態になっていたわけだ。
バグの個所が判明したので、[Shift]+[F5]キーを押すか、メニュー・バーから[デバッグ]−[デバッグの停止]を選択するかして、デバッグ実行を終了する。そして、先ほどのforループのコードの誤りを修正して、再ビルドを行い実行してみよう。すると、次は正常にフェード・アウトしながら、アプリケーションが終了するはずだ。
以上でプログラムは完成した。せっかく作ったので、このプログラムを実際にユーザーに使ってもらえるようにしてみよう。次に、プログラムのリリースと配布について簡単に解説しておく。
Copyright© Digital Advantage Corp. All Rights Reserved.