WinDbg 扩展 C++ dprintf 在函数退出前不显示
WinDbg Extension C++ dprintf Doesn't Display Until Function Exits
在 WinDbg 扩展中使用时,是否有办法确保 dprintf 立即更新 WinDbg 控制台输出,而不是等到函数结束?
这似乎没有包含在文档中here
示例代码
DECLARE_API(myextension)
{
dprintf("Print some text\r\n");
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 %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 中 运行ning !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);
}
a 运行 来自 !testSleep
0:000> !testsleep
Sleeping for 5000 milliseconds from 48921
Slept for 5000 milliseconds upto 48926
在 WinDbg 扩展中使用时,是否有办法确保 dprintf 立即更新 WinDbg 控制台输出,而不是等到函数结束?
这似乎没有包含在文档中here
示例代码
DECLARE_API(myextension)
{
dprintf("Print some text\r\n");
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 %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 中 运行ning !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);
}
a 运行 来自 !testSleep
0:000> !testsleep
Sleeping for 5000 milliseconds from 48921
Slept for 5000 milliseconds upto 48926