РЕШЕНО: Странная ошибка

Модератор: Модераторы разделов

Ответить
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

РЕШЕНО: Странная ошибка

Сообщение devilr »

Доброго времени суток!
Есть несколько проектов на Qt, вроде как рабочих, но иногда ведущих себя странно.
Если запускать отладочную версию проекта, то всё хорошо.
А вот если релизную, то программа падает и в консоль сыпется

Код: Выделить всё

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Если сразу после такого, не меняя ничего, переключить сборку на debug, собрать и запустить - всё работает. После тут же переключаешься на release, пересобираешь, запускаешь - падает.
Как вообще такое можно отловить?
Последний раз редактировалось devilr 31.07.2020 14:48, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Странная ошибка

Сообщение Bizdelnick »

Что значит "debug" или "release" сборка? На уровне флагов компилятора. Попробуйте подобрать такие флаги, с которыми ошибка будет воспроизводиться, но отладка останется возможной. Например, если debug — это -g -Og, а release — это -O2, попробуйте -g -O2.
Добавлено (01:02):
Ещё попробуйте дебажную сборку с ubsan (-fsanitize=undefined). Он может отловить ошибку и без падения.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Странная ошибка

Сообщение devilr »

Подобрать. Проблема в том, что вариантов довольно много, а поможет или нет - неизвестно.
В интернете, народ такие вещи, похоже, "глазами ищет". Видимо, проекты крохотные.
Должно быть правильное решение такого...
Добавлено (01:11):
Bizdelnick писал:
31.07.2020 00:57
Ещё попробуйте дебажную сборку с ubsan (-fsanitize=undefined). Он может отловить ошибку и без падения.
Так дебажная сборка и не падает. Если бы падала, я бы по шагам прошёл её.
P.S. А "-fsanitize" флаг чего?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Странная ошибка

Сообщение Bizdelnick »

devilr писал(а):
31.07.2020 01:08
Подобрать. Проблема в том, что вариантов довольно много
Где много-то? Покажите командную строку. В принципе, можно попробовать просто добавить флаг -g к релизным. Если собирается cmake'ом, то в нём даже есть вариант сборки RelWithDebInfo, попробуйте его.
devilr писал(а):
31.07.2020 01:08
Так дебажная сборка и не падает. Если бы падала, я бы по шагам прошёл её.
Я и говорю:
Bizdelnick писал:
31.07.2020 00:57
Он может отловить ошибку и без падения.
Упасть не упадёт, а об ошибке сообщит. Если она из-за UB, конечно, а очень похоже на это.
devilr писал(а):
31.07.2020 01:08
А "-fsanitize" флаг чего?
g++ (или clang++, что там у Вас, не знаю).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Странная ошибка

Сообщение devilr »

UB - это что?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Странная ошибка

Сообщение Bizdelnick »

devilr писал(а):
31.07.2020 01:29
UB - это что?
undefined behavior
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Странная ошибка

Сообщение devilr »

"Неопределенное поведение" обычно варнингом проявляется. Хотя, может и оно...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Странная ошибка

Сообщение devilr »

Разобрался. Я раньше почему то думал, что конструкция вида

Код: Выделить всё

Q_CHECK_PTR(pointer);
отрабатывает только в debug-mode. Оказалось, что нет. Именно эта конструкция и выбрасывала bad_alloc, хотя указатель, на момент обращения к нему, должен был существовать и быть не nullptr. По крайней мере в debug-mode он программу не останавливал. А в release "на тебе".
В общем, как говорит один телеведущий: "трагическое стечение случайных обстоятельств" :)
Блин, три дня за просто так. :(
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: РЕШЕНО: Странная ошибка

Сообщение s.xbatob »

Есть нехорошее подозрение, что убрав проверку вы проблему не решили, а "загнали под ковёр"
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: РЕШЕНО: Странная ошибка

Сообщение devilr »

s.xbatob писал:
31.07.2020 19:57
Есть нехорошее подозрение, что убрав проверку вы проблему не решили, а "загнали под ковёр"
А кто сказал, что я её "убрал"? Проверку на nullptr можно ведь и простым IF делать.
Просто изменил код. Ну и запомнил для себе поведение Q_CHECK_PTR в release сборке.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Ответить