デバッグの基本は、問題となっている可能性の高い箇所のコードを1ステップ(=1文)ずつ追跡して調べていくことである。それを行うには、怪しいと思われる箇所の一歩手前でプログラムの実行を一時的に停止させる必要がある。このプログラムの実行を一時停止する機能を「ブレークポイント」と呼ぶ。このデバッグ方法は、例えていうならば、DVDビデオを一時停止して(=ブレークポイント)、そこからコマ送りで再生する(=1ステップずつ追って調べる)という操作に似ている。
今回のプログラムで問題となっている可能性の高いコードは、先ほど追加したフェードアウトのコードだ(なぜなら、フェードアウトを行う前は問題なく動作していたからだ)。そこで、menuItemClose_Clickメソッドの中にあるFormFadeOutメソッドにブレークポイントを仕掛けてみることにしよう。次の画面は、実際にブレークポイントを設定しているところだ。
ブレークポイントを設定したら、[F5]キーを押すか、メニューバーから[デバッグ]−[デバッグ開始]をクリックして、デバッグ実行を開始する。
デバッグが開始されると「時計」アプリが起動するので、右クリックでコンテキストメニューを表示して[終了]を実行してみよう。すると、次の画面のようにブレークポイントを設定した位置で処理が停止するはずだ。
処理を1ステップ(=1文)進めるには、[F10]キーを押す(「ステップオーバー」と呼ばれる)。また、メソッド内の処理に入るには、[F11]キーを押す(「ステップイン」と呼ばれる)。ここでは、FormFadeOutメソッド内部の処理を調べたいので、ステップインの[F11]キーを押す。すると、次の画面のように、FormFadeOutメソッドの内部に移って処理が停止する。
次に[F10]キーでステップオーバーして、FormFadeOutメソッドの処理を1ステップずつ進めていってみよう。すると、forループの間をぐるぐると繰り返し実行しているのが分かるだろう。ここで、forループ内にある、変数「n」の値やOpacityプロパティの値がバグの原因として疑わしいので、どうなっているか調べてみよう。これを調べるには、次の画面のように[ウォッチ]ウィンドウを使う。
[ウォッチ]ウィンドウで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ループのコードの誤りを修正して、再ビルドを行い、もう一度デバッグ実行をしてみよう。
フォームを右クリックしてコンテキストメニューから[終了]を選択し、FormFadeOutメソッドで実行が止まったら、先ほどと同様な手順でステップ実行を行い、フォームのOpacityプロパティ(this.Opacity)の値が減っていることを[ウォッチ]ウィンドウで確認する。確認ができたら、全体の動作についても確認しておこう。これには[F5]キーを押すかメニューバーから[デバッグ]−[続行]を選択すればよい。すると、次は正常にフェードアウトしながら、アプリが終了するはずだ。
Copyright© Digital Advantage Corp. All Rights Reserved.