События отладки


Событие отладки - это особая ситуация в отлаживаемом процессе, который заставляет систему уведомлять отладчик. События отладки включают в себя создание процесса, создание потока, загрузка динамически подключаемой библиотеки (DLL), выгрузка DLL, отправка символьной строки вывода данных и генерация исключительной ситуации.

Если событие отладки происходит в то время, когда отладчик  ожидает его, система заполняет структуру DEBUG_EVENT, заданную функцией WaitForDebugEvent информацией, характеризующей событие.

Когда система уведомляет отладчик о событии отладки, она также приостанавливает  и все потоки в затронутом процессе. Потоки не возобновляют   исполнение кода  до тех пор, пока не отладчик  не продолжит событие отладки, используя функцию ContinueDebugEvent. Ниже перечислены события отладки,  которые могут произойти в то время, когда процесс отлаживается.

Событие отладки

Описание

CREATE_PROCESS_DEBUG_EVENT Генерируется всякий раз, когда создается новый процесс в отлаживаемом процессе, или всякий раз, когда отладчик начинает отлаживать уже активный процесс. Система создает это событие отладки прежде, чем процесс начинает исполнять код в пользовательском режиме и прежде, чем система создает любые другие события отладки для нового процесса.

Структура DEBUG_EVENT содержит структуру CREATE_PROCESS_DEBUG_INFO. Эта структура включает в себя дескриптор нового процесса, дескриптор загрузочного модуля процесса, дескриптор начального потока процесса и другую информацию, которая характеризует новый процесс.

Дескриптор процесса имеет доступ PROCESS_VM_READ и PROCESS_VM_WRITE. Если отладчик  имеет эти типы доступа к потоку, то он  может читать и записывать в память процесса, используя функции WriteProcessMemory и ReadProcessMemory. Если система предварительно сообщила о событии  EXIT_PROCESS_DEBUG_EVENT, система закрывает этот дескриптор, когда отладчик  вызывает функцию ContinueDebugEvent.

Дескриптор загрузочного модуля процесса имеет доступ GENERIC_READ и открывается для совместного чтения. Отладчик  должен закрыть этот дескриптор, в то время, когда обрабатывает CREATE_PROCESS_DEBUG_EVENT.

Дескриптор начального потока процесса имеет доступ  THREAD_GET_CONTEXT, THREAD_SET_CONTEXT и THREAD_SUSPEND_RESUME к потоку. Если отладчик  имеет имеет эти  типы доступа к потоку, он может читать из и записывать в регистры потока, используя функции GetThreadContext и SetThreadContext и может приостановить и возобновить поток, используя функции ResumeThread и SuspendThread.  Если система предварительно сообщила о событии EXIT_PROCESS_DEBUG_EVENT, она закрывает этот дескриптор тогда, когда отладчик вызывает функцию ContinueDebugEvent.

CREATE_THREAD_DEBUG_EVENT Генерируется всякий раз, когда в отлаживаемом процессе создается новый поток или всякий раз, когда отладчик начинает делать отладку уже активного процесса. Это событие отладки создается прежде, чем новый поток начинает исполнять код в пользовательском режиме.

Структура DEBUG_EVENT содержит структуру CREATE_THREAD_DEBUG_INFO. Эта структура включает в себя дескриптор нового потока и начальный адрес потока. Дескриптор имеет  доступ к потоку THREAD_GET_CONTEXT, THREAD_SET_CONTEXT и THREAD_SUSPEND_RESUME. Если отладчик имеет эти типы доступа к потоку, он может читать из и записывать в регистры потока, используя функции GetThreadContext и SetThreadContext и может приостановить и возобновить работу потока, используя функции SuspendThread и ResumeThread.

Если система предварительно сообщила о событии EXIT_THREAD_DEBUG_EVENT, она закрывает дескриптор нового потока, когда отладчик вызывает функцию ContinueDebugEvent.

EXCEPTION_DEBUG_EVENT Генерируется всякий раз, когда происходит исключительная ситуация в отлаживаемом процессе. Возможные исключения включают в себя попытку доступа в недоступную область памяти, выполнение команд контрольного останова, попытка деления на нуль, или любая другая исключительная ситуация, на которую обращают внимание в  статье Структурная обработка исключений.

Структура DEBUG_EVENT содержит структуру EXCEPTION_DEBUG_INFO. Эта структура характеризует исключительную ситуацию, которая породила событие отладки.

Помимо стандартных исключительных ситуаций, дополнительный код исключения может встретиться в ходе отладки консольного процесса. Система генерирует код исключительной ситуации DBG_CONTROL_C , когда через CTRL+C  вводятся данные в консольный процесс, который обрабатывает сигналы CTRL+C и отлаживается.  Этот код исключительной ситуации не предназначен, чтобы обрабатываться приложениями. Приложение никогда не должно использовать обработчик исключительных ситуаций, чтобы иметь дело с этим. Это приносит пользу только отладчику, да и то только тогда, когда  используемый отладчик связан с консольным процессом.

Если процесс не отлаживается или, если отладчик передает исключительную ситуацию DBG_CONTROL_C необработанной (через посредство команды gn), ищется список обрабатывающих функций приложения, как документировано в функции SetConsoleCtrlHandler.

Если отладчик обрабатывает исключительную ситуацию DBG_CONTROL_C (через посредство команды gh), приложение не будет обращать внимание на исключение CTRL+C в коде подобно этому.

while ((inputChar = getchar())
        != EOF) ...
or
while (gets(inputString)) ...

В соответствии с этим, отладчик  не может использоваться, чтобы остановить ожидание чтения в таком коде  завершения работы.

EXIT_PROCESS_DEBUG_EVENT Генерируется всякий раз, когда последний поток в отлаживаемом процессе завершает работу. Это событие отладки происходит немедленно после того, как система выгружает DLL процесса и модернизирует код завершения процесса.

Структура DEBUG_EVENT содержит структуру EXIT_PROCESS_DEBUG_INFO, которая определяет код завершения.

Отладчик освобождает любые внутренние структуры, связанные с процессом при получении этого события отладки. Система закрывает дескриптор отладчика, чтобы завершить работу процесса и всех его потоков. Отладчик  не должен закрывать эти дескрипторы.

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

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

EXIT_THREAD_DEBUG_EVENT Генерируется всякий раз, когда поток, который является частью отлаживаемого процесса, завершает работу. Система генерирует это событие отладки немедленно после того, как модернизирует код завершения работы потока.

Структура DEBUG_EVENT содержит структуру EXIT_THREAD_DEBUG_INFO, которая определяет код завершения работы.

Это событие отладки не происходит, если завершенный поток - последний поток процесса. В этой ситуации вместо этого происходит событие отладки EXIT_PROCESS_DEBUG_EVENT.

Отладчик освобождает любые внутренние структуры, связанные с потоком при получении этого события отладки. Система закрывает дескриптор отладчика  выхода из потока. Отладчик не должен закрывать этот дескриптор.

LOAD_DLL_DEBUG_EVENT Генерируется всякий раз, когда отлаживаемый процесс загружает DLL. Это событие отладки происходит, когда системный загрузчик разрешает связь с DLL, или когда отлаженный процесс использует функцию LoadLibrary. Это событие отладки происходит только в  самом начале, когда система назначает DLL виртуальному адресному пространству процесса.

Структура DEBUG_EVENT содержит структуру LOAD_DLL_DEBUG_INFO. Эта структура включает в себя дескриптор недавно загруженной DLL, базовый адрес DLL и другую информацию, которая характеризует ее. Отладчик должен закрыть дескриптор DLL, в то время, когда обрабатывает LOAD_DLL_DEBUG_EVENT.

Как правило, отладчик загружает символьную таблицу, связанную с DLL по получению этого события отладки.

OUTPUT_DEBUG_STRING_EVENT Генерируется тогда, когда отлаживаемый процесс использует функцию OutputDebugString.

Структура DEBUG_EVENT содержит структуру OUTPUT_DEBUG_STRING_INFO. Эта структура определяет адрес, длину и формат символьной строки отладки.

UNLOAD_DLL_DEBUG_EVENT Генерируется всякий раз, когда отлаживаемый процесс выгружает DLL, используя функцию FreeLibrary. Это событие отладки происходит только в последнюю очередь, когда DLL выгружается из адресного пространства процесса (то есть когда итоговое число использования DLL равняется нулю).

Структура DEBUG_EVENT содержит структуру UNLOAD_DLL_DEBUG_INFO. Эта структура определяет базовый адрес DLL в адресном пространстве процесса, который выгружает DLL.

Как правило, отладчик выгружает символьную таблицу, связанную с DLL после приема этого события отладки.

Когда процесс завершает работу, система автоматически выгружает DLL процесса, но не генерирует событие отладки UNLOAD_DLL_DEBUG_EVENT.

Назад в оглавление
На главную страницу

Hosted by uCoz