Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка ошибок в консоль-приложении 
V
    Опции темы
FCM
Дата 6.7.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Каков механизм действий, имеющих место при возникновении ошибок?
1) Например, ошибка деления на вещ. ноль как правило по умолчанию обрабатывается FPU. Если например отключить это с помощью контрольного слова, то далее получаем авост  (при условии, что не заданы другие средства перехвата ошибки).
Возникает вопрос о порядке обработки подобной ситуации, т.е. в каком порядке действуют различные средства обработки (пользовательские в стиле C, пользовательские в стиле обработки исключений в С++, от RTL, от Windows) после того как FPU "умыл руки". 
Возникают также смежные вопросы
2) какова структура консольного приложения, как CRT соотносится с RTL от С++?




PM MAIL   Вверх
_GRIN_
Дата 8.7.2009, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



FCM, прикольный вопрос в теме для новичков и название такое, простенькое smile))


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
GoldFinch
Дата 8.7.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 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, как и любой другой эксепшен
PM MAIL ICQ   Вверх
DrHex
Дата 9.7.2009, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



syser, soft-ice, linece....
Это вопросы не совсем к программированю на С++
--------------------
google.com и это все.
PM MAIL   Вверх
FCM
Дата 9.7.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



GoldFinch,
авост- аварийная остановка.

Ну вот произошла ошибка  и предположим FPU ее не обработал, т.е. аппаратно она не обработана. Кто потом первый возмущается: OC Windows (которая по идее является посредником между "аппаратом" и приложениями), RTL от компилятора или пользовательские ловушки? 
Другими словами, кто это первым фиксирует и кто кого потом дергает за "ниточки"?
Та же аварийная остановка от кого, от ОС или от RTL?

Тот же (платформо-зависимый) SEH наверное тоже ближе к ОС, чем обычные С++ исключения?
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



FCM, тогда уж "аварийный останов". собственно останова не происходит, происходит прерывание, его ловит ядро вынды, передает эксепшн в юзермодную часть винды, которая передает его приложению (CRT) если то поставило обработчик, а обработчик CRT передает его catch()

SEH - это механизм винды. 
вообще, о любых аппаратных эксепшенах прога может узнать только через ОС

Это сообщение отредактировал(а) GoldFinch - 9.7.2009, 08:22
PM MAIL ICQ   Вверх
FCM
Дата 9.7.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Т.е. получается, что OC в случае прерывания обращается к RTL( или CRT)  которая в свою очередь обращается к пользовательским ловушкам. А если пользовательские ловушки срабатывают, то RTL и ОС ничего не предпринимают ?  Если же пользователем ничего не предусмотрено, то RTL использует свои средства, а при их остутствии получаем авост приложения средствами ОС Windows?



Это сообщение отредактировал(а) FCM - 9.7.2009, 15:27
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



FCM, если пользовательский код вернул что эксепшен обработан, эксепшен дальше не передается, управление возвращается в ловушку CRT которая тоже возвращает системе что эксепшен обработан, затем управление передается в юзермодную часть ОС, которая сообщает ядру что эксепшен обработан, и выполнение потока сгенерировавшего эксепшен продолжается 
PM MAIL ICQ   Вверх
FCM
Дата 9.7.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Понятно.
Но когда на этапе выполнения MVC++ приложения выполнение прекращается и вылезает окошко  о чем-то недопустимом (в некоторых случаях с диагностикой/трассировкой) и предложение применить отладчик (MVC++) - это от кого, от RTL или Windows?
PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



от винды
RTL большинство ошибок не обрабатывает, и передает их необработанными винде
например если РТЛ определит переполнение буфера, оно эту ошибку "обработает" - выведет сообщение и убъет прогу
а если РТЛ получит int3, оно передаст его винде, винда тоже ничего не сделает и убьет приложение с ошибкой
если в винде есть JIT отладчик, она предложит подебажить

Это сообщение отредактировал(а) GoldFinch - 9.7.2009, 16:17
PM MAIL ICQ   Вверх
FCM
Дата 9.7.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Приложения ведут себя по разному относительно ошибок в Debug- и Release-сборках. В Debug- больше контроля и реакция подробнее.
Если посмотреть в свойствах проекта,  то можно найти опции, которые по умолчанию настроены по-разному в Debug- и Release-сборках. А как это работает? Т.е. что реально означает изменение соотв опций - значит ли это, что  включаются/выключаются некие ловушки RTL или это происходит где-то в другом месте?

PM MAIL   Вверх
GoldFinch
Дата 9.7.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



это значит что включается доп код, который бросает программные эксепшены, при переполнении буфера например,
 если они не доходят до системы, система о них не узнает
PM MAIL ICQ   Вверх
FCM
Дата 10.7.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



GoldFinch, cпасибо! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.