Название: И еще про обработку исключений Отправлено: Sanya от Июнь 24, 2010, 11:03 Доброго времени суток!
Не могу понять как реализовать обработку исключений в Qt под Windows XP. Делаю пример: Код
Приложение тупо вылетает на этом месте. Винда пишет "Возникли ошибки ... и хочет послать отчет" .... КАК нормально отлавливать такие глюки? Название: Re: И еще про обработку исключений Отправлено: crackedmind от Июнь 24, 2010, 11:27 А с каких пор функция show () стала кидать исключения?
Название: Re: И еще про обработку исключений Отправлено: Barmaglodd от Июнь 24, 2010, 11:29 Код
Это так и задумано? Название: Re: И еще про обработку исключений Отправлено: lit-uriy от Июнь 24, 2010, 11:37 >>Это так и задумано?
это видимо для теста и сделано, т.е. далее обращение к несуществующему объекту. И, как я понял, исключение в коде не ловится Название: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 24, 2010, 11:38 Segmentation Fault не ловится через try {} catch(){}.
Это избитая тема. Я тоже с ней разбирался, можешь почитать: http://www.visualdata.ru/blog/109-segv-signal.html Название: Re: И еще про обработку исключений Отправлено: Sanya от Июнь 24, 2010, 11:40 Да, так и задумано.
Это упрощенная ситуация следующего глюка: Программа уже достаточно сильно разрослась и нет, нет да вылезает глюк обращения к несуществующему объекту. Дабы user не впадала в "kernel panic" хочется выкинуть какое-то сообщение да и написать там для меня где именно. Организовать отлов таких моих упущений я вижу только через try-catch. P.S.: Пока писал появились понимающие меня люди, очень рад и благодарен. Название: Re: И еще про обработку исключений Отправлено: Igors от Июнь 24, 2010, 11:44 По умолчанию ловится только то что испускается throw (C++ exception). Можно заставить ловить и др. исключения, почитать напр. здесь http://msdn2.microsoft.com/en-us/library/1deeycx5.aspx (http://msdn2.microsoft.com/en-us/library/1deeycx5.aspx)
Но в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем. Так что это не метод Название: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 24, 2010, 11:53 Старайся избегать delete, используй умные указатели, при удалении всегда зануляй... Что еще посоветовать? Присоединяюсь к предыдущему посту, что на 100% никакой отлов sigsegv не страхует от непредсказуемого поведения программы.
Под линупсом для чистки кода мне помогает valgrind, полезно периодически проверяться на вшивость. Название: Re: И еще про обработку исключений Отправлено: Гурман от Июнь 24, 2010, 11:55 Цитировать в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем после удаления объекта занятая им память возвращена в system pool, и уже не принадлежит приложению, выделенный ранее сегмент удален из соответствующей таблицы, поэтому любое обращение к удаленному объекту - это обращение к объекту вне приложения, следовательно segfault а вот занулять при удалении необходимо, хотя бы чтобы потом где-нибудь не сделать проверку на 0, и долго удивляться... а работу exception достаточно проверять (int*)0 = 0; ;D Название: Re: И еще про обработку исключений Отправлено: Igors от Июнь 24, 2010, 12:10 после удаления объекта занятая им память возвращена в system pool, и уже не принадлежит приложению, выделенный ранее сегмент удален из соответствующей таблицы, поэтому любое обращение к удаленному объекту - это обращение к объекту вне приложения, следовательно segfault Если бы это было так - жить было бы намного проще :) Увы, после удаления память может оставаться валидной (и не только на Вындоуз). Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти. Поэтому "успешная" запись в удаленный блок (с результатом битая куча/heap) - явление рядовоеНазвание: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 24, 2010, 12:16 +1
Название: Re: И еще про обработку исключений Отправлено: Sanya от Июнь 24, 2010, 12:17 Полностью с вами согласен про "не дело лезть в пустоту" и занулять указатели(и так и делаю), но мое приложение лишь клиент, и вот когда на сервере меняется логика без моего ведома иногда начинаются залезания в пустоту.
Спасибо за советы, буду разбираться как их прикрутить у меня. Название: Re: И еще про обработку исключений Отправлено: Гурман от Июнь 24, 2010, 12:35 Цитировать Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти. прально, только выделяемые приложению блоки находятся в таблице страниц приложения, и к нему относятся, а возвращенные системе - в таблице страниц системы... и GPF генерится соответственно этим таблицам на x86 во всяком случае так, на ARM вроде бы тоже (не встречал хорошего описания его управления памятью) во всяком случае, за все время, сколько я сознательно за деньги много программирую, обращение к возвращенному блоку не давало слета только в одной ОС - в MS-DOS ;D Название: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 24, 2010, 12:48 Гурман, да ты везунчик ;)
Хоть они и страницы приложения, но все равно размер у них 4 Kb, и в одну страницу умещается несколько десятков объектов, один из них удаляется, но страница то остается... Название: Re: И еще про обработку исключений Отправлено: Гурман от Июнь 24, 2010, 12:58 кхм... а я почти никогда не захватываю такими мелкими кусками ;) - у меня стратегия такая, оптимизация расхода, стараюсь, если захватывать, то кусками не менее 256К
так что, дело не везении ;) Название: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 24, 2010, 13:23 Не используешь Qt? Не используешь классы в динамической памяти? Консольный C ? :o
Название: Re: И еще про обработку исключений Отправлено: Гурман от Июнь 24, 2010, 13:52 я про свои объекты говорил, которые Qt мало где наследуют... :)
классы нельзя "использовать в динамической памяти" - в ней можно создавать экземпляры объектов ;) а с Qt в огромном числе случаев можно обходиться стеком, и delete писать не надо ;) Название: Re: И еще про обработку исключений Отправлено: navrocky от Июнь 25, 2010, 10:12 Практически все кутэшные классы используют приватную имплементацию, память под которую выделяется динамически.
Цитировать классы нельзя "использовать в динамической памяти" - в ней можно создавать экземпляры объектов Я это и имел ввиду ;D Название: Re: И еще про обработку исключений Отправлено: SASA от Июнь 25, 2010, 10:33 Программа уже достаточно сильно разрослась и нет, нет да вылезает глюк обращения к несуществующему объекту. Можно использовать QPоinter. Перед использованием проверяешь на ноль. Описанную проблему решает. |