CRT デバッグ拡張機能 ~ トレース機能
CRT デバッグライブラリの有効化
ビルドオプション
Microsoft のC コンパイラである Visual C++ の C Run-Time ライブラリにはデバッグ用の 拡張機能が組み込まれています。 これを利用するためには、コンパイラオプションとリンカオプションを設定します。
必要なリンカオプションは /DEBUG のみです。
コンパイラオプションは、/MDd、 /MTd または /LDd のいずれかを指定します。
オプション | 意味 |
---|---|
/MDd | _DEBUG, _MT, _DLL を定義する。MSVCRTD.lib とスタティックリンクします。 |
/MTd | _DEBUG, _MT を定義する。マルチスレッドの実行可能モジュール |
/LDd | _DEBUG, _MT を定義し、リンカに /DLL を渡す。デバッグ版 DLL |
/MLd 系 (=シングルスレッド) は使用されなくなりました。
ヘッダファイル
<crtdbg.h> ヘッダをインクルードします。
トレース機能
トレースタイプとトレースモード
レポートタイプは次の三種類が指定できます。
_CRT_WARN | 警告メッセージは表示されません。 |
_CRT_ERROR | ポップアップ ウィンドウが表示されます。 |
_CRT_ASSERT | _CRT_ERROR と同じです。 |
レポートモードは次の三種類。
_CRTDBG_MODE_DEBUG | デバッグトレースを出力します。 |
_CRTDBG_MODE_FILE | ファイルに出力します。
|
_CRTDBG_MODE_WNDW | メッセージボックスを表示します。 |
上記のタイプそれぞれについて、出力先を _CrtSetReportMode 関数で指定します。 また、ファイル出力の場合 (_CRTDBG_MODE_FILE の場合) はファイルを、 _CrtSetReportFile 関数で指定します。
例として 「_CRT_WARN タイプは標準エラーのみに出力」、 「_CRT_ERROR タイプはデバッグ出力及び標準エラーに出力」に設定する場合のコードを示します。
#include <crtdbg.h> #include <stdio.h> int main(int argc, char* argv[]) { _CrtSetReportMode ( _CRT_WARN, _CRTDBG_MODE_FILE ); _CrtSetReportMode ( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG ); _CrtSetReportFile ( _CRT_ERROR, _CRTDBG_FILE_STDERR ); _CrtSetReportFile ( _CRT_WARN, _CRTDBG_FILE_STDERR ); ... return 0; }
トレースマクロ _RPTx
CRT デバッグライブラリには、主に二系統のトレース用マクロが用意されています。
オプション | 意味 |
---|---|
RPTn | printf の書式でデバッグトレースを出力します。n は 0 ~ 4 までの引数の数を指定します。 (ヘッダファイルには 0 ~ 5 までのマクロが用意されているようですが、ドキュメントには 0 ~ 4 までと書いてあるので、 4 までにしておいたほうが無難でしょう) |
RPTFn | printf の書式でデバッグトレースを出力します。RPTn と異なるのは、こちらはファイル名と行番号を自動的に出力することです。いずれのマクロもCrtDbgReport を呼び出しています。 |
第一引数はレポートタイプ。第二引数はフォーマット文字列。それ以降は引数です。 第二引数以降は printf と同様です。
尚、RPTn マクロは _CrtDbgReport を内部で呼び出しています。
次のコードで動作確認をします。
#include <crtdbg.h> #include <stdio.h> int main(int argc, char* argv[]) { _CrtSetReportMode ( _CRT_WARN, _CRTDBG_MODE_FILE ); _CrtSetReportMode ( _CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG ); _CrtSetReportFile ( _CRT_ERROR, _CRTDBG_FILE_STDERR ); _CrtSetReportFile ( _CRT_WARN, _CRTDBG_FILE_STDERR ); _RPT0( _CRT_WARN, "Entering main\n" ); printf( "Hello, World\n" ); _RPTF0( _CRT_WARN, "Exit main\n" ); return 0; }
この結果は次のようになります。
> test.exe Entering main Hello, World console_win32.cpp(16) : Exit main
この他、CRT のデバッグ拡張機能には、デバッグヒープ等面白い機能が多数あります。 MSDN を見てみてください。当サイトでも機会があれば紹介したいと思います。