c++ - WinDbg 扩展 C++ dprintf 在函数退出前不显示

标签 c++ windbg

在 WinDbg 扩展中使用时,是否有办法确保 dprintf 立即更新 WinDbg 控制台输出,而不是等到函数结束?

这似乎没有包含在文档中 here

示例代码

DECLARE_API(myextension)
{
    dprintf("Print some text\r\n");
    Sleep(5000);
}

如果在 WinDbg 中我加载这个扩展并执行它

!myextension

在将文本打印到控制台之前有 5 秒的延迟 - 我如何才能确保立即显示此文本。

在实际的解决方案中,我有一个长时间运行的任务,并希望在任务运行时继续输出;但是我也可以通过使用 sleep 来重现该问题。

最佳答案

wdbgexts 样式扩展很旧并且有一些限制
你应该尝试编写 engextcpp 样式扩展
或至少 dbgeng 样式扩展

这是一个 dbgeng 样式示例

#include <windows.h>
#include <dbgeng.h>
PDEBUG_CLIENT2   g_Client = NULL;
PDEBUG_CONTROL2  g_Control = NULL;
HRESULT CALLBACK  DebugExtensionInitialize(PULONG Version, PULONG Flags)
{
  *Version = DEBUG_EXTENSION_VERSION(1, 0);
  *Flags = 0;
  DebugCreate(__uuidof(IDebugClient2),(void **)&g_Client);  
  return g_Client->QueryInterface(__uuidof(IDebugControl2),(void **)&g_Control);  
}
HRESULT CALLBACK testsleep(PDEBUG_CLIENT , PCSTR )
{
  ULONG now = 0;
  g_Control->GetCurrentSystemUpTime(&now);
  g_Control->Output(DEBUG_OUTPUT_NORMAL,"sleep %x or %d now at %d\n",5000,5000,now);
  Sleep(5000);
  g_Control->GetCurrentSystemUpTime(&now);
  g_Control->Output(DEBUG_OUTPUT_NORMAL,"woke  %x or %d now at %d\n",5000,5000,now);
  return S_OK;
}

在 windbg 中运行 !testsleep 的结果

0:000> .time
....
System Uptime: 0 days 12:50:30.766
.....
0:000> !testsleep
sleep 1388 or 5000 now at 46235
woke  1388 or 5000 now at 46240
0:000> .formats 0n12*0n3600+0n50*0n60+0n30
.....
  Decimal: 46230

engextcpp 样式扩展的示例整洁干净,甚至不必包含 windows.h

#include <engextcpp.hpp>
class EXT_CLASS : public ExtExtension {
public:
    EXT_COMMAND_METHOD(testsleep);
};
EXT_DECLARE_GLOBALS();
EXT_COMMAND(testsleep,"","")
{
  ULONG now =0;
  m_Control2->GetCurrentSystemUpTime(&now);
  Out("Sleeping for 5000 milliseconds from %d\n",now);
  Sleep(5000);
  m_Control2->GetCurrentSystemUpTime(&now);
  Out("Slept    for 5000 milliseconds upto %d\n",now);  
}

从 !testSleep 运行

0:000> !testsleep
Sleeping for 5000 milliseconds from 48921
Slept    for 5000 milliseconds upto 48926

关于c++ - WinDbg 扩展 C++ dprintf 在函数退出前不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33541274/

相关文章:

c# - 带有 SOS 的 Windgb 不显示结构字段值

c++ - 使用 _set_purecall_handler 时如何在已发布的应用程序中获取调用堆栈

java - 调试从浏览器加载的 java 中加载的 dll

windows - 当线程阻塞等待事件时,SysInternals 的进程监视器可以记录吗?

c++ - x64 上 Boost 1.53 和 VS 2013 的链接器错误

c++ - cmake生成汇编文件然后编译成可执行文件

c++ - 此C++代码将如何工作?

c++ - 从源代码中读取 pkgversion

c++ - 如何从以管理员模式运行的 MFC 应用程序创建没有管理员权限的新进程?

c# - 使用 windbg 检测挂起的 C# 应用程序中的死锁