在MFC C++(Visual Studio 6)中,我习惯于使用TRACE宏进行调试。对于普通的win32,是否有等效的语句?
chy5wohz1#
_RPTn工作得很好,尽管不太方便。Here is some code将MFC TRACE语句重新创建为允许变量数目的函数。还添加了TraceEx宏,该宏将源文件和行号放在前面,以便您可以单击返回到该语句的位置。更新:CodeGuru上的原始代码在发布模式下无法为我编译,因此我更改了在发布模式下删除TRACE语句的方式。以下是我放入Trace.h中的完整源代码。* 感谢托马斯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
zqdjd7g92#
从msdn文档Macros for Reporting:您可以使用CRTDBG.H中定义的_RPTn和_RPTFn宏来取代printf陈述式的使用,以进行两柴。当未定义_DEBUG时,这些宏会自动消失在您的出版组建中,因此不需要将它们括在#ifdefs中。
zfciruhq3#
还有OutputDebugString。但是,编译发布时不会删除它。
3zwtqj6y4#
跟踪宏,这些宏提供带有源代码链接、运行时调用堆栈信息和函数原型信息的消息以及参数值:
Extended Trace: Trace macros for Win32
mbjcgjjk5#
我只是用这样的东西(从记忆中,根本没有测试...)
#define TRACE(msg) {\ std::ostringstream ss; \ ss << msg << "\n"; \ OutputDebugString(msg.str()); \ }
然后我可以写这样的东西:-
TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);
您可以将其 Package 在一些#ifdef中,以便在发布版本中轻松删除它。
daolsyd06#
我发现在Visual Studio 2005中使用_RPT()宏也可以处理C源文件。本文Debugging with Visual Studio 2005/2008: Logging and Tracing概述了TRACE、_RPT和其他日志记录类型的宏。我为一个名为ASSRTLOG的日志文件生成了一行,其中包含日志,在将日志写入该文件时,我还执行了以下源代码行:
_RPT()
_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);
此行将记录档中的相同记录放入Visual Studio 2005 IDE的输出视窗中。你可能会对我们用来记录日志的方法背后的机制感兴趣。我们有一个函数PifLogAbort(),它接受一系列参数,然后用来生成日志。这些参数包括生成日志的文件名沿着行号。宏如下所示:
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(Assert失败),则将使用提供的文本生成一个日志。该日志包括生成日志的条件沿着文件名和行号。函数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); }
如果我们不想生成日志,我们所需要做的就是转到定义宏的单个头文件,并将其定义为空,然后重新编译。但是,我们发现这些日志在调查现场问题时非常有价值,在集成测试期间尤其有用。
zzzyeukh7#
Windows Events可能会取代TRACE宏,视您的特定案例而定。程式码会编译成“ debugging ”和“出版”组态。然后,事件追踪可以动态启用和停用、即时显示,或倾印在从属端的机器上供日后诊断。追踪也可以与从操作系统其他部分收集的追踪信息产生相关。如果您只需要在代码到达某些检查点时转储信息,以及变量内容、堆栈跟踪或调用方名称,则Visual Studio的Tracepoints是一个非侵入式选项。
TRACE
7条答案
按热度按时间chy5wohz1#
_RPTn工作得很好,尽管不太方便。Here is some code将MFC TRACE语句重新创建为允许变量数目的函数。还添加了TraceEx宏,该宏将源文件和行号放在前面,以便您可以单击返回到该语句的位置。
更新:CodeGuru上的原始代码在发布模式下无法为我编译,因此我更改了在发布模式下删除TRACE语句的方式。以下是我放入Trace.h中的完整源代码。* 感谢托马斯Rizos提供原始代码 *:
zqdjd7g92#
从msdn文档Macros for Reporting:
您可以使用CRTDBG.H中定义的_RPTn和_RPTFn宏来取代printf陈述式的使用,以进行两柴。当未定义_DEBUG时,这些宏会自动消失在您的出版组建中,因此不需要将它们括在#ifdefs中。
zfciruhq3#
还有OutputDebugString。但是,编译发布时不会删除它。
3zwtqj6y4#
跟踪宏,这些宏提供带有源代码链接、运行时调用堆栈信息和函数原型信息的消息以及参数值:
Extended Trace: Trace macros for Win32
mbjcgjjk5#
我只是用这样的东西(从记忆中,根本没有测试...)
然后我可以写这样的东西:-
您可以将其 Package 在一些#ifdef中,以便在发布版本中轻松删除它。
daolsyd06#
我发现在Visual Studio 2005中使用
_RPT()
宏也可以处理C源文件。本文Debugging with Visual Studio 2005/2008: Logging and Tracing概述了TRACE、_RPT和其他日志记录类型的宏。我为一个名为ASSRTLOG的日志文件生成了一行,其中包含日志,在将日志写入该文件时,我还执行了以下源代码行:
此行将记录档中的相同记录放入Visual Studio 2005 IDE的输出视窗中。
你可能会对我们用来记录日志的方法背后的机制感兴趣。我们有一个函数
PifLogAbort()
,它接受一系列参数,然后用来生成日志。这些参数包括生成日志的文件名沿着行号。宏如下所示:和
PifLogAbort()
的函数原型如下所示:要使用宏,我们将插入如下行:
此宏的作用是,如果返回代码小于0(Assert失败),则将使用提供的文本生成一个日志。该日志包括生成日志的条件沿着文件名和行号。
函数
PifLogAbort()
生成指定长度的日志,并将输出文件视为循环缓冲区。日志也有时间和日期戳。在那些我们希望在运行时动态生成描述性文本的情况下,也许是为了提供实际的错误代码值,我们使用sprintf()函数和一个缓冲区,如下面的代码序列所示:
如果我们不想生成日志,我们所需要做的就是转到定义宏的单个头文件,并将其定义为空,然后重新编译。但是,我们发现这些日志在调查现场问题时非常有价值,在集成测试期间尤其有用。
zzzyeukh7#
Windows Events可能会取代
TRACE
宏,视您的特定案例而定。程式码会编译成“ debugging ”和“出版”组态。然后,事件追踪可以动态启用和停用、即时显示,或倾印在从属端的机器上供日后诊断。追踪也可以与从操作系统其他部分收集的追踪信息产生相关。如果您只需要在代码到达某些检查点时转储信息,以及变量内容、堆栈跟踪或调用方名称,则Visual Studio的Tracepoints是一个非侵入式选项。