【问题标题】:WinDbg Extension steppingWinDbg 扩展步进
【发布时间】:2014-01-22 17:18:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ debugging windbg dbgeng


    【解决方案1】:

    我认为通过 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()
    

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多