将 OutputDebugString 记录到文件中(没有 DebugView)

Posted

技术标签:

【中文标题】将 OutputDebugString 记录到文件中(没有 DebugView)【英文标题】:Log OutputDebugString to a file (without DebugView) 【发布时间】:2014-06-20 05:43:20 【问题描述】:

我的 WPF 应用使用第三方 Win32 dll,通过 OutputDebugString 记录消息。

我可以在 Visual Studio 中或通过 DebugView 看到 OutputDebugString 消息,但我不想让我的客户运行 DebugView。我想从 OutputDebugString 捕获消息并自动将它们记录到一个文件中,所以如果客户有问题,我可以要求她将那个日志文件发送给我。

这可能吗?还是用户必须启动 DebugView,重现错误,然后以这种方式向我发送日志?

【问题讨论】:

你当然可以,但是你需要编写你自己的调试监听器,然后你基本上已经编写了一个 DebugView 的低级克隆。 DLL 不应该真的这样做。 OutputDebugString 仅用于调试目的,在正常情况下甚至不应在发布版本中调用。它适用于调试代码的人,而不是日志文件。 我将提交一个错误,但 DLL 不在我的手中。 :-( 【参考方案1】:

挂钩OutputDebugStringW。我建议为此使用Detours 库。

#include <windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")

BOOL SetHook(__in BOOL bState, __inout PVOID* ppPointer, __in PVOID pDetour)

  if (DetourTransactionBegin() == NO_ERROR)
    if (DetourUpdateThread(GetCurrentThread()) == NO_ERROR)
      if ((bState ? DetourAttach : DetourDetach)(ppPointer, pDetour) == NO_ERROR)
        if (DetourTransactionCommit() == NO_ERROR)
          return TRUE;
  return FALSE;


#define InstallHook(x, y) SetHook(TRUE, x, y)  

VOID (WINAPI * _OutputDebugStringW)(__in_z_opt LPCWSTR lpcszString) = OutputDebugStringW;

VOID WINAPI OutputDebugStringHook(__in_z_opt LPCWSTR lpcszString)

  // do something with the string, like write to file

  _OutputDebugStringW(lpcszString);


// somewhere in your code
InstallHook((PVOID*)&_OutputDebugStringW, OutputDebugStringHook);

【讨论】:

【参考方案2】:

@Cody Gray 建议“编写您自己的调试侦听器,然后您基本上编写了 DebugView 的低级克隆”,这听起来可能实际上是对我问题的回答。

这里是a C# implementation of a basic OutputDebugString capture tool。我在谷歌上看到过几次,但我的眼睛盯着它,假设,“这不可能是我想要的,不是吗?”事实证明,这可能就是我问题的答案。

【讨论】:

那么编写调试侦听器实际上是唯一的方法吗?这很疯狂。自动化测试应用程序运行怎么样?

以上是关于将 OutputDebugString 记录到文件中(没有 DebugView)的主要内容,如果未能解决你的问题,请参考以下文章

Delphi和OutputDebugString

如何将日志写入 Visual Studio 输出窗口?

控制台中的 OutputDebugString()

如何将 Windows 调试记录器附加到 spdlog

log4cxx OutputDebugString DebugView dbgview

如何从服务接收 OutputDebugString?