Re[5]: На сколько затратно выбрасывание исключения
От: Pavel Dvorkin Россия  
Дата: 01.03.15 17:45
Оценка:
Здравствуйте, drol, Вы писали:

D>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>throw из дотнета приводит в конечном счете к вызову нативной RaiseException из KERNELBASE.dll, а она приводит к переключению в режим ядра


D>Кто Вам это сказал ??? RaiseException совершенно не обязана переключаться в kernel mode. В случае 64-битного процесса RaiseException уходит в ядро только при подключенном отладчике, необработанном исключении и тому подобных ситуациях. Обычные же исключения обрабатываются полностью в user mode... Ну или мне счётчики kernel\user time врут...


Я не исключаю, что в x64 что-то изменилось, но хотелось бы более серьезного доказательства, нежели данные счетчиков времени. Если такие доказательства будут, я охотно поменяю свое мнение в том, что касается x64.

Пока что могу лишь сказать, что NtRaiseException как сервис ядра в x64 существует. Вот здесь ее номер даже (в смысле syscall) приведен.

http://www.evilsocket.net/2014/02/11/on-windows-syscall-mechanism-and-syscall-numbers-extraction-methods/

Правда, я не совсем понимаю, что Вы имеете в виду, говоря о необработанном исключении. RaiseException его выбрасывает, а обработка будет потом, если будет. Получается, что если обработки не будет, то управление вернется обратно в RaiseException, чтобы уйти в kernel ? Как-то странно это. Или она сама и должна заниматься обработкой исключения ? Так не ее же это дело, исключения могут и без нее возникнуть вполне. Что-то я не понимаю.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.