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
表1: コンパイラオプション

/MLd 系 (=シングルスレッド) は使用されなくなりました。

ヘッダファイル

<crtdbg.h> ヘッダをインクルードします。

トレース機能

トレースタイプとトレースモード

レポートタイプは次の三種類が指定できます。

_CRT_WARN 警告メッセージは表示されません。
_CRT_ERRORポップアップ ウィンドウが表示されます。
_CRT_ASSERT_CRT_ERROR と同じです。

レポートモードは次の三種類。

_CRTDBG_MODE_DEBUG デバッグトレースを出力します。
_CRTDBG_MODE_FILE ファイルに出力します。
  • _CRTDBG_FILE_STDOUT - 標準出力
  • _CRTDBG_FILE_STDERR - 標準エラー
_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 デバッグライブラリには、主に二系統のトレース用マクロが用意されています。

オプション意味
RPTnprintf の書式でデバッグトレースを出力します。n は 0 ~ 4 までの引数の数を指定します。
(ヘッダファイルには 0 ~ 5 までのマクロが用意されているようですが、ドキュメントには 0 ~ 4 までと書いてあるので、 4 までにしておいたほうが無難でしょう)
RPTFnprintf の書式でデバッグトレースを出力します。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 を見てみてください。当サイトでも機会があれば紹介したいと思います。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説