Russian Qt Forum
Ноябрь 22, 2024, 23:07
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Прелести исключений
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Прелести исключений (Прочитано 14320 раз)
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Прелести исключений
«
Ответ #15 :
Март 30, 2015, 17:05 »
gdb: catch throw
Записан
_Bers
Бывалый
Offline
Сообщений: 486
Re: Прелести исключений
«
Ответ #16 :
Март 30, 2015, 17:19 »
Цитата: Igors от Март 30, 2015, 16:00
Конечно это было бы прекрасно, но откуда ж взять те лог и (особенно) трассу? Если б отладчик показал стек вызовов - так нету!
ну почему у них есть, а у вас нету?
потому что они сделали для себя удобный инструмент,
а вы не сделали.
идешки кстати (ну по крайней мере вижал студия 2013 точно) умеют пасти стек вызовов:
точки, где вылетают эксепшены.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #17 :
Март 30, 2015, 17:32 »
Цитата: _Bers от Март 30, 2015, 17:19
ну почему у них есть, а у вас нету?
потому что они сделали для себя удобный инструмент,
а вы не сделали.
Не понял кто "они" и что сделали
Цитата: _Bers от Март 30, 2015, 17:19
идешки кстати (ну по крайней мере вижал студия 2013 точно) умеют пасти стек вызовов:
точки, где вылетают эксепшены.
Моя практика (правда на MSVC 2012 ) этого не подтверждает. Может удастся приспособить "Sudden Terminate", есть такой тул. Заметим что если надо "изыскивать средства/утилиты" - то тем самым признается по меньшей мере "существование проблемы".
Цитата: Авварон от Март 30, 2015, 17:05
gdb: catch throw
Что "catch throw" - это нужно где-то набирать?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Прелести исключений
«
Ответ #18 :
Март 30, 2015, 17:56 »
Цитата: Igors от Март 30, 2015, 17:32
Что "catch throw" - это нужно где-то набирать?
Да, набирать:
https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Ну или в Среаторе в окошке "Команды при подключении"
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #19 :
Март 31, 2015, 19:41 »
Ладно, попробуем тулзами. Вернул сбойную ситуацию, запустил "Sudden Terminate". Получил стек (первый аттач), привожу "содержательную часть" - трассу после вызова std::runtime_error. Я могу посмотреть код каждого вызова (второй и третий аттач). Хмм... ну и как это осмыслить? Не вижу откуда пришли на третий скриншот
То що це воно дало?
«
Последнее редактирование: Март 31, 2015, 19:43 от Igors
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #20 :
Апрель 01, 2015, 09:27 »
Цитата: Авварон от Март 30, 2015, 17:56
Да, набирать:
https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Ну или в Среаторе в окошке "Команды при подключении"
Любовь с командной строкой в очередной раз не сложилась
Цитировать
(gdb) catch throw
Catchpoint 5 (throw)
A syntax error in expression, near `throw'.(gdb) catch throw
(gdb) c
Continuing.
И дальше тот же вылет без всяких остановов. Где же я мог ошибиться набирая catch throw? Можно дать доп опцию (тип исключения) - но мне это не нужно. Какой "syntax error"? В общем, стандартный рез-т когда я начинаю чего-то "набирать"
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Прелести исключений
«
Ответ #21 :
Апрель 01, 2015, 11:53 »
Цитата: Igors от Апрель 01, 2015, 09:27
Цитата: Авварон от Март 30, 2015, 17:56
Да, набирать:
https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Ну или в Среаторе в окошке "Команды при подключении"
Любовь с командной строкой в очередной раз не сложилась
Цитировать
(gdb) catch throw
Catchpoint 5 (throw)
A syntax error in expression, near `throw'.(gdb) catch throw
(gdb) c
Continuing.
И дальше тот же вылет без всяких остановов. Где же я мог ошибиться набирая catch throw? Можно дать доп опцию (тип исключения) - но мне это не нужно. Какой "syntax error"? В общем, стандартный рез-т когда я начинаю чего-то "набирать"
lldb попробуйте, gcc на маке древний как г. мамонта
Записан
Akon
Гость
Re: Прелести исключений
«
Ответ #22 :
Апрель 02, 2015, 23:02 »
Код:
try {
data.ref = new MyClass(id, type);
}
catch (...) {
delete data.ref;
data.ref = 0;
}
Что это за код? Смысл использования исключений т.о?
Если MyClass выбросит исключение, то data.ref не изменится, а память освободится (разумеется, в любых деструкторах исключения не допустимы). Посмотрите в какие ассемблерные инструкции ассемблируется new MyClass(id, type). Неотлов исключений связан с несовместимостью ABI, runtime.
Отладка исключений: MSVC IDE с давних времен, например, выдает что-то типа first chance exception, т.е. отладчик может остановиться сразу, еще до первого обработчика.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #23 :
Апрель 03, 2015, 09:29 »
Цитата: Akon от Апрель 02, 2015, 23:02
Что это за код? Смысл использования исключений т.о?
Если MyClass выбросит исключение, то data.ref не изменится, а память освободится (разумеется, в любых деструкторах исключения не допустимы). Посмотрите в какие ассемблерные инструкции ассемблируется new MyClass(id, type). Неотлов исключений связан с несовместимостью ABI, runtime.
Отладка исключений: MSVC IDE с давних времен, например, выдает что-то типа first chance exception, т.е. отладчик может остановиться сразу, еще до первого обработчика.
Не думаю что все так уж ясно. То что указатель data.ref может быть установлен еще до окончания конструктора - это жевалось много раз на форумах, и я видел даже опцию компилятора что этому посвящена.
Смотреть код new MyClass - ну а что мы там хотим увидеть? Найти выброс исключения можно и средствами MSVC и руками, напр поставив DebugStr перед исключением в конструкторе. Так что с того? Это не объясняет почему не ловится.
Давно заместил что "несовместимость ABI" - это просто то что "тыкается в нос"
Почему сотни других (таких же) исключений ловятся как положено, а это нет? В первом же посте я писал про попытку воспроизвести ситуацию со своим классом. Что, ABI уже стало совместимо?
В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более
Записан
Akon
Гость
Re: Прелести исключений
«
Ответ #24 :
Апрель 03, 2015, 11:57 »
Ну так вы и смотрите в корень (читай в ассеблерный код), а разные форумы и т.п. жуйте в 3-ю очередь. Там же все будет как на ладони - установится data.ref или нет, освободится память или нет, как выглядит try/catch фрейм. Поверьте, более ясного источника нет. Вот если вы видите, что что-то не так, тогда ищите контролирующие опции компилятора.
Про ABI: возможно, ваш класс в свою очередь создает другие классы, которые в свою очередь скомпилированы с другими опциями или вовсе другим компилятором (например, это сторонняя библиотека), в результате чего нарушается ABI, попросту выброшенное исключение из библиотечного класса не ловится catch фреймом в вашем коде.
Цитировать
В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более
Нет проблем. Вы хотите, чтобы я не давал вам более подобного рода ответы?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Прелести исключений
«
Ответ #25 :
Апрель 03, 2015, 12:05 »
Цитата: Igors от Апрель 03, 2015, 09:29
Не думаю что все так уж ясно. То что указатель data.ref может быть установлен еще до окончания конструктора - это жевалось много раз на форумах, и я видел даже опцию компилятора что этому посвящена.
Смотреть код new MyClass - ну а что мы там хотим увидеть? Найти выброс исключения можно и средствами MSVC и руками, напр поставив DebugStr перед исключением в конструкторе. Так что с того? Это не объясняет почему не ловится.
Давно заместил что "несовместимость ABI" - это просто то что "тыкается в нос"
Почему сотни других (таких же) исключений ловятся как положено, а это нет? В первом же посте я писал про попытку воспроизвести ситуацию со своим классом. Что, ABI уже стало совместимо?
В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более
Определитесь для начала с платформой. У вас мак? Вы уверены, что исключение вообще вылетает, а не, скажем, приходит сигнал? Вы пробовали lldb? (у меня на маке гдб нету вообще, так что я не могу проверить есть там catch throw или нет)
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #26 :
Апрель 03, 2015, 12:41 »
Цитата: Akon от Апрель 03, 2015, 11:57
Ну так вы и смотрите в корень (читай в ассеблерный код),
Об этом я тоже сказал в первом посте. До выброса исключения - все норм, вот правда почему-то отладчик не останавливается на std::runtime_error. Ну не беда, я могу поставить DebugStr перед ней и остановиться. Дальше надо идти внутрь исключения в asm - ну там не прорваться. Какие еще варианты?
Смотреть класс/ABI, ну класс унаследован от QImage, "свои" только простые POD члены. Первое что сделал - "списал" его дав новое имя (выкинул все кроме конструктора) - с таким все ловится. Здесь тоже "дубль-пусто"
Цитата: Akon от Апрель 03, 2015, 11:57
Нет проблем. Вы хотите, чтобы я не давал вам более подобного рода ответы?
Вовсе нет, просто от Вас я ожидал большего
Цитата: Авварон от Апрель 03, 2015, 12:05
Определитесь для начала с платформой. У вас мак? Вы уверены, что исключение вообще вылетает, а не, скажем, приходит сигнал? Вы пробовали lldb? (у меня на маке гдб нету вообще, так что я не могу проверить есть там catch throw или нет)
Так на lldb этой фишки (catch throw) просто нету. А gdb 2013 года - не новье, но и не такой уж старый.
Баг (сам по себе) давно найден и устранен, но 2 дня коту под хвост. И это не первый такой случай. Вот и хочу на этом примере поизучать чтобы в след раз не сидеть днями.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Прелести исключений
«
Ответ #27 :
Апрель 03, 2015, 12:54 »
Цитата: Igors от Апрель 03, 2015, 12:41
Так на lldb этой фишки (catch throw) просто нету. А gdb 2013 года - не новье, но и не такой уж старый.
Баг (сам по себе) давно найден и устранен, но 2 дня коту под хвост. И это не первый такой случай. Вот и хочу на этом примере поизучать чтобы в след раз не сидеть днями.
И верно, нету -
http://stackoverflow.com/questions/8122375/lldb-breakpoint-on-exceptions-equivalent-of-gdbs-catch-throw
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прелести исключений
«
Ответ #28 :
Апрель 03, 2015, 17:17 »
Попробовал с lldb (break set -E c++), да, работает. Но это всего лишь останов на точке испускания исключения. Полезная команда, но не помогает найти почему не пришло в catch
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...