| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Обработка ошибок в консоль-приложении |
| Автор: FCM 6.7.2009, 15:35 |
| Каков механизм действий, имеющих место при возникновении ошибок? 1) Например, ошибка деления на вещ. ноль как правило по умолчанию обрабатывается FPU. Если например отключить это с помощью контрольного слова, то далее получаем авост (при условии, что не заданы другие средства перехвата ошибки). Возникает вопрос о порядке обработки подобной ситуации, т.е. в каком порядке действуют различные средства обработки (пользовательские в стиле C, пользовательские в стиле обработки исключений в С++, от RTL, от Windows) после того как FPU "умыл руки". Возникают также смежные вопросы 2) какова структура консольного приложения, как CRT соотносится с RTL от С++? |
| Автор: _GRIN_ 8.7.2009, 21:57 |
| FCM, прикольный вопрос в теме для новичков и название такое, простенькое |
| Автор: 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пасибо! |