c++ - WinDbg 扩展步进

标签 c++ debugging windbg dbgeng

我正在尝试编写一个扩展函数,它将运行到下一个调用,然后打印出有关下一条指令的信息。

我正在使用 IDebugControl::Execute 来运行 tc。如文档中所述,此调用在跟踪实际发生之前返回。在我的扩展程序返回之前,休眠或调用 DispatchCallbacks 看不到 tc 跟踪发生。

如何在不从通话返回的情况下允许跟踪发生?

如果我添加自己的 DebugEventCallback,那么我可以获得触发的 DebuggeeState 和 EngineState 更改的通知,但无法从这些回调返回引擎。

最佳答案

我认为通过 IDebugControl::Execute(g、t 等)调用更改调试器状态不是一个好主意

首先你应该执行step命令:

control->SetExecutionStatus(DEBUG_STATUS_STEP_OVER);
control->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE);

然后你可以为调用签名制作一个匹配器:

registers->GetInstructionOffset( &ip );
control->Disassemble( ip, ..., disasmStr, .. 
return  disasmStr

然后就可以建立自己的tc了:

while( CurrentInstruction() != 'call' ) makeOneStep()

您可以使用我们的 python 扩展:pykd.codeplex.com

Python 代码如下所示:

from pykd import disasm, step
while disasm().instruction.find('call') < 0:
   step()

关于c++ - WinDbg 扩展步进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267202/

相关文章:

arrays - Fortran 和 Visual Studio 调试中的自动数组长度

javascript - 使用 System.js 在 Angular 2 应用程序中导入 Visionmedia 调试以及如何记录消息?

c++ - 使用 bind() 时,即使不使用 ref() 适配器,参数也会通过引用传递

c++ - binary_log_types.h : No such file or directory

c++ - 存储 std::list 元素的地址;内存

visual-studio - Visual Studio Debugger 未在鼠标悬停时显示变量详细信息,因为它是 "out of context"

c# - 如何诊断混合托管/非托管 x32 .NET 应用程序中损坏的后缀模式

c# - 在 Visual Studio 2008 中为 .Net 托管应用程序从 WinDbg 调试 .dmp 文件

c++ - windows故障转储文件详细内存使用分析?

c++ - 以下 c++ 函数中的数组重新分配在函数调用后似乎已被忽略。