Специфичные для Microsoft механизмы обработки исключений

редактировать

В семействе ОС Microsoft Windows используются некоторые обработка исключений механизмы, основанные на особенностях операционной системы.

Содержание
  • 1 Структурированная обработка исключений
    • 1.1 Использование
    • 1.2 Реализация
      • 1.2.1 IA-32
      • 1.2.2 x86-64
    • 1.3 Поддержка
  • 2 векторных исключения Обработка
  • 3 Примечания
  • 4 Ссылки
  • 5 Внешние ссылки
Обработка структурированных исключений

Обработка структурированных исключений Microsoft - это собственный механизм обработки исключений для Windows и предшествующая технология для Vectored Обработка исключений (VEH). В нем реализован механизм finally, отсутствующий в стандартных исключениях C ++ (но присутствующий в большинстве императивных языков, представленных позже). SEH настраивается и обрабатывается отдельно для каждого потока выполнения .

Использование

Microsoft поддерживает SEH как метод программирования только на уровне компилятора. В компиляторе MS Visual C ++ есть три нестандартных ключевых слова: __try, __exceptи __finally- для этого. Другие аспекты обработки исключений поддерживаются рядом функций Win32 API, например, RaiseExceptionдля ручного создания исключений SEH.

Реализация

IA-32

Каждый поток выполнения в Windows IA-32 редакции или WoW64 Уровень эмуляции для версии x86-64 имеет ссылку на недокументированный список _EXCEPTION_REGISTRATION_RECORD в начале своего блока информации о потоке. Оператор __tryпо существу вызывает определенную компилятором функцию EH_prolog. Эта функция выделяет _EXCEPTION_REGISTRATION_RECORD в стеке, указывая на функцию __except_handler3в msvcrt.dll, затем добавляет запись в начало списка. В конце блока __try вызывается определяемая компилятором функция EH_epilog, которая выполняет обратную операцию. Любая из этих определяемых компилятором подпрограмм может быть встроенной. Все определенные программистом блоки __exceptи __finallyвызываются из __except_handler3. Если присутствуют блоки, определенные программистом, _EXCEPTION_REGISTRATION_RECORD, созданный EH_prolog, расширяется несколькими дополнительными полями, используемыми __except_handler3.

В случае исключения в пользовательском режиме, операционная система анализирует список _EXCEPTION_REGISTRATION_RECORD потока и последовательно вызывает каждый обработчик исключений до тех пор, пока обработчик не сообщит, что он обработал исключение (с помощью возвращаемого значения ) или список не будет исчерпан. Последним в списке всегда является kernel32! UnhandledExceptionFilter, который отображает сообщение об ошибке General protection fault. Затем список просматривается еще раз, давая обработчикам возможность очистить все используемые ресурсы. Наконец, выполнение возвращается в режим ядра, где процесс либо возобновляется, либо завершается.

Патент на этот режим SEH, US5628016, истек в 2014 году.

x86-64

SEH в 64-битной Windows проще, так как предполагает только использование таблица вместо того, чтобы компилятор генерировал код.

Поддержка

GCC 4.8+ из Mingw-w64 поддерживает использование 64-битного SEH для исключений C ++. LLVM clang поддерживает __tryкак на x86, так и на x64.

Векторная обработка исключений

Векторная обработка исключений была представлена ​​в Windows XP. Векторная обработка исключений доступна для программистов Windows, использующих такие языки, как C ++ и Visual Basic. VEH не заменяет структурированную обработку исключений (SEH), скорее, VEH и SEH сосуществуют, причем обработчики VEH имеют приоритет над обработчиками SEH. По сравнению с SEH, VEH работает больше как доставляемые ядром сигналы Unix.

Примечания
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-30 10:10:30
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте