Windows для профессионалов


Глава 25 - Необработанные исключения и исключения С++


Глава 25 - Необработанные исключения и исключения С++

В предыдущей главе мы обсудили, что происходит, когда фильтр возвращает значе ние EXCEPTION_CONTШNUE_SEARCH. Оно заставляет систему искать дополнительные фильтры исключений, продвшаясь вверх по дереву вызовов. А что будет, если все фильтры вернут EXCEPTION_CONTINUE_SEARCH? Тогда мы получим необработанное исключение (unhandled exception).

Как Вы помните из главы 6, выполнение потока начинается с функции BaseProcess Start или BaseThreadStart в Kernel32.dll Единственная разница между этими функция ми в том, что первая используется для запуска первичного потока процесса, а вто рая — для запуска остальных потоков процесса.

VOID BaseProcessStart(PPROCESS_START_ROUTINE pfnStartAddr)
{

__try
{

ExitThread({pfnStartAddr)());

}

_except (UnhandledExceptionFilter(GetExceptionInformation()))
{

ExitProcess(GetExecptionCode());

}

// Примечание, сюда мы никогда не попадем

}

VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam)
{

__try
{

ExitThread((pfnStartAddr)(pvParam));

}

_except (UnhandledExceptionFilter(GetExceptionInformation())}
{

ExitProcess(GetExceptionCode());

}

// Примечание, сюда мы никогда не попадем

}

Обратите внимание, что обе функции содержат SEH-фрейм: поток запускается из блока try. Если поток возбудит исключение, в ответ на которое все Ваши фильтры вер нут EXCEPTION_CONTINUE_SEARCH, будет вызвана особая функция фильтра, предос тавляемая операционной системой:

LONG UnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo);

Она выводит окно, указывающее на то, что поток в процессе вызвал необрабаты ваемое им исключение, и предлагает либо закрыть процесс, либо начать его отладку. В Windows 98 это окно выглядит следующим образом.

h25-01.jpg

А в Windows 2000 оно имеет другой вид.

h25-02.jpg

В Windows 2000 первая часть текста в этом окне подсказывает тип исключения и адрес вызвавшей его инструкции в адресном пространстве процесса. У меня окно появилось из-за нарушения доступа к памяти, поэтому система сообщила адрес, по которому произошла ошибка, и тип доступа к памяти — чтение UnhandledException Filter получает эту информацию из элемента Exceptionlnformation структуры EXCEP TION_RECORD, инициализированной для этого исключения.




Начало  Назад  Вперед