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

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

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

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

Событие отладки Description
CREATE_PROCESS_DEBUG_EVENT
Создается всякий раз, когда новый процесс создается в процессе отладки или всякий раз, когда отладчик начинает отладку уже активного процесса. Система создает это событие отладки до начала выполнения процесса в пользовательском режиме и до того, как система создает любые другие события отладки для нового процесса.
Структура DEBUG_EVENT содержит структуру CREATE_PROCESS_DEBUG_INFO. Эта структура включает дескриптор нового процесса, дескриптор файла изображения процесса, дескриптор начального потока процесса и другие сведения, описывающие новый процесс.
Дескриптор процесса имеет доступ PROCESS_VM_READ и PROCESS_VM_WRITE. Если отладчик имеет доступ к потоку, он может читать и записывать в память процесса с помощью функций ReadProcessMemory и WriteProcessMemory. Если система ранее сообщила о событии EXIT_PROCESS_DEBUG_EVENT, система закрывает этот дескриптор, когда отладчик вызывает функцию ContinueDebugEvent.
Дескриптор файла изображения процесса имеет GENERIC_READ доступ и открыт для общего доступа к чтению. Отладчик должен закрыть этот дескриптор во время обработки CREATE_PROCESS_DEBUG_EVENT.
Дескриптор начального потока процесса имеет THREAD_GET_CONTEXT, THREAD_SET_CONTEXT и THREAD_SUSPEND_RESUME доступ к потоку. Если отладчик имеет эти типы доступа к потоку, он может считывать и записывать данные в регистры потока с помощью функций GetThreadContext и SetThreadContext и может приостановить и возобновить поток с помощью функций SuspendThread и ResumeThread. Если система ранее сообщила о событии 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) ...
Таким образом, отладчик не может использоваться для остановки ожидания чтения в таком коде после завершения.
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. Отладчик должен закрыть дескриптор 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.
RIP_EVENT
Создается всякий раз, когда отлаживаемый процесс умирает за пределами управления системным отладчиком.
Структура DEBUG_EVENT содержит RIP_INFO структуру. Эта структура указывает ошибку и тип ошибки.