プログラミングにはデバッグは付き物。
というか、デバッグ無しで一発でプログラムを完成させることが出来るような神プログラマーなんてこの世に存在してはならないのよ。
とゆことで、デバッグの基本のひとつである「トレース」についてアレコレ書いてみようかと思った次第。
トレースすべし
トレース。つまりはプログラムの動作の追跡ね。
実際のプログラムの挙動を細かく確認することを一般的に「トレース」と言うわ。
プログラム上の計算の結果や関数の戻り値などを一つ一つ確認して、期待通りに動作しているかを確認していくのがトレースの基本よ。
トレースを行うには VisualStudio のメニュー「デバッグ」から「デバッグ開始」または「ステップイン」「ステップオーバー」を実行すればいいわ。
「デバッグを開始」は標準的なデバッグ用のプログラム実行コマンドよ。
デバッグ用のモードで作成したプログラムを実行するわ。
後述の「ブレークポイント」などでプログラムを一時停止して状態を確認するために使用するものよ。
「ステップイン」「ステップオーバー」は開始時は両方とも同じ動作なんだけど、基本は「デバッグを開始」と同じ。
「デバッグを開始」と違うのは、プログラムの先頭で自動的に一時停止する点ね。
デバッグ開始時にはあまり使わないけど、ブレークポイントを置く事無くプログラム開始点で一時停止してくれるから、プログラムの初動部分の動作を確認したい時に便利ね。
ブレークポイントを設定すべし
「ブレークポイント」はデバッグ実行中にプログラムを一時停止させる部分の事よ。
プログラムがソースコード上で指定されたブレークポイントに達すると、デバッガーがプログラムを一時停止させて、変数等の内容を確認できるモードになるわ。
ブレークポイントを挿入するには、ソースコード上で挿入したい行(例では44行目)を右クリックして表示されるメニューから「ブレークポイントを挿入」をクリックすれば良いわ。
ちなみに、ショートカットはデフォルトで「F9」が設定されてたと思う。(VS2013のデフォルトだと違うかも)
ショートカットを入力する度にブレークポイントのON/OFFが切り替わるわ。
ブレークポイントが挿入されると、行の先頭に赤い丸のアイコンと、対象のソースコードが赤くハイライトされるわ。
して、デバッグ中にブレークポイントを設定した場所が実行されようとすると、プログラムが一時停止。
一時停止すると↓の画面のように実行している行の先頭に矢印アイコンと、その場所にあるブレークポイントのソースが黄色くハイライトされるわ。
アップ。
例では29行目で一時停止していることがわかるわ。
なお、 一時停止はブレークポイントを設定したコードの直前で行われるコトがポイント。
つまり、式が実行される前に止まるから、式が実行される前と、実行された後の状態を確認にすることができるのよ。
そのためには「ステップ実行」を行うんだけど、それについては後述の「ステップ実行を使用すべし」を参照。
値の内容を確認すべし
ブレークポイントで一時停止したら、その時の各種変数の値がVisualStudio上で確認できるから、これを使用する事で期待している動作をしているか確認できるわ。
値の確認は「ウォッチ」機能を使用。
大まかにポップアップタイプのものと、ウィンドウタイプの2種類があるわ。
ポップアップタイプのウォッチはソースコード上の変数にマウスカーソルをのせると表示されるわ。
下の例では変数「view」の内容を表示しているわ。
ブレークポイント以外の場所でも、グローバル変数も含めてスコープ内の変数は全てコレで参照可能よ。
変数が構造体やクラスで入れ子状態になっている場合は、そのメンバー変数も参照可能よ。
変数の名前の横に「+」アイコンが付いているのがソレね。
例では「view.CameraPosition」の内容である「PEPlugin.SDK.V3型」の値を表示していて、view.CameraPosition.B の値が -30.0 になっていることが確認できるわ。
ウィンドウタイプのウォッチは「ウォッチウィンドウ」で行えるわ。
下の例のでは画面右下のウィンドウね。
アップ。
変数名、値、型が表示されていて、内容を常時表示させてステップ実行時に値の変化を確認するのに便利よ。
ウィンドウが表示されていない場合はメニューの「デバッグ」→「ウィンドウ」→「ウォッチ」から1~4番までのウォッチウィンドウを表示可能よ。
ウォッチウィンドウの番号に特に意味は無くて、最大で4つのウィンドウを使用できるというモノね。
1番はグローバル変数用、2番がローカル変数用みたいに自分なりに使いやすい用途を模索してみてね。
ちなみに私は1番しか使ってないわね。
ウォッチウィンドウで表示したい変数は次の2通りの方法で指定できるわ。
- ソースコード上で変数名を選択してウォッチウィンドウにD&D
- ウォッチウィンドウの変数名の項目をダブルクリックして変数名を入力
ウォッチウィンドウ上の変数を削除する場合は選択して delete キーを押せばおk。
ちなみに、ウォッチウィンドウは変数以外にも計算式やアドレスの直接参照、関数の実行結果なんかも参照できるけど、その方法についてはまたの機会にでも。
ステップ実行を使用すべし
デバッグ実行で一時停止して再び実行するにはメニューの「デバッグ」→「続行」を実行すればOKなんだけど、
※場所は「デバッグ開始」と同じ。ショートカットも同じ。
プログラムの式を1つずつ実行して細かく動作を確認するためにステップ実行を活用すると便利よ。
ステップ実行はメニューの「デバッグ」の中に3種類。同様のものがツールバーにもあるわ。
「ステップイン」「ステップオーバー」「ステップアウト」がソレね。
メニュー上やツールバーにあるけど、デバッグ中は頻繁に使う事になるからショートカットを覚えておくことをお勧めするわ。
かなり頻繁に使う事になると思うから、1キーで実行できるようにしておくと便利よ。
私の場合は VisualC++6.0 時代からのショートカットを使用しているわ。
して、それぞれのステップ実行の内容は下記の通り。
・ステップイン
1回コマンドを実行する度にプログラム上の式を1つずつ実行。
関数がある場合はその関数の中を次のステップ実行場所として移動。
・ステップオーバー
1回コマンドを実行する度にプログラム上の式を1つずつ実行するのはステップインと同じ。
ステップインとの違いは関数内に入らず、ソースコード上の次のコマンドをステップ実行場所として移動。
主に使うステップ実行はコレね。
・ステップアウト
現在実行中の関数の最後まで実行して、関数の呼び出し元を次のステップ実行場所として移動。
文章だとちょーっとわかり辛いと思うけど、実際に実行してみればすぐにどういう動作になるかわかると思うわ。
カーソル行の前まで実行を使用すべし
ステップ実行の応用で、ブレークポイントを設定せずに一気に指定箇所まで実行させるのが「カーソルの前まで実行」よ。
例えば、下の画面のように54行目までいっきに実行したい場合に、54行目で右クリックしてメニューを表示して「カーソルの前まで実行」を実行すれば良いわ。
途中で他にブレークする要素が無ければそこまでノンストップで実行。実行中にブレークポイントなどにあたったらそこでこのコマンドは終了することになるわ。
デバッグを停止すべし
デバッグ中にプログラム自体を終了してデバッグを終了させたい場合は「デバッグの停止」を使用すればOK。
ツールバー上にもあるからコレをクリックするのもアリね。
このコマンドを実行すればデバッグ中のプログラムを強制的に終了させて、デバッグモードを終了するわ。
プログラム上の正規の手段で終了したのにデバッグモードが終了しない場合でもコレで強制的にプログラムを終了させることができるわ。
以上、デバッグの初歩としてのトレースのススメは終了。
参考にしてもらえたら幸いよ。
機会があったらもっと細かい応用技なんかを紹介してみようかと思うわ。