Специфические механизмы обработки исключений Microsoft
операционных Microsoft Windows В семействе систем используются некоторые специфические механизмы обработки исключений .
Структурированная обработка исключений
[ редактировать ]Microsoft Structured Exception Handling — это собственный механизм обработки исключений для Windows и предшественник технологии векторной обработки исключений (VEH). [1] В нем представлены finally
механизм, отсутствующий в стандартных исключениях C++ (но присутствующий в большинстве императивных языков, представленных позже). SEH устанавливается и обрабатывается отдельно для каждого потока выполнения .
Использование
[ редактировать ]Microsoft поддерживает SEH как метод программирования только на уровне компилятора. Компилятор MS Visual C++ имеет три нестандартных ключевых слова: __try
, __except
и __finally
— для этой цели. Другие аспекты обработки исключений поддерживаются рядом функций Win32 API , [2] например, RaiseException
чтобы вручную вызвать исключения SEH.
Выполнение
[ редактировать ]ИА-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
. [3]
В случае исключения в коде пользовательского режима операционная система [с] анализирует поток _EXCEPTION_REGISTRATION_RECORD и последовательно вызывает каждый обработчик исключений до тех пор, пока обработчик не сообщит, что он обработал исключение (по возвращаемому значению ), или пока список не будет исчерпан. Последний в списке всегда kernel32!UnhandledExceptionFilter
который отображает сообщение об ошибке общей защиты . [д] Затем список просматривается еще раз, давая обработчикам возможность очистить все используемые ресурсы. Наконец, выполнение возвращается в режим ядра. [и] где процесс либо возобновляется, либо завершается.
Срок действия патента на этот режим SEH, US5628016, истек в 2014 году.
х86-64
[ редактировать ]SEH в 64-разрядной версии Windows не включает список обработчиков исключений во время выполнения; вместо этого он использует таблицу размотки стека ( UNWIND_INFO
), интерпретируемый системой при возникновении исключения. [4] [5] Это означает, что компилятору не нужно генерировать дополнительный код для ручного выполнения раскрутки стека и соответствующего вызова обработчиков исключений. Ему просто нужно выдать информацию в виде раскрывающихся таблиц о расположении кадра стека и указанных обработчиках исключений.
Поддерживать
[ редактировать ]GCC 4.8+ из Mingw-w64 поддерживает использование 64-битного SEH для исключений C++. Поддержка LLVM clang __try
как на х86, так и на х64. [6]
Векторная обработка исключений
[ редактировать ]Векторная обработка исключений была представлена в Windows XP . [7] Векторная обработка исключений доступна программистам Windows, использующим такие языки, как C++ и Visual Basic . VEH не заменяет структурированную обработку исключений (SEH); скорее, VEH и SEH сосуществуют, причем обработчики VEH имеют приоритет над обработчиками SEH. [1] [7] По сравнению с SEH, VEH больше похож на сигналы Unix , доставляемые ядром . [8]
Примечания
[ редактировать ]- ^ Имя различается в разных версиях среды выполнения VC.
- ^
ntdll.dll
иkernel32.dll
, а также другие программы, статически связанные со средой выполнения VC, вместо этого скомпилировали эту функцию. - ^ Более конкретно,
ntdll!RtlDispatchException
системная процедура, вызываемая изntdll!KiUserExceptionDispatcher
который, в свою очередь, вызывается изnt!KiDispatchException
функция ядра. (Видеть Кен Джонсон (16 ноября 2007 г.). «Каталог обратных вызовов режима ядра NTDLL для пользовательского режима, часть 2: KiUserExceptionDispatcher» . подробности) - ^ процесса Сообщение можно отключить, изменив режим ошибки ; последний обработчик по умолчанию можно заменить SetUnhandledExceptionFilter API
- ^
ntdll!KiUserExceptionDispatcher
звонит либоnt!ZwContinue
илиnt!ZwRaiseException
Ссылки
[ редактировать ]- ^ Jump up to: а б «Векторная обработка исключений в Windows Server 2003 (через Интернет-архив)» . Архивировано из оригинала 18 января 2008 г.
- ^ Корпорация Microsoft (12 ноября 2009 г.). «Функции структурированной обработки исключений» . Библиотека MSDN . Проверено 23 июля 2022 г.
- ^ Питер Кляйсснер (14 февраля 2009 г.). «Обработка исключений Windows — Питер Кляйсснер» . Архивировано из оригинала 14 октября 2013 года . Проверено 21 ноября 2009 г. , структурированной обработки исключений на основе компилятора Раздел
- ^ «Исключительное поведение — структурированная обработка исключений x64» . НТ Инсайдер.
- ^ «Обработка исключений x64» . Документация VС++ 2019 .
- ^ «Совместимость MSVC» . Документация Clang 11 .
- ^ Jump up to: а б «Под капотом: новая векторная обработка исключений в Windows XP» . Архивировано из оригинала 15 сентября 2008 г.
- ^ «Windows Server 2003: откройте для себя улучшенную информацию о системе, новые API-интерфейсы ядра, отладки, безопасности и пользовательского интерфейса» . Архивировано из оригинала 5 мая 2008 г.
Внешние ссылки
[ редактировать ]- Корпорация Microsoft (12 ноября 2009 г.). «Структурированная обработка исключений» . Библиотека MSDN . Проверено 23 июля 2022 г.
- Мэтт Питрек (январь 1997 г.). «Ускоренный курс структурированной обработки исключений Win32» . МСЖ . 12 (1). Архивировано из оригинала 10 августа 2003 г. Обратите внимание, что приведенные там примеры не работают в современных системах Windows (после XP SP2) в исходном виде из-за изменений, внесенных Microsoft для решения проблем безопасности, присутствующих в ранней версии SEH. Примеры по-прежнему работают в более поздних версиях Windows, если они скомпилированы с помощью
/link /safeseh:no
. - «win32: безопасная структурированная обработка исключений» . Руководство Ясм .
- Патент США 7 480 919 – Безопасные исключения.
- Йоханнес Пассинг (20 мая 2008 г.). «Развлечение с низким уровнем SEH» . Охватывает неясные детали, необходимые для того, чтобы низкоуровневый код SEH (и особенно SafeSEH) работал в более современных Windows.
- Игорь Скочинский (6 марта 2006 г.). «Обращение к Microsoft Visual C++, часть I: обработка исключений» . OpenRCE . Проверено 17 ноября 2009 г.
- Мэтт Миллер (2 февраля 2009 г.). «Предотвращение использования перезаписи структурированного обработчика исключений (SEH) с помощью SEHOP» . Технет.
- Стефан Ле Берр, Дэмиен Кокиль (22 декабря 2009 г.). «Обход SEHOP» (PDF) . Системная мечта. Архивировано из оригинала (PDF) 7 сентября 2012 г.
- Джошуа Дж. Дрейк (10 января 2012 г.). «Старое встречается с новым: несовместимость Microsoft Windows SafeSEH» . Статья, объясняющая, почему Windows 7 SP1 игнорирует SafeSEH для некоторых старых двоичных файлов, а Windows XP SP3 учитывает его.