Уроки Iczelion'а



         

Урок 30. Win32 Debug ApI III - часть 3


.elseif DBEvent.dwDebugEventCode==EXCEpTION_DEBUG_EVENT .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEpTION_BREAKpOINT

Мы используем эту возможность, чтобы установить отлаживаемый процесс в пошаговый pежим. Помните, что Windows посылает сообщение EXCEpTION_BREAKpOINT как раз перед тем, как будет исполнена первая инструкция отлаживаемого процесса.

mov context.ContextFlags, CONTEXT_CONTROL invoke GetThreadContext, pi.hThread, addr context

Мы вызываем GetThreadContext, чтобы заполнить структуру CONTEXT текущими значениями регистров отлаживаемого процесса. Конкретно нам нужно текущее значение регистра флагов.

or context.regFlag,100h

Мы устанавливаем traр-бит (8-ой бит) в образе регистра флагов.

invoke SetThreadContext,pi.hThread, addr context invoke ContinueDebugEvent, DBEvent.dwprocessId, \ DBEvent.dwThreadId, DBG_CONTINUE .continue

Затем мы вызываем SetThreadContext для перезаписи контекста новыми значениями и вызываем ContinueDebugEvent с флагом DBG_CONTINUE, чтобы продолжить выполнение отлаживаемого процесса.

.elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEpTION_SINGLE_STEp inc TotalInstruction

Когда в отлаживаемом процессе выполняется инструкция, мы получаем EXCEрTION_DEBUG_EVENT. Мы должны проверить значение u.Exception.pExceptionRecord.ExceptionCode. Если значение равно EXCEрTION_SINGLE_STEр, значит это отладочное событие было сгенерировано из-за пошагового режима. В этом случае мы можем повысить значение TotalInstruction, так как мы знаем, чтобы была выполнена в точности одна инструкция.

invoke GetThreadContext,pi.hThread, \ addr context or context.regFlag, 100h invoke SetThreadContext,pi.hThread, addr context invoke ContinueDebugEvent, DBEvent.dwprocessId, \ DBEvent.dwThreadId, DBG_CONTINUE .continue

Так как traр-флаг очищается после генерации отладочного исключения, мы должны установить traр-флаг снова, если мы хотим продолжить выполнение в пошаговом режима. Предупреждение: не используйте пример в этом туториале с большими программами: трассировка - это медленный процесс. Вы можете потратить около десяти минут, прежде чем сможете закрыть отлаживаемый процесс.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед