Jump to content

Специфические механизмы обработки исключений 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.

Выполнение

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

Каждый поток выполнения в версии 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 году.

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]

Примечания

[ редактировать ]
  1. ^ Имя различается в разных версиях среды выполнения VC.
  2. ^ ntdll.dll и kernel32.dll, а также другие программы, статически связанные со средой выполнения VC, вместо этого скомпилировали эту функцию.
  3. ^ Более конкретно, ntdll!RtlDispatchException системная процедура, вызываемая из ntdll!KiUserExceptionDispatcher который, в свою очередь, вызывается из nt!KiDispatchException функция ядра. (Видеть Кен Джонсон (16 ноября 2007 г.). «Каталог обратных вызовов режима ядра NTDLL для пользовательского режима, часть 2: KiUserExceptionDispatcher» . подробности)
  4. ^ процесса Сообщение можно отключить, изменив режим ошибки ; последний обработчик по умолчанию можно заменить SetUnhandledExceptionFilter API
  5. ^ ntdll!KiUserExceptionDispatcher звонит либо nt!ZwContinue или nt!ZwRaiseException
  1. ^ Перейти обратно: а б «Векторная обработка исключений в Windows Server 2003 (через Интернет-архив)» . Архивировано из оригинала 18 января 2008 г.
  2. ^ Корпорация Microsoft (12 ноября 2009 г.). «Функции структурированной обработки исключений» . Библиотека MSDN . Проверено 23 июля 2022 г.
  3. ^ Питер Кляйсснер (14 февраля 2009 г.). «Обработка исключений Windows — Питер Кляйсснер» . Архивировано из оригинала 14 октября 2013 года . Проверено 21 ноября 2009 г. , структурированной обработки исключений на основе компилятора Раздел
  4. ^ «Исключительное поведение — структурированная обработка исключений x64» . НТ Инсайдер.
  5. ^ «Обработка исключений x64» . Документация VС++ 2019 .
  6. ^ «Совместимость MSVC» . Документация Clang 11 .
  7. ^ Перейти обратно: а б «Под капотом: новая векторная обработка исключений в Windows XP» . Архивировано из оригинала 15 сентября 2008 г.
  8. ^ «Windows Server 2003: откройте для себя улучшенную информацию о системе, новые API-интерфейсы ядра, отладки, безопасности и пользовательского интерфейса» . Архивировано из оригинала 5 мая 2008 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 11b39de7d01f01294999dfe992d0a853__1692842820
URL1:https://arc.ask3.ru/arc/aa/11/53/11b39de7d01f01294999dfe992d0a853.html
Заголовок, (Title) документа по адресу, URL1:
Microsoft-specific exception handling mechanisms - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)