将OutputDebugString记录到文件中(不带DebugView)

时间:2014-06-20 05:43:20

标签: winapi

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

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

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

2 个答案:

答案 0 :(得分:4)

挂钩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);

答案 1 :(得分:1)

@Cody Gray建议“编写自己的调试监听器,然后你基本上编写了一个劣质的DebugView克隆”,听起来它实际上可能是我问题的答案。

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