如何在 MFC 中重定向 TRACE 语句以减少来自 AfxDumpStack() 的数据流?
Posted
技术标签:
【中文标题】如何在 MFC 中重定向 TRACE 语句以减少来自 AfxDumpStack() 的数据流?【英文标题】:How is it possible to redirect TRACE statements in MFC to reduce the data stream from AfxDumpStack()? 【发布时间】:2014-04-22 20:16:30 【问题描述】:我从AfxDumpStack 看到可以重定向TRACE
输出。
AFX_STACK_DUMP_TARGET_TRACE 通过 TRACE 宏发送输出。 TRACE 宏仅在调试版本中生成输出;它在发布版本中不生成任何输出。 此外,TRACE 可以重定向到除调试器之外的其他目标。
斜体字是我的。
我正在使用旧应用程序使用 C++ 进行编程,并希望使用仅输出到 TRACE
或剪贴板的 AfxDumpStack()
转储堆栈的一部分。我只想输出几行,所以我需要在输出之前对字符串进行处理。
我将如何以最简单的方式完成此任务?
编辑
所以这是我的解决方案的代码:
class hook
public:
hook()
VERIFY(_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, Hook) != -1);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, INVALID_HANDLE_VALUE);
~hook()
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
VERIFY(_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, Hook) != -1);
static const size_t max_backtrace = 4; // max calls to view
static const size_t skip_stack_head = -5; // skips over calls related to AfxDumpStack()
static size_t line; // current line being output from begin of stack dump
static bool stack_out; // currently outputting stack dump
static int Hook( int reportType, char *message, int *returnValue )
if (strcmp(message, "=== begin AfxDumpStack output ===\r\n") == 0)
stack_out = true;
line = skip_stack_head;
else if (strcmp(message, "=== end AfxDumpStack() output ===\r\n") == 0)
OutputDebugString("\r\n");
stack_out = false;
else
if (strcmp(message, "\r\n") == 0) // AfxStackDump() sends CRLF out on separate calls
if (!stack_out || line < max_backtrace-1)
OutputDebugString("\r\n\t");
++line;
else if (!stack_out || line < max_backtrace)
OutputDebugString(message);
return TRUE;
;
size_t hook::line = -1;
bool hook::stack_out = false;
static hook junk;
唯一的问题是对AfxDumpStack()
的调用需要产生一个线程。如果调用过多,这会降低应用程序的性能。
【问题讨论】:
【参考方案1】:默认情况下,TRACE
调用 OutputDebugString
。
您可以使用DebugView,它捕获OutputDebugString
的输出并可以选择将其记录到文件中。
除了更改应用程序之外,似乎无法直接将输出发送到文件,例如通过使用_CrtSetReportHook2
挂钩输出。
在内部,MFC 使用_CrtDbgReport
输出其TRACE
消息。你可以调用_CrtSetReportMode
来指定它的输出应该去哪里。完成此操作后,您可以调用_CrtSetReportFile
来指定win32 文件句柄(由CreateFile
返回)。
【讨论】:
我知道DebugView
和OutputDebugString()
。我的问题与此无关。这是我如何在不使用.NET
的情况下将TRACE
数据流重定向到其他东西。
你说的是MFC跟踪吗?您链接到的文章正在讨论重定向 .Net Debug 和 Trace 类的输出,这完全是另外一回事。您是否尝试过 INI 文件方法?
不,我没有尝试 INI 方法,因为它会输出太多数据。我只想要前 3 个堆栈帧输出。是的,当我查看该页面的 Trace 命令时,我一定是睡着了。 :(
修复了对我最初认为可以重定向 TRACE
输出的位置的引用。
对不起,我误读了 INI 文件文章。它可以修改输出,但不能重定向它。我已经更新了我的答案。以上是关于如何在 MFC 中重定向 TRACE 语句以减少来自 AfxDumpStack() 的数据流?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apache 2.4 中重定向 /path/variables/ 以重写为 /index.php/path/variables/?
如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2