我在哪里可以看到 ATLTRACE 输出?
Where can I see ATLTRACE output?
我正在维护一个 C++ COM 项目。有一些跟踪线,例如 ATLTRACE(message);
我搜索了 ATLTRACE。 MSDN 告诉 Visual C++ 输出 window 会显示它。但是,该产品是一个发行版。客户将没有源代码,也无法在 VS 中对其进行调试。那么有没有其他方便的查看方式呢? Windows 事件查看器会捕捉到吗?或者我必须更改代码? Win7、VS2013
ATLTRACE
是一个在发布版本中编译为空的宏。您需要使用定义的 _DEBUG 宏重建项目(请参阅 <atltrace.h>
)以显示这些内容。但是,ATLTRACE
生成的输出是调试输出字符串,通常只会显示在调试器的输出 window.
中
如果有您需要的重要信息,并且它在您控制的代码中,您最好将 ATLTRACE
宏用法更改为其他内容,以记录到事件日志或客户可以发送给您的日志文件。
如 1201ProgramAlarm 所述,ATL 项目的发布版本将 ATLTRACE 宏评估为空,并且二进制文件没有为各个源代码行生成实际代码。也就是说,如果不更改源代码,您将无法看到输出。
为了不对项目做太多改动,您可以重新定义跟踪宏本身并生成具有跟踪功能的发布版本,其中输出按照您定义的方式进行路由,例如使用 OutputDebugString
API.
参见:
- How to enable the TRACE macro in Release mode?
- AtlReleaseTrace
ATLTRACE 仅使用调试输出,并且仅在调试版本中有效!
因此您可以为最终用户提供一个用于测试目的的调试版本,并使用 Sysinternals 的 DebugView。但这可能很复杂,因为您还必须遍历不可重新分发的调试运行时。
但您可以轻松编写自己的 MY_TRACE 具有相同功能的宏。
#define MY_TRACE GetMyTracer() // returns object of CMyTracer
...
class CMyTracer
{
...
// Helper operator to get the trace commands. They call the TraceV functions
void operator()(PCSTR pszFormat, ...);
void operator()(PCWSTR pszFormat, ...);
// Worker functions that do the real job calling TraceV functions
void Trace(PCSTR pszFormat, ...);
void Trace(PCWSTR pszFormat, ...);
// Allowed to be virtual to do some internal mystique stuff, like redirecting and this functions perform all output...
virtual void TraceV(PCSTR pszFormat, va_list args);
virtual void TraceV(PCWSTR pszFormat, va_list args);
...
现在您可以使用它代替 ATLTRACE
...
MYTRACE("Simple output\n");
MYTRACE("More complex output %d\n", 4711);
注意:将所有 ATLTRACE 宏替换为您自己的替换是不明智的。如果不影响速度,您可以将跟踪输出分布到位置,但值得提供信息。
我正在维护一个 C++ COM 项目。有一些跟踪线,例如 ATLTRACE(message); 我搜索了 ATLTRACE。 MSDN 告诉 Visual C++ 输出 window 会显示它。但是,该产品是一个发行版。客户将没有源代码,也无法在 VS 中对其进行调试。那么有没有其他方便的查看方式呢? Windows 事件查看器会捕捉到吗?或者我必须更改代码? Win7、VS2013
ATLTRACE
是一个在发布版本中编译为空的宏。您需要使用定义的 _DEBUG 宏重建项目(请参阅 <atltrace.h>
)以显示这些内容。但是,ATLTRACE
生成的输出是调试输出字符串,通常只会显示在调试器的输出 window.
如果有您需要的重要信息,并且它在您控制的代码中,您最好将 ATLTRACE
宏用法更改为其他内容,以记录到事件日志或客户可以发送给您的日志文件。
如 1201ProgramAlarm 所述,ATL 项目的发布版本将 ATLTRACE 宏评估为空,并且二进制文件没有为各个源代码行生成实际代码。也就是说,如果不更改源代码,您将无法看到输出。
为了不对项目做太多改动,您可以重新定义跟踪宏本身并生成具有跟踪功能的发布版本,其中输出按照您定义的方式进行路由,例如使用 OutputDebugString
API.
参见:
- How to enable the TRACE macro in Release mode?
- AtlReleaseTrace
ATLTRACE 仅使用调试输出,并且仅在调试版本中有效!
因此您可以为最终用户提供一个用于测试目的的调试版本,并使用 Sysinternals 的 DebugView。但这可能很复杂,因为您还必须遍历不可重新分发的调试运行时。
但您可以轻松编写自己的 MY_TRACE 具有相同功能的宏。
#define MY_TRACE GetMyTracer() // returns object of CMyTracer
...
class CMyTracer
{
...
// Helper operator to get the trace commands. They call the TraceV functions
void operator()(PCSTR pszFormat, ...);
void operator()(PCWSTR pszFormat, ...);
// Worker functions that do the real job calling TraceV functions
void Trace(PCSTR pszFormat, ...);
void Trace(PCWSTR pszFormat, ...);
// Allowed to be virtual to do some internal mystique stuff, like redirecting and this functions perform all output...
virtual void TraceV(PCSTR pszFormat, va_list args);
virtual void TraceV(PCWSTR pszFormat, va_list args);
...
现在您可以使用它代替 ATLTRACE
...
MYTRACE("Simple output\n");
MYTRACE("More complex output %d\n", 4711);
注意:将所有 ATLTRACE 宏替换为您自己的替换是不明智的。如果不影响速度,您可以将跟踪输出分布到位置,但值得提供信息。