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

WinDbg Extension C++ dprintf Doesn't Display Until Function Exits

本文关键字:显示 退出 函数 扩展 C++ dprintf WinDbg      更新时间:2023-10-16

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

的文档中似乎没有涵盖这一点

示例代码

DECLARE_API(myextension)
{
    dprintf("Print some textrn");
    Sleep(5000);
}

如果在WinDbg中,我加载此扩展并执行它

!myextension

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

在实际的解决方案中,我有一个长时间运行的任务,希望在任务运行时继续输出;然而,我也可以通过睡眠来重现这个问题。

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 %dn",5000,5000,now);
  Sleep(5000);
  g_Control->GetCurrentSystemUpTime(&now);
  g_Control->Output(DEBUG_OUTPUT_NORMAL,"woke  %x or %d now at %dn",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样式扩展的示例neat an clean甚至不必包括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 %dn",now);
  Sleep(5000);
  m_Control2->GetCurrentSystemUpTime(&now);
  Out("Slept    for 5000 milliseconds upto %dn",now);  
}

逃跑!测试睡眠

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