在 MFC C++ (Visual Studio 6) 中,我习惯使用 TRACE 宏进行调试。普通 win32 是否有等效的声明?

有帮助吗?

解决方案

_RPTn的伟大工程,虽然不是很方便。 这里是再现了MFC TRACE语句作为函数的一些代码允许可变数目的参数。还增加了TraceEx宏观其中前添加源文件和行号,以便您可以单击后退到语句的位置。

更新:在CodeGuru原来的代码将无法编译,我在Release模式,所以我改变了跟踪语句释放模式移除的方式。这里是我的,我投入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

其他提示

有也OutputDebugString的。然而编译释放时将不会被移除。

我只是用这样的事情(从内存中,而不是在所有测试......)

#define TRACE(msg) {\
    std::ostringstream ss; \
    ss << msg << "\n"; \
    OutputDebugString(msg.str()); \
}

然后我可以写的东西,如: -

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);

您可以包装,在某些的#ifdef删除它在发布版本容易不够。

我发现使用 _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的潜在替代宏,具体取决于您的特定情况。该代码被编译成Debug和Release配置。事件跟踪可以动态启用和禁用,实时显示,或倾倒在客户端的机器上后诊断。迹线可以与来自以及操作系统的其他部分收集的跟踪信息相关联。

如果您只是需要转储每当代码达到一定的检查站,再加上可变的内容信息,堆栈跟踪,或来电者的名字,Visual Studio的的跟踪点是一种非侵入式的选择这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top