2009年01月16日

Visual Studio 2008の使い方 その5 デバッガ

プログラムを書くうえでデバッガは非常に重要な道具です。単なるテキストエディタではなく、VisualStudioのような統合環境を使う理由の80%くらいはデバッガのためと言っていいくらいです。

基本的なデバッガの使い方は、状態を確認したい場所にブレークポイントを仕掛けてプログラムを実行し、実行が中断(ブレーク)したところで変数の値等を確認します。

・ブレークポイント

実行を中断させたいところにブレークポイントを設定します。ソースコードの左側の余白を左クリックすると赤い丸印が出てきます。これがブレークポイントの印です。デバッガ上で実行中に実行パスがブレークポイントに到達すると、自動的に実行を中断します。

単純なブレークポイントは実行パスが到達するたびに毎回中断されますが、様々な条件を設定することで、もっと複雑なブレークポイントを設定することもできます。一定回数実行されたらブレークする「ヒットカウント」や、特定の変数の値が書き換えられたらブレークする設定が便利です。

ソースコード上で右クリックしたメニューから「カーソル行の前まで実行」を選ぶと、そこまで実行してブレークします。いちいちブレークポイントの設定/解除を行わなくても、1回限りの使い捨てのブレークポイントとして使えます。

・出力ウインドウ

デバッグ実行中に出力されたデバッグメッセージが表示されます。

Win32APIのOutputDebugStringに文字列を渡すと、デバッグメッセージとして出力されます。このメッセージは普通に実行した場合はどこにも表示されることなく捨てられますが、デバッガ上で実行するとデバッグメッセージとして捕捉されます。

・呼び出し履歴

ブレークした地点が、どの関数から呼び出されているのかが表示されます。

call-history

この例では、wWinMainCRTStartup()から__tmainCRTStartup()が呼ばれ、そこからwWinMain()→DXUTChangeDevice()→DXUTCreate3DEnvitonment9()→OnCreateDevice()と呼ばれていることを表しています。

呼び出し元をダブルクリックすると、その場所のソースコードが表示されます。

・自動変数、ローカル、ウォッチ

ブレークした時点の変数の値を確認するのが、これらのウインドウです。

「自動変数」は現在の行と、1つ前の行で使われている変数の値が表示されます。また、関数の戻り値も表示されます。

「ローカル」は、現在のスコープで使用されている変数の値が表示されます。

「ウォッチ」は特別に監視したい変数などを登録しておくと、自動変数やローカルに表示されないものでも、常に値を確認することができます。主にグローバル変数などを登録して使います。

これらの表示はブレークするたびに更新され、前回から値が変わっている部分は赤く表示されます。

DXUTFindDXSDKMediaFileCch関数がS_OKを返し、strが更新されたところ

・ステップイン、ステップオーバー、ステップアウト

ブレークした地点から1ステップだけ実行したいときに、これらの機能を使います。

ステップインでは、これから実行する部分に関数呼び出しがある場合は、その呼び出し先まで追いかけて行きます。

ステップオーバーでは、関数呼び出しがあっても追跡せず、ソースコード上で1行分実行して止まります。

ステップアウトは現在実行中の関数の終わりまで一気に実行します。ステップインした関数から抜けたいときに便利です。

・トレースポイント

デバッガは、ブレークした時点から未来に起こる変化の確認は得意なのですが、過去に起きた変化を捉えることは基本的にできません。過去に起きた変化に関しては、(しばしば下等な方法と馬鹿にされる)printfデバッグの方が優れています。

printfデバッグは、気になる変数の値をprintf等で出力して確認する方法です。この方法は、ソースコードを破壊してしまう点や、実行前に選んでおいた変数の値しか確認できないという欠点がありますが、過去の変化の履歴を見れるという点では優れています。

トレースポイントは両者のいいとこ取りの機能で、ソースコードを破壊せずにデバッグログ出力を加えることができます。デバッグ中に追加することも可能です。

タグ:VisualStudio
2009年01月16日 【プログラミング】 | コメント(0) |

この記事へのトラックバックURL


この記事へのトラックバック
この記事へのコメント

コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。