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