MFC C++ (Visual Studio 6) では、デバッグに TRACE マクロを使用することに慣れています。プレーンな win32 に相当するステートメントはありますか?
7 に答える
_RPTn はうまく機能しますが、それほど便利ではありません。 以下は、可変数の引数を許可する関数として MFC TRACE ステートメントを再作成するコードです。また、ソース ファイルと行番号を先頭に追加する TraceEx マクロを追加して、クリックしてステートメントの場所に戻ることができるようにします。
更新: CodeGuru の元のコードはリリース モードでコンパイルされないため、リリース モードで TRACE ステートメントを削除する方法を変更しました。ここに、Trace.h に入れた完全なソースを示します。 オリジナルの Thomas Rizos に感謝します:
// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873
#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef _DEBUG
#define TRACEMAXSTRING 1024
char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
va_list args;
va_start(args,format);
int nBuf;
nBuf = _vsnprintf(szBuffer,
TRACEMAXSTRING,
format,
args);
va_end(args);
_RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
&strrchr(__FILE__,'\\')[1],__LINE__); \
_RPT0(_CRT_WARN,szBuffer); \
TRACE
#else
// Remove for release mode
#define TRACE ((void)0)
#define TRACEF ((void)0)
#endif
#endif // __TRACE_H__850CE873
msdn docs から、Macros for Reporting :
CRTDBG.H で定義されている _RPTn および _RPTFn マクロを使用して、デバッグ用の printf ステートメントの使用を置き換えることができます。これらのマクロは、_DEBUG が定義されていない場合、リリース ビルドで自動的に消えるため、#ifdefs で囲む必要はありません。
OutputDebugString もあります。ただし、リリースのコンパイル時には削除されません。
私はこのようなものを使用しています(メモリから、まったくテストされていません...)
#define TRACE(msg) {\
std::ostringstream ss; \
ss << msg << "\n"; \
OutputDebugString(msg.str()); \
}
そして、次のようなものを書くことができます:-
TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);
それをいくつかの #ifdefs でラップして、リリースビルドで簡単に削除できます。
ソース コード リンク、ランタイム コールスタック情報、関数プロトタイプ情報をパラメーター値とともにメッセージに提供するトレース マクロ:
このマクロを使用する_RPT()
と、Visual Studio 2005 の C ソース ファイルでも機能することがわかりました。この記事「Visual Studio 2005/2008 でのデバッグ: ログとトレース」では、TRACE、_RPT、およびその他のログ タイプ マクロの概要を説明しています。
ログを含む ASSRTLOG というログ ファイルの行を生成し、ログをファイルに書き込むときに、次のソース コード行も実行します。
_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);
この行は、ログ ファイルに記録されるのと同じログを Visual Studio 2005 IDE の出力ウィンドウに出力します。
ロギングに使用しているアプローチの背後にあるメカニズムに興味があるかもしれません。PifLogAbort()
ログを生成するために使用される一連の引数を受け入れる関数があります。これらの引数には、ログが生成されるファイルの名前と行番号が含まれます。マクロは次のようになります。
#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) txt , __LINE__ );}
の関数プロトタイプは次のPifLogAbort()
ようになります。
PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)
マクロを使用するには、次のような行を挿入します。
NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn(): EtkTimeIn() returned error");
このマクロが行うことは、戻りコードが 0 未満の場合 (アサーションが失敗した場合)、提供されたテキストでログが生成されることです。ログには、ログを生成した条件と、ファイル名および行番号が含まれます。
この関数PifLogAbort()
は、指定された長さのログを生成し、出力ファイルを循環バッファーとして扱います。ログには時刻と日付のスタンプもあります。
実行時に説明テキストを動的に生成したい場合、おそらく実際のエラー コード値を提供するために、次のコード シーケンスのように sprintf() 関数をバッファーと共に使用します。
if (sErrorSave != STUB_BM_DOWN) {
char xBuff[128];
sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}
ログを生成したくない場合は、マクロが定義されている単一のヘッダー ファイルに移動し、それを何も定義しないように定義してから再コンパイルするだけです。ただし、これらのログはフィールドの問題を調査する際に非常に価値があり、特に統合テスト中に役立つことがわかっています。
Windows イベントTRACE
は、特定のシナリオに応じて、マクロの代わりになる可能性があります。コードは、デバッグ構成とリリース構成の両方にコンパイルされます。その後、イベント トレースを動的に有効または無効にしたり、リアルタイムで表示したり、後で診断するためにクライアントのマシンにダンプしたりできます。トレースは、OS の他の部分から収集されたトレース情報と関連付けることもできます。
コードが特定のチェックポイントに到達するたびに、変数の内容、スタック トレース、または呼び出し元の名前と共に情報をダンプするだけでよい場合は、Visual Studio のトレースポイントが邪魔にならないオプションです。