ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail

VC++6.0 デバッグの小技

Last modified: Sat Apr 05 04:42:12 2003 PDT

一つ上へ


Visual C++ 6.0でのデバッグテクニックをちょと小出し。

NT only

システムコードのブレークポイント

システムのAPI呼び出しにブレークポイントを設定することが出来ます。

詳細なアドレスの指定は、
{[関数名], [ソースコード名], [モジュール名} expression
となる。

データブレークポイント

データに対してブレークポイントを設定することが出来ます。 例えば、アドレス0x12345678に変更がなされたときにブレークするには、

*(long*)0x12345678, length=1
と設定します。この方法では、CPUのデバッグレジスタを使うので、実行に関するペナルティがほとんどありません。

制限

カーネルモードアドレスに対して設定できません。また、デバッグレジスタはx86にしかありません。設定したハードウェアブレークポイントは、プロセス固有ではなくシステムに共通となるため、 Windows95/98ではシステ ムがハングアップすることがあります。

カウントブレークポイント

n回目の実行でクラッシュするなら、カウントを n-1 にしてブレークポイントを設定する。

レジスタの表示(クイックウォッチ)

通常のシンボルと紛らわしい場合、"@"を頭につけて、"@eax" のように指定すれば確実。

LastErrorの表示(クイックウォッチ)

VC++6.0には、errという仮想レジスタがあり、TEBのLastErrorを表示してくれます。 クイックウォッチで、後述する"hr"というフォーマットを利用して"@err,hr"と指定すれば、エラーメッセージに変換して表示されます。

10進数を明示的に指定

0x1234は16進数。デフォルトの基数が変えてある場合、10進数は、0n1234と明示可能。

デバッグ用関数をプログラム内に用意しておく

シンプルな関数なら、クイックウォッチなどから呼べる。CheckMyStrucuture(CFoo*);などが使えるはず。 メモリをアロケートしたりするのはご法度。

Poor man's プロファイラ

仮想レジスタ @clk というものがあり、ティックカウントを保持している(CPUレベル)。 ウォッチに、@clk を追加し、その次に @clk=0 を追加する。 ブレイクで止まるごとに、実行にかかったティックカウントが分かる。

Quick Watchのフォーマット

ブレークイン

NTでは、F12 がデバッグ用のブレークインにレジストされている。 アプリからは、F12 に機能を割り当てないのが吉。

デバッグ中にコード変更&Go!

デバッグ中に「これだ!」とバグの個所を見つけたとして、変更が局所的なら Alt+F10 でオンメモリのビルドを行い、右クリックなメニューから "Set Next Statement"でもう一度実行されるようにして、バグフィックスの 確認を行うことができる。 ソース変更のたびに毎回アプリケーションを起動しなおすより、はるかに高速でお手軽。

Since 1996

一つ上へ

ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail