ホーム ざれごと ワシントン州 ツール NT豆知識 Win32プログラミングノート 私的用語 ジョーク いろいろ ゲーム雑記 Favorites 掲示板 Mail
Visual C++ 6.0でのデバッグテクニックをちょと小出し。
NT only |
システムのAPI呼び出しにブレークポイントを設定することが出来ます。
詳細なアドレスの指定は、
{[関数名], [ソースコード名], [モジュール名} expression
となる。
データに対してブレークポイントを設定することが出来ます。 例えば、アドレス0x12345678に変更がなされたときにブレークするには、
*(long*)0x12345678, length=1と設定します。この方法では、CPUのデバッグレジスタを使うので、実行に関するペナルティがほとんどありません。
カーネルモードアドレスに対して設定できません。また、デバッグレジスタはx86にしかありません。設定したハードウェアブレークポイントは、プロセス固有ではなくシステムに共通となるため、 Windows95/98ではシステ ムがハングアップすることがあります。
n回目の実行でクラッシュするなら、カウントを n-1 にしてブレークポイントを設定する。
通常のシンボルと紛らわしい場合、"@"を頭につけて、"@eax" のように指定すれば確実。
VC++6.0には、errという仮想レジスタがあり、TEBのLastErrorを表示してくれます。 クイックウォッチで、後述する"hr"というフォーマットを利用して"@err,hr"と指定すれば、エラーメッセージに変換して表示されます。
0x1234は16進数。デフォルトの基数が変えてある場合、10進数は、0n1234と明示可能。
シンプルな関数なら、クイックウォッチなどから呼べる。CheckMyStrucuture(CFoo*);などが使えるはず。 メモリをアロケートしたりするのはご法度。
仮想レジスタ @clk というものがあり、ティックカウントを保持している(CPUレベル)。 ウォッチに、@clk を追加し、その次に @clk=0 を追加する。 ブレイクで止まるごとに、実行にかかったティックカウントが分かる。
NTでは、F12 がデバッグ用のブレークインにレジストされている。 アプリからは、F12 に機能を割り当てないのが吉。
デバッグ中に「これだ!」とバグの個所を見つけたとして、変更が局所的なら Alt+F10 でオンメモリのビルドを行い、右クリックなメニューから "Set Next Statement"でもう一度実行されるようにして、バグフィックスの 確認を行うことができる。 ソース変更のたびに毎回アプリケーションを起動しなおすより、はるかに高速でお手軽。
ホーム ざれごと ワシントン州 ツール NT豆知識 Win32プログラミングノート 私的用語 ジョーク いろいろ ゲーム雑記 Favorites 掲示板 Mail