如何在 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 返回)。

【讨论】:

我知道DebugViewOutputDebugString()。我的问题与此无关。这是我如何在不使用.NET 的情况下将TRACE 数据流重定向到其他东西。 你说的是MFC跟踪吗?您链接到的文章正在讨论重定向 .Net Debug 和 Trace 类的输出,这完全是另外一回事。您是否尝试过 INI 文件方法? 不,我没有尝试 INI 方法,因为它会输出太多数据。我只想要前 3 个堆栈帧输出。是的,当我查看该页面的 Trace 命令时,我一定是睡着了。 :( 修复了对我最初认为可以重定向 TRACE 输出的位置的引用。 对不起,我误读了 INI 文件文章。它可以修改输出,但不能重定向它。我已经更新了我的答案。

以上是关于如何在 MFC 中重定向 TRACE 语句以减少来自 AfxDumpStack() 的数据流?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache 2.4 中重定向 /path/variables/ 以重写为 /index.php/path/variables/?

如何在 asp.net mvc 中重定向到正确的控制器操作

如何在 Spring 中重定向到另一台主机

如何在 React 中重定向

如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2

在 CodeIgniter 中重定向整个站点不起作用