Russian Qt Forum
Май 06, 2024, 04:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Прелести исключений  (Прочитано 13651 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #15 : Март 30, 2015, 17:05 »

gdb: catch throw
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #16 : Март 30, 2015, 17:19 »

Конечно это было бы прекрасно, но откуда ж взять те лог и (особенно) трассу? Если б отладчик показал стек вызовов - так нету!  Плачущий

ну почему у них есть, а у вас нету?
потому что они сделали для себя удобный инструмент,
а вы не сделали.

идешки кстати (ну по крайней мере вижал студия 2013 точно) умеют пасти стек вызовов:
точки, где вылетают эксепшены.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Март 30, 2015, 17:32 »

ну почему у них есть, а у вас нету?
потому что они сделали для себя удобный инструмент,
а вы не сделали.
Не понял кто "они" и что сделали  Непонимающий

идешки кстати (ну по крайней мере вижал студия 2013 точно) умеют пасти стек вызовов:
точки, где вылетают эксепшены.
Моя практика (правда на MSVC 2012 ) этого не подтверждает. Может удастся приспособить "Sudden Terminate", есть такой тул. Заметим что если надо "изыскивать средства/утилиты" - то тем самым признается по меньшей мере "существование проблемы".

gdb: catch throw
Что "catch throw" - это нужно где-то набирать?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #18 : Март 30, 2015, 17:56 »

Что "catch throw" - это нужно где-то набирать?


Да, набирать:
https://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Ну или в Среаторе в окошке "Команды при подключении"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Март 31, 2015, 19:41 »

Ладно, попробуем тулзами. Вернул сбойную ситуацию, запустил "Sudden Terminate". Получил стек (первый аттач), привожу "содержательную часть" - трассу после вызова std::runtime_error. Я могу посмотреть код каждого вызова (второй и третий аттач). Хмм... ну и как это осмыслить? Не вижу откуда пришли на третий скриншот

То що це воно дало?  Улыбающийся
« Последнее редактирование: Март 31, 2015, 19:43 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 01, 2015, 09:27 »

Да, набирать:
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 Offline

Сообщений: 3258


Просмотр профиля
« Ответ #21 : Апрель 01, 2015, 11:53 »

Да, набирать:
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
Гость
« Ответ #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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Апрель 03, 2015, 09:29 »

Что это за код? Смысл использования исключений т.о?

Если MyClass выбросит исключение, то data.ref не изменится, а память освободится (разумеется, в любых деструкторах исключения не допустимы). Посмотрите в какие ассемблерные инструкции ассемблируется new MyClass(id, type). Неотлов исключений связан с несовместимостью ABI, runtime.

Отладка исключений: MSVC IDE с давних времен, например, выдает что-то типа first chance exception, т.е. отладчик может остановиться сразу, еще до первого обработчика.
Не думаю что все так уж ясно. То что указатель data.ref может быть установлен еще до окончания конструктора - это жевалось много раз на форумах, и я видел даже опцию компилятора что этому посвящена.

Смотреть код new MyClass - ну а что мы там хотим увидеть? Найти выброс исключения можно и средствами MSVC и руками, напр поставив DebugStr перед исключением в конструкторе. Так что с того? Это не объясняет почему не ловится.

Давно заместил что "несовместимость ABI" - это просто то что "тыкается в нос" Улыбающийся Почему сотни других (таких же) исключений ловятся как положено, а это нет? В первом же посте я писал про попытку воспроизвести ситуацию со своим классом. Что, ABI уже стало совместимо?  Улыбающийся

В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более
Записан
Akon
Гость
« Ответ #24 : Апрель 03, 2015, 11:57 »

Ну так вы и смотрите в корень (читай в ассеблерный код), а разные форумы и т.п. жуйте в 3-ю очередь. Там же все будет как на ладони - установится data.ref или нет, освободится память или нет, как выглядит try/catch фрейм. Поверьте, более ясного источника нет. Вот если вы видите, что что-то не так, тогда ищите контролирующие опции компилятора.

Про ABI: возможно, ваш класс в свою очередь создает другие классы, которые в свою очередь скомпилированы с другими опциями или вовсе другим компилятором (например, это сторонняя библиотека), в результате чего нарушается ABI, попросту выброшенное исключение из библиотечного класса не ловится catch фреймом в вашем коде.

Цитировать
В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более
Нет проблем. Вы хотите, чтобы я не давал вам более подобного рода ответы?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #25 : Апрель 03, 2015, 12:05 »

Не думаю что все так уж ясно. То что указатель data.ref может быть установлен еще до окончания конструктора - это жевалось много раз на форумах, и я видел даже опцию компилятора что этому посвящена.

Смотреть код new MyClass - ну а что мы там хотим увидеть? Найти выброс исключения можно и средствами MSVC и руками, напр поставив DebugStr перед исключением в конструкторе. Так что с того? Это не объясняет почему не ловится.

Давно заместил что "несовместимость ABI" - это просто то что "тыкается в нос" Улыбающийся Почему сотни других (таких же) исключений ловятся как положено, а это нет? В первом же посте я писал про попытку воспроизвести ситуацию со своим классом. Что, ABI уже стало совместимо?  Улыбающийся

В общем меня разочаровал Ваш ответ - типичный выброс заученных знаний, и ничего более

Определитесь для начала с платформой. У вас мак? Вы уверены, что исключение вообще вылетает, а не, скажем, приходит сигнал? Вы пробовали lldb? (у меня на маке гдб нету вообще, так что я не могу проверить есть там catch throw или нет)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Апрель 03, 2015, 12:41 »

Ну так вы и смотрите в корень (читай в ассеблерный код),
Об этом я тоже сказал в первом посте. До выброса исключения - все норм, вот правда почему-то отладчик не останавливается на std::runtime_error. Ну не беда, я могу поставить DebugStr перед ней и остановиться. Дальше надо идти внутрь исключения в asm - ну там не прорваться. Какие еще варианты?

Смотреть класс/ABI, ну класс унаследован от QImage, "свои" только простые POD члены. Первое что сделал - "списал" его дав новое имя (выкинул все кроме конструктора) - с таким все ловится. Здесь тоже "дубль-пусто"

Нет проблем. Вы хотите, чтобы я не давал вам более подобного рода ответы?
Вовсе нет, просто от Вас я ожидал большего

Определитесь для начала с платформой. У вас мак? Вы уверены, что исключение вообще вылетает, а не, скажем, приходит сигнал? Вы пробовали lldb? (у меня на маке гдб нету вообще, так что я не могу проверить есть там catch throw или нет)
Так на lldb этой фишки (catch throw) просто нету. А gdb 2013 года - не новье, но и не такой уж старый.

Баг (сам по себе) давно найден и устранен, но 2 дня коту под хвост. И это не первый такой случай. Вот и хочу на этом примере поизучать чтобы в след раз не сидеть днями.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #27 : Апрель 03, 2015, 12:54 »

Так на lldb этой фишки (catch throw) просто нету. А gdb 2013 года - не новье, но и не такой уж старый.

Баг (сам по себе) давно найден и устранен, но 2 дня коту под хвост. И это не первый такой случай. Вот и хочу на этом примере поизучать чтобы в след раз не сидеть днями.

И верно, нету - http://stackoverflow.com/questions/8122375/lldb-breakpoint-on-exceptions-equivalent-of-gdbs-catch-throw
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Апрель 03, 2015, 17:17 »

Попробовал с lldb (break set -E c++), да, работает. Но это всего лишь останов на точке испускания исключения. Полезная команда, но не помогает найти почему не пришло в catch
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.