2014-01-21 78 views
1

我想寫一個擴展函數,它將運行到下一個調用,然後打印出有關下一條指令的信息。我使用IDebugControl::Execute來運行tc。如文檔中所述,該調用在實際發生跟蹤之前返回。在我的擴展返回之前,Sleeping或調用DispatchCallbacks沒有看到tc跟蹤發生。WinDbg擴展步進

我該如何允許跟蹤在沒有從通話中返回的情況下發生?

如果我添加自己的DebugEventCallback,那麼我可以得到觸發的DebuggeeState和EngineState更改的通知,但無法從這些回調中重新引入引擎。

回答

2

,我認爲這不是一個好主意,使呼叫通過IDebugControl改變調試狀態::執行(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()