Переключение контекста обработки исключений и SEH - PullRequest
2 голосов
/ 25 ноября 2010

В последнее время я немного читал об обработке исключений и .Net Framework, и это, кажется, запутало меня больше, чем когда я начинал.

В CLR через C # Четвертое дополнение, которое я прочитал:

Также .NET Framework построен механизм обработки исключений используя структурированное исключение Механизм обработки (SEH), предлагаемый Майкрософт Виндоус. SEH был обсуждается во многих ресурсах, в том числе моя собственная книга, Windows через C / C ++, 5-й редактор (Microsoft Press, 2007), который содержит три главы, посвященные SEH.

Теперь, вот где начинается мое замешательство. Если платформа .Net Framework построена с использованием SEH, но используется ли она только для необработанного исключения или она используется сразу же для всей обработки исключений в .NET, если да, то куда вписывается CLR, принимает ли очереди из SEH или он действует сам по себе и использует SEH , если и когда возникает необработанное исключение ? .

Второе Как вписывается переключение контекста из режима Kerrnal в режим пользователя? Я знаю, когда поток создается, он имеет (из CLR через C #)

Блок среды потока (TEB) TEB - это блок памяти, выделенный а также инициализируется в пользовательском режиме (адресное пространство, код приложения может быстро получить доступ). TEB занимает 1 страницу памяти (4 КБ на процессорах x86 и x64, 8 КБ на Процессор IA64). TEB содержит заголовок цепочки обработки исключений потока. Каждый блок попытки то, что поток входит, вставляет узел в начало этой цепочки; узел удален из цепочки, когда поток существует в блоке try. К тому же, TEB содержит данные локального хранилища потока, а также некоторые данные структуры для использования Интерфейс графического устройства (GDI) и графика OpenGL.

AS, а также стек режима пользователя и стек режима ядра. Но почему в любой момент должно произойти переключение контекста, поскольку все необходимое для обработки находится в одном потоке?

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Вот очень подробное объяснение того, как CLR обрабатывает исключения (один из архитекторов CLR, я считаю): http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

1 голос
/ 25 ноября 2010

is [SEH] используется сразу для всех обработок исключений в .NET

Да. Создание исключений .NET приводит к возникновению структурированного исключения Win32.

Почему переключение контекста должно происходить в любой момент, поскольку все необходимое для обработки находится в одном потоке?

Когда вы генерируете исключение, ваш поток переходит в режим ядра и обратно, но участвует только один поток. Режим ядра не является отдельным потоком; это место, которое может посетить ваша тема.

Все исключения Win32 должны переходить через ядро. Например, инфраструктура отладчика живет в режиме ядра, и отладчик может захотеть перехватить исключение до того, как его увидит код пользовательского режима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...