質問

MFC C ++(Visual Studio 6)では、デバッグにTRACEマクロを使用することに慣れています。プレーンなwin32に相当するステートメントはありますか?

役に立ちましたか?

解決

_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ドキュメントから、レポート用マクロ

  

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でラップして、リリースビルドで簡単に削除できます。

ソースコードリンクランタイムコールスタック情報、および関数プロトタイプをメッセージに提供する

トレースマクロパラメータ値を含む情報:

拡張トレース:Win32のマクロをトレース >

_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__ );}

および<=>の関数プロトタイプは次のようになります。

PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)

そしてマクロを使用するには、次のような行を挿入します:

NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn():  EtkTimeIn() returned error");

このマクロが行うことは、戻りコードが0より小さい場合(アサーションが失敗した場合)、提供されたテキストでログが生成されることです。ログには、ログを生成した条件とファイル名と行番号が含まれます。

関数<=>は、指定された長さのログを生成し、出力ファイルを循環バッファーとして扱います。ログには時刻と日付のスタンプもあります。

実行時に動的に説明テキストを生成したい場合、おそらく実際のエラーコード値を提供するために、次のコードシーケンスのように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 Events are a potential replacement for TRACE macros, depending on your particular scenario. The code gets compiled into both Debug and Release configurations. Event tracing can then be dynamically enabled and disabled, displayed in real-time, or dumped on a client's machine for later diagnosis. The traces can be correlated with trace information gathered from other parts of the OS as well.

If you merely need to dump information whenever code reaches certain checkpoints, together with variable content, stack traces, or caller names, Visual Studio's Tracepoints are a non-intrusive option to do so.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top