Windbg扩展步骤

WinDbg Extension stepping

本文关键字:扩展 Windbg      更新时间:2023-10-16

我正在尝试编写一个扩展功能,该功能将运行到下一个呼叫,然后打印出有关下一个指令的信息。

我正在使用IDebugControl::Execute运行tc。如文档中指出的那样,此呼叫在跟踪实际发生之前返回。在我的扩展返回之前,睡觉或调用dispatchcallbacks看不到tc跟踪发生。

如何允许跟踪发生而不从呼叫返回?

如果我添加了自己的DebugeVentCallback,那么我可以通知触发的debgeestate和Enginestate更改,但无法从这些回调中回到引擎。

我认为通过iDebugcontrol :: execute(g,t等)呼叫更改调试器状态不是一个好主意

首先,您应该实现步骤命令:

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()