Расширение WinDbg

Я пытаюсь написать функцию расширения, которая будет запускаться до следующего вызова, а затем распечатывать информацию о следующей инструкции.

я использую IDebugControl::Execute бежать tc, Как отмечено в документации, этот вызов возвращается до того, как трассировка действительно произошла. Спящий или вызывающий DispatchCallbacks не видит tc трассировка происходит до того, как мое расширение вернется.

Как я могу позволить трассировке произойти, не возвращаясь от вызова?

Если я добавлю свой собственный DebugEventCallback, то смогу получать уведомления об инициированных изменениях DebuggeeState и EngineState, но не могу вернуться в движок от этих обратных вызовов.

1

Решение

Я думаю, что это не очень хорошая идея сделать вызов, изменяющий состояние отладчика через 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()
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector