![]() |
|
Модераторы: bsa |
![]()
|
|
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Каков механизм действий, имеющих место при возникновении ошибок?
1) Например, ошибка деления на вещ. ноль как правило по умолчанию обрабатывается FPU. Если например отключить это с помощью контрольного слова, то далее получаем авост (при условии, что не заданы другие средства перехвата ошибки). Возникает вопрос о порядке обработки подобной ситуации, т.е. в каком порядке действуют различные средства обработки (пользовательские в стиле C, пользовательские в стиле обработки исключений в С++, от RTL, от Windows) после того как FPU "умыл руки". Возникают также смежные вопросы 2) какова структура консольного приложения, как CRT соотносится с RTL от С++? |
|||
|
||||
| _GRIN_ |
|
|||
![]() одинокий падаван ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 18.11.2007 Где: Калуга Репутация: нет Всего: 7 |
FCM, прикольный вопрос в теме для новичков и название такое, простенькое
-------------------- Дорогу осилит идущий |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
FCM,
2) CRT - C Run Time libraries RTL - Run Time Libraries это одно и то же, только разные названия в MSVC - CRT, у борланда наверное RTL "структура консольного приложения" - это что? в PE заголовке стоит флаг что приложение консольное, винда делает для него консоль, точке входа - CRTmain() которая инициализирует CRT для 1го потока, и вызывает main() ввод-вывод производится через апи (WriteFile\ReadFile) завернутое в cin\cout (printf\...) 1) что есть авост я хз, но известно что ошибку ловит ближайший обработчик эксепшенов, SEH если стоит SEH, или обработчик по умолчанию, затем эксепшен передается в ближайший catch, как и любой другой эксепшен |
|||
|
||||
| DrHex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
syser, soft-ice, linece....
Это вопросы не совсем к программированю на С++ --------------------
google.com и это все. |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
GoldFinch,
авост- аварийная остановка. Ну вот произошла ошибка и предположим FPU ее не обработал, т.е. аппаратно она не обработана. Кто потом первый возмущается: OC Windows (которая по идее является посредником между "аппаратом" и приложениями), RTL от компилятора или пользовательские ловушки? Другими словами, кто это первым фиксирует и кто кого потом дергает за "ниточки"? Та же аварийная остановка от кого, от ОС или от RTL? Тот же (платформо-зависимый) SEH наверное тоже ближе к ОС, чем обычные С++ исключения? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
FCM, тогда уж "аварийный останов". собственно останова не происходит, происходит прерывание, его ловит ядро вынды, передает эксепшн в юзермодную часть винды, которая передает его приложению (CRT) если то поставило обработчик, а обработчик CRT передает его catch()
SEH - это механизм винды. вообще, о любых аппаратных эксепшенах прога может узнать только через ОС Это сообщение отредактировал(а) GoldFinch - 9.7.2009, 08:22 |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Т.е. получается, что OC в случае прерывания обращается к RTL( или CRT) которая в свою очередь обращается к пользовательским ловушкам. А если пользовательские ловушки срабатывают, то RTL и ОС ничего не предпринимают ? Если же пользователем ничего не предусмотрено, то RTL использует свои средства, а при их остутствии получаем авост приложения средствами ОС Windows?
Это сообщение отредактировал(а) FCM - 9.7.2009, 15:27 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
FCM, если пользовательский код вернул что эксепшен обработан, эксепшен дальше не передается, управление возвращается в ловушку CRT которая тоже возвращает системе что эксепшен обработан, затем управление передается в юзермодную часть ОС, которая сообщает ядру что эксепшен обработан, и выполнение потока сгенерировавшего эксепшен продолжается
|
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Понятно.
Но когда на этапе выполнения MVC++ приложения выполнение прекращается и вылезает окошко о чем-то недопустимом (в некоторых случаях с диагностикой/трассировкой) и предложение применить отладчик (MVC++) - это от кого, от RTL или Windows? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
от винды
RTL большинство ошибок не обрабатывает, и передает их необработанными винде например если РТЛ определит переполнение буфера, оно эту ошибку "обработает" - выведет сообщение и убъет прогу а если РТЛ получит int3, оно передаст его винде, винда тоже ничего не сделает и убьет приложение с ошибкой если в винде есть JIT отладчик, она предложит подебажить Это сообщение отредактировал(а) GoldFinch - 9.7.2009, 16:17 |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Приложения ведут себя по разному относительно ошибок в Debug- и Release-сборках. В Debug- больше контроля и реакция подробнее.
Если посмотреть в свойствах проекта, то можно найти опции, которые по умолчанию настроены по-разному в Debug- и Release-сборках. А как это работает? Т.е. что реально означает изменение соотв опций - значит ли это, что включаются/выключаются некие ловушки RTL или это происходит где-то в другом месте? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
это значит что включается доп код, который бросает программные эксепшены, при переполнении буфера например,
если они не доходят до системы, система о них не узнает |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
GoldFinch, cпасибо!
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |