Перед вами
очередной выпуск рассылки "Программирование на WinApi" Переводы многих функций Win32API, которые часто используются
в данной рассылке, вы можете получать, подписавшись на дружественную
рассылку "WinAPI на
русском". Справочник по функциям Win32API вы
можете посмотреть на сайте BcbDev.ru в разделе MSDN
по-русски.
Использование поддержки
отладчика
Следующий пример использует
функции WaitForDebugEvent и
ContinueDebugEvent для иллюстрации организации простого
отладчика:(MSDN - Using Debugging Support)
DEBUG_EVENT DebugEv; // информация события отладки
DWORD dwContinueStatus = DBG_CONTINUE; // продолжение в случае исключения
for(;;)
{
// Ждем, пока произойдет событие отладки. Второй параметр указывает, что
// из функции не будет возврата, пока не произойдет событие отладки.
WaitForDebugEvent(&DebugEv, INFINITE);
// Обработать код события отладки.
switch (DebugEv.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
// Обработать код исключения. При обработке
// исключения, не забудьте установить параметр
// статуса(dwContinueStatus). Это значение
// используется функцией ContinueDebugEvent.
switch (DebugEv.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
// Первая попытка: Передать это системе.
// Последняя попытка: Отобразить соответствующую ошибку.
case EXCEPTION_BREAKPOINT:
// Первая попытка: Отобразить текущую команду
// и значение регистра.
case EXCEPTION_DATATYPE_MISALIGNMENT:
// Первая попытка: Передать это системе.
// Последняя попытка: Отобразить соответствующую ошибку.
case EXCEPTION_SINGLE_STEP:
// Первая попытка: Обновить отображение текущей инструкции
// и значения регистра.
case DBG_CONTROL_C:
// Первая попытка: Передать это системе.
// Последняя попытка: Отобразить соответствующую ошибку.
// Обработка других исключений.
}
case CREATE_THREAD_DEBUG_EVENT:
// Как надо исследуйте или изменяйте регистры потока
// при помощи функций GetThreadContext и SetThreadContext;
// и приостанавливайте и возобновляйте выполнение потока при помощи функций
// SuspendThread и ResumeThread.
case CREATE_PROCESS_DEBUG_EVENT:
// Как надо исследуйте или изменяйте регистры первичного потока
// процесса, при помощи функций GetThreadContext и SetThreadContext;
// читайте и пишите в виртуальную память процесса при помощи функций
// ReadProcessMemory и WriteProcessMemory;
// и приостанавливайте и возобновляйте выполнение потока при помощи функций
// SuspendThread и ResumeThread.
case EXIT_THREAD_DEBUG_EVENT:
// Отобразить код завершения потока.
case EXIT_PROCESS_DEBUG_EVENT:
// Отобразить код завершения процесса
case LOAD_DLL_DEBUG_EVENT:
// Считать отладочную информацию включенную в недавно загруженную DLL.
case UNLOAD_DLL_DEBUG_EVENT:
// Отобразить сообщение о выгрузке DLL.
case OUTPUT_DEBUG_STRING_EVENT:
// Отобразить выведенную отладочную строку.
}
// Возобновить выполнение потока, который сообщил о событии отладки.
ContinueDebugEvent(DebugEv.dwProcessId,
DebugEv.dwThreadId, dwContinueStatus);
}