По крайней мере, в соответствии с описанием Mono's exception handling implementation все регистры x86 сохраняются при вызове исключения. Помимо указателя стека (ESP), указателей кадров (EBP), указателей инструкций (EIP) и регистра, который содержит объект исключения, почему другие регистры также сохранены? Зачем сохранять весь контекст, когда в .NET нет механизма для продолжения выполнения в точке сразу после броска?Почему все регистры сохраняются во время обработки исключений .NET?
UPDATE:
EMCA заявляет следующее в разделе 12.3.2.4 Обзор обработки исключений:
Объект исключения, описывающее исключение автоматически создается CLI и надевается на в стек оценки как первый элемент при входе в предложение фильтра или catch.
Выполнение не может быть возобновлено в месте исключения, за исключением обработчика фильтра.
Я не знаю, как «исключить с помощью обработчика фильтра» можно выполнить в свете предыдущего утверждения. Кроме того, описание кода операции endfilter имеет только два результата: «продолжить поиск другого обработчика исключений» или выполнить обработчик (который будет выполнять другой блок кодов операций CIL.) Отсутствует опция «возобновить». Поэтому я интерпретирую это несоответствие в спецификации, в основном, означает, что .NET не поддерживает продолжение выполнения в точке сразу после броска. Возможно, это было рассмотрено в какой-то момент, но никогда не было полностью реализовано и реализовано.
UPDATE 2:
Кто-то отметил, что «резюме» может просто случиться, если ни одного обработчика фильтра не выбирает, чтобы поймать исключение. Однако спецификация для состояний throw: «команда throw выдает объект исключения в стек и освобождает стек». Очистка стека делает невозможным выполнение кода сразу после инструкции throw, поскольку этот код может потребовать что-то в стеке.
просто догадка, но так, что у некоторых инструментов отладки от сбоев есть товар? – kenny
Возможно, что-то связано с обработкой исключительных ситуаций с первым шансом против вторичных исключений и/или фильтрами исключений? –