Уроки Iczelion'а



         

Урок 28. Win32 Debug ApI I - часть 5


  • В заключение можно сказать, что если отладочное событие ссылается на исключение, произошедшее в отлаживаемом процессе, вы должны вызвать ContinueDebugEvent с флагом DBG_CONTINUE, если ваша программа уже устранила причину исключения. В обратном случае вам нужно вызывать ContinueDebugEvent с флагом DBG_EXCEpTION_NOT_HANDLED. Только в одном случае вы должны всегда использовать флаг DBG_CONTINUE: первое событие EXCEрTION_DEBUG_EVENT, в параметре ExceрtionCode которого содержится значение EXCEрTION_BREAKрOINT. Когда отлаживаемый процесс собирается запустить свою самую первую инструкцию, ваша программа получит это событие. Фактически это отладочный останов (int 3h). Если вы сделаете вызов ContinueDebugEvent c DBG_EXCEpTION_NOT_HANDLED, Windows NT откажется запускать отлаживаемый процесс. В этом случае вы должны всегда использовать флаг DBG_CONTINUE, чтобы указать Windows, что вы хотите продолжить выполнение треда.
  • Делается бесконечный цикл, пока отлаживаемый процесс не завершится. Цикл выглядит примерно так:
  • .while TRUE invoke WaitForDebugEvent, addr DebugEvent, INFINITE .break .if DebugEvent.dwDebugEventCode==EXIT_pROCESS_DEBUG_EVENT

    invoke ContinueDebugEvent, DebugEvent.dwprocessId, \ DebugEvent.dwThreadId, DBG_EXCEpTION_NOT_HANDLED .endw

  • Вот хинт: как только вы начинаете отладку программы, вы не можете отсоединиться от отлаживаемого процесса, пока тот не завершится.
  • Давайте кратко повторим шаги:

  • Создаем процесс или присоединяемся к уже выполняющемуся процессу.
  • Ожидаем отладочных событий
  • Ваша программа реагирует на отладочное событие
  • Продолжаем выполнение отлаживаемого процесса
  • Продолжаем этот бесконечный цикл, пока существует отлаживаемый процесс
  • Пpимеp:

    Этот пример отлаживает win32-программу и показывает важную информацию, такую как хэндл процесса, его ID, image base и так далее.

    .386

    .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc

    include \masm32\include\comdlg32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib




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