Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Обработка ошибок в консоль-приложении


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




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

Автор: GoldFinch 8.7.2009, 22:22
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 9.7.2009, 01:38
syser, soft-ice, linece....
Это вопросы не совсем к программированю на С++

Автор: FCM 9.7.2009, 08:16
GoldFinch,
авост- аварийная остановка.

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

Тот же (платформо-зависимый) SEH наверное тоже ближе к ОС, чем обычные С++ исключения?

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

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

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


Автор: GoldFinch 9.7.2009, 15:30
FCM, если пользовательский код вернул что эксепшен обработан, эксепшен дальше не передается, управление возвращается в ловушку CRT которая тоже возвращает системе что эксепшен обработан, затем управление передается в юзермодную часть ОС, которая сообщает ядру что эксепшен обработан, и выполнение потока сгенерировавшего эксепшен продолжается 

Автор: FCM 9.7.2009, 15:40
Понятно.
Но когда на этапе выполнения MVC++ приложения выполнение прекращается и вылезает окошко  о чем-то недопустимом (в некоторых случаях с диагностикой/трассировкой) и предложение применить отладчик (MVC++) - это от кого, от RTL или Windows?

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

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

Автор: GoldFinch 9.7.2009, 21:11
это значит что включается доп код, который бросает программные эксепшены, при переполнении буфера например,
 если они не доходят до системы, система о них не узнает

Автор: FCM 10.7.2009, 16:03
GoldFinch, cпасибо! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)