[ VC++ ] MFC プロジェクトでデバッグ出力ウィンドウに出力する ( TRACE, ATLTRACE2 )

Pocket

アプリ作成の第一歩は、デバッグ出力ウィンドウに文字列を出力させることです。必ずしもそうであるとは言えませんが、ここではデバッグ用の出力ウィンドウに文字列を出力させる方法と、カテゴリとレベルによる出力の制御方法について説明します。

スポンサーリンク


OutputDebugString 関数

OutputDebugString 関数は、名前の通りデバッグ文字列を出力します。この関数は、デバッグビルドだけではなく、リリースビルドのときも、出力されます。

  OutputDebugString(_T("for debug\n"));

デバッグビルド時のみ文字列を出力する

リリースビルドの場合に、出力ウィンドウに文字列を出力させたいことがなければ、TRACE または ATLTRACE2 マクロを使って、デバッグビルド時のみ出力ウィンドウに文字列を出力させることができます。

本マクロは printf 関数のように、出力文字列の形式と可変長パラメータを設定することができるので便利です。


 int test = 0;

 TRACE("test = %d\n", test);
 ATLTRACE2("test = %d\n", test);

なお、TRACE と ATLTRACE2 には違いはありません。以下のように定義されています。抜粋して掲載していますので参考情報としてご覧ください。以降の説明では 2種類のマクロは使用せず TRACE マクロのみを記述します。

#ifndef ATLTRACE
#define ATLTRACE ATL::CTraceFileAndLineInfo(__FILE__, __LINE__)
#define ATLTRACE2 ATLTRACE
#endif

// extern ATL::CTrace TRACE;
#define TRACE ATLTRACE

// The following trace macros are provided for backward compatiblity
//  (they also take a fixed number of parameters which provides
//   some amount of extra error checking)
#define TRACE0(sz)              TRACE(_T("%s"), _T(sz))
#define TRACE1(sz, p1)          TRACE(_T(sz), p1)
#define TRACE2(sz, p1, p2)      TRACE(_T(sz), p1, p2)
#define TRACE3(sz, p1, p2, p3)  TRACE(_T(sz), p1, p2, p3)

カテゴリと出力レベルを指定する

Linux の syslog のように出力レベルとカテゴリを設定し、外部からの設定によってその出力を制御したい場合があります。その時は、以下のようにカテゴリ(default:atlTraceGeneral)と出力レベル(default:0)を設定することができます。レベルは0が最も高く、4が最も低くなります。カテゴリの種類については、以下のリンクを参照ください。また、独自カテゴリも設定することができます。

   TRACE(atlTraceGeneral, 0, "test = %d\n", test);

出力を制御する方法

次に出力を制御する方法の説明を行います。実は Visual Studio ではなく、付属の Visual Studio Tools の中の、MFC-ATL Trace Tool で制御します。GUI は以下の通りです。

トレース制御ツール

トレース制御ツール

上記より、デバッグの出力を制御することができます。なお、トレースメッセージの量を(多:出力レベル4)に設定すると MFC の dll の出力も大量に出力されるので、実際に使用する場合には検討が必要です。

また、出力ファイル名や行数、およびカテゴリ名を出力させるか否かを、チェックボックスで設定することができるので、独自に出力させる必要はありませんし、デバッグの実行途中でも出力制御の切り替えを行うことができます。

スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>