読者です 読者をやめる 読者になる 読者になる

をるふちゃんのブログ

C++ | DirectX | VC++

デバッグアサーションとかのメモ

Windows デバグ C++

エラー処理などなどちゃんと書いていこうと思った次第。
例によってVC++の話なのでLinuxの人はお帰りください。

メモリリーク検出

以下のコードをwWinMain.cppらへんに突っ込んでおく

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
//...
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow ) {
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
//...

}

もちろんwWinMain()じゃなくてmain()でも動くよ。
最初の3行は順番変えたりすると上手く動かないみたい。

これでVCのデバガでメモリリーク検出してくれる。mallocnewらへんは普通に対応してくれる。

デバグコード

crtdbg.hを使うとデバグ時に_DEBUGマクロ、リリースビルドではNDEBUGマクロが定義される。
あとは

#ifdef _DEBUG
    //デバグ用のコード
#else
    //リリース用のコード
#endif

みたいに使えばいい。簡単。

アサーション

crtdbg.hにある_ASSERT()_ASSERTE()マクロを使う。
使い方はシンプルで、引数が偽なら殺してくれる。

switch-casedefault:_ASSERT(false)とか書いておくとデバグビルドで問答無用で落としてくれる。
_ASSERTEマクロはファイル位置や行も教えてくれるっぽい。

_DEBUGマクロが定義されてなければ(リリースビルドでは)除去してくれる。

例外処理

使ってね。(ここに書くには仕様が重い)

デバッガ出力

OutputDebugString( LPCTSTR lpOutputString )を使う。
デバガに文字列を送信してくれる。