1

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

IDebugControl::Execute用来跑步tc。如文档中所述,此调用在跟踪实际发生之前返回。tc在我的扩展返回之前,睡眠或调用 DispatchCallbacks 不会看到跟踪。

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

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

4

1 回答 1

2

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

首先,您应该执行 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()
于 2014-01-22T09:18:50.783 回答