Visual Studioデバッグ術

Last-modified: 2008-06-26 (木) 20:39:38

Visual Studioの出力ウィンドウやイミディエイトウィンドウにprintfする。

OutputDebugStringA("nanika");
OutputDebugStringW(L"soreka");

メモリリークを検出する。

以下のコードをmalloc/newしているソースの先頭に貼り付ける。

#include <cstdlib>
#include <windows.h>
#define malloc(X) _malloc_dbg(X,_NORMAL_BLOCK,__FILE__,__LINE__)
#define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__)

最後にmain関数の先頭で、以下の関数呼び出しを行う。

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_DELAY_FREE_MEM_DF|_CRTDBG_CHECK_ALWAYS_DF|_CRTDBG_LEAK_CHECK_DF);

これでプログラム終了時にメモリリークが検出された場合、
Visual Studioの「出力」ウィンドウあるいは、「イミディエイトウィンドウ」に
メモリリークしたソースの名前と行番号が表示されるはず。

なお、マクロ関数の定義は、malloc/newを使用している箇所すべてに設定する必要がある。

n番目に確保したメモリを確保する際にブレークポイントを貼りたい場合は、
「{,,msvcr80d.dll}_crtBreakAlloc」をウォッチに貼って、値を変更すべし。
あるいは、プログラム中に「_CrtSetBreakAlloc(n);」を呼び出してもOK。

Win32APIにブレークポイントを貼る。

Visual Studioのオプションの「デバッグ」-「シンボル」に以下のアドレスを追加する。

http://msdl.microsoft.com/download/symbols

この状態で、アプリケーションをステップ実行中、
ブレークポイントの新規作成で関数にブレークポイントをはる。
関数名は以下のように設定する。

{,,kernel32.dll}_VirtualAlloc@16
{,,kernel32.dll}_DeleteFileW@4

関数名がわからないときは、ステップ実行中に当該関数を実行する手前で
「混合モード」あるいは「逆アセンブル」を表示すれば、それっぽい関数名が書いてある。