我正在尝试编写一个扩展函数,它将运行到下一个调用,然后打印出有关下一条指令的信息。
我正在使用 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/