ホーム < ゲームつくろー! < デバッグ技術編

その1 デバッグの超基本「ステップ実行」


 はるか昔統合環境も無い時代。デバッグは大変でした。しかし、今私たちはVisual Studio等の素晴らしい統合環境を持っています。統合環境の良さはプログラムを組みやすいというのもあるのですが、もう1つは強烈な「デバッグ支援機能」です。その最も基本で、もっとも良く使うのが「ステップ実行」です。

 この章ではウォーミングアップとしてVisual Studioの持つステップ実行についておさらいしてみたいと思います。



@ ステップ実行は3種類

 ステップ実行とは、プログラムを1行もしくは複数行ごとに手動で実行するデバッグ方法です。ステップ実行をするためにはプログラムを一時的に止める「ブレークポイント(F9)」をどこかに設置する必要があります。ブレークポイントの地点にプログラムの流れがやってくると自動的に一時停止してステップ実行が出来るモードになります。

 Visual Studioのステップ実行には「ステップイン」「ステップオーバー」そして「ステップアウト」の3種類があります。まず先に、このステップ実行をするショートカットキーを覚えて下さい:

ステップイン F11
ステップオーバー F10
ステップアウト Shift + F11

デバッグ作業ではこのショートカットキーを使い分け連打することになります。

 ステップインは最もステップ単位が小さいデバッグ方法です。基本的に1行単位で実行されます(逆アセンブリ表示にした場合はアセンブリ1行単位)。よって、これより細かい単位ではチェックできません。このステップ実行をすると、関数の内部にもどんどん入ることができます。

 ステップオーバーは同じく1行単位で実行されるのですが、関数があった場合その関数を実行して次の行に移行します。関数の内部に入らずそれを飛ばすため「オーバー」なんです。

 ステップアウトは上2つよりもちょっとだけマイナーな感じがしますが、これは今実行している関数の外(呼び出し元)に出るまでプログラムを進めるステップ実行方法です。今の関数の動作チェックができたので呼び出し元に戻りたい事はままあります。そういう時に使えるわけです。

 ステップ実行を終了してプログラムを再び走らせるには「続行」にします。これは[デバッグ]→[続行]でも出来ますが、ショートカットキーである「F5」を押すのが通常です。各ショートカットを使い分けて無駄を省いたステップ実行をする。これがデバッグの基本です。これらのステップ実行は実際に動かしてみるのが一番で、たぶん物の数回で手が直ぐに操作を覚えます。



A ステップ実行は変数の挙動を見るデバッグ

 ステップ実行の一番の目的は、1行実行されるごとに変わる変数の挙動を見ることです。その変数は「ローカルウィンドウ」もしくは「自動変数ウィンドウ」に逐次表示され、変化が起こるたびに数値が変わります:

ローカルと自動変数の違いは、ローカルが今入っている関数のローカル変数を含めた変数列を表示してくれるのに対して、自動変数は現在のステップ行に関連する変数を実行の度に切り替えて表示してくれます。変化があったところは赤色に変わりますので、見た目にもわかりやすいのが良いですね。

 このウィンドウの表示機能はなかなかのもので、型もしっかりと出ますし、値も浮動小数点ならその精度で出してくれますし、文字列もそのまま表示してくれます。また、ローカルウィンドウ上で右クリックする事で「16進数で表示」もできます。構造体やクラスなどは階層状に表示されます。



B 条件付きブレークポイントでステップ実行モードへ

 ステップ実行をするにはとにかくプログラムを一度止めないと始まりません。止める行はブレークポイントで指定します。普通に設定する時には指定の行にカーソルを合わせてF9を押すだけです。

 ただ、ブレークポイントはそのままだと問答無用でプログラムを止めてしまいます。10000回のループの最後(9999)の時だけ止めたい時に10000回止めるわけにはいきません。そこでブレークポイントには「止まる条件」を付加することができます。

 条件をつけるには、一度ブレークポインタを設定した行の赤丸の上で右クリックすることで出現するメニューの中から「条件」を選択します:

開いた「ブレークポイントの条件」ウィンドウに条件文を入れます。例えば次のような感じです:

 条件文はその行にif文があると思えば良いでしょう。ですから、宣言されていない変数を指定しても無視されてしまいます。

 上でヒットカウント、フィルタ、ヒット時なども条件の1つです。一度試してみると何をしたいのかが分かると思います。ブレークポイントに条件をつける事で、無駄な停止を防ぎ、いち早くデバッグしたい状態にする事ができます。



 肩慣らしとして、ステップ実行とブレークポイントについて簡単にまとめました。これらを駆使する事でかなりのデバッグ作業ができます。しかし、ステップ実行はあくまでも「止まった状態」でしか実行できません。動かないとわからないバグに対処するには、別の考え方で攻めないといけません。これからが本番です。