Russian Qt Forum

Qt => Общие вопросы => Тема начата: vulko от Ноябрь 12, 2014, 14:32



Название: free(): invalid next size (fast)
Отправлено: vulko от Ноябрь 12, 2014, 14:32
Ребята, столкнулся с таким вот крэшем.
То ли double free, то ли free/new, то ли delete/malloc...

Но все это происходит насколько я понимаю после ресайза виджета. Собсно ресайзы програмные происходят, причем могут очень часто.
Хотя возможно и не в этом причина...

Что это, баг Qt? Куда копать? Дебажить внутри Qt?
Я верно понимаю мне нужно будет пересобрать Qt в дебажную версию?
Умеет ли QtCreator дебажить внутри .so?

Qt предустановлен в пакетах уже, можно ли без пересборки? Может подтянуть пакет откуда? Или побилдить дебажные либы и подменить ими обычные?

Qt 4.8.5
Linux (X Windows) дебианоподобное.

Цитировать
0   __GI_raise   raise.c   64   0x7ffff519dbf5   
1   __GI_abort   abort.c   92   0x7ffff51a0d98   
2   __libc_message   libc_fatal.c   189   0x7ffff51d7d15   
3   malloc_printerr   malloc.c   6283   0x7ffff51e1dc6   
4   __GI___libc_free   malloc.c   3738   0x7ffff51e5d7c   
5   QBoxLayout::setGeometry(QRect const&)   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6b174fb   
6   QLayoutPrivate::doResize(QSize const&)   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6b31c73   
7   QLayout::activate()   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6b331bd   
8   QApplicationPrivate::notify_helper(QObject*, QEvent*)   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6b0916e   
9   QApplication::notify(QObject*, QEvent*)   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6b0d62a   
10   QCoreApplication::notifyInternal(QObject*, QEvent*)   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff62906be   
11   QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*)   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff62947a1   
12   ??   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff62bee03   
13   g_main_context_dispatch   /lib/x86_64-linux-gnu/libglib-2.0.so.0   0   0x7ffff3a49355   
14   ??   /lib/x86_64-linux-gnu/libglib-2.0.so.0   0   0x7ffff3a49688   
15   g_main_context_iteration   /lib/x86_64-linux-gnu/libglib-2.0.so.0   0   0x7ffff3a49744   
16   QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff62bef96   
17   ??   /usr/lib/x86_64-linux-gnu/libQtGui.so.4   0   0x7ffff6baf0de   
18   QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff628f40f   
19   QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff628f698   
20   QCoreApplication::exec()   /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff6294ab8   
21   main   main.cpp   23   0x417ecd   


Название: Re: free(): invalid next size (fast)
Отправлено: Alex Custov от Ноябрь 12, 2014, 15:05
В 99.9% случаев это твоя ошибка при работе с указателями - двойное удаление, разыменование нулевого указателя и т.п. Ищи ошибку у себя в коде. Можно с помощью valgrind, но лучше руками.

Debug символы можно получить установив пакет qtbase5-dbg


Название: Re: free(): invalid next size (fast)
Отправлено: vulko от Ноябрь 12, 2014, 15:20
В 99.9% случаев это твоя ошибка при работе с указателями - двойное удаление, разыменование нулевого указателя и т.п. Ищи ошибку у себя в коде. Можно с помощью valgrind, но лучше руками.

Debug символы можно получить установив пакет qtbase5-dbg

Ты стэк смотрел? Там ниодного моего вызова нет)
Хотя не отрицаю, что мой код мог спровоцировать подобное поведение...
Либо creator как обычно криво дебажит... но уж стэк то не должен был перепутать.

valgrind я бы и рад, но с ним нереально будет воспроизвести ошибку вообще никак. я вижу дикое слайдшоу под валгриндом.
впрочем можно попробовать перерисовку делать не раз в 10мс а раз в 1секунду... надо попробовать. но это уже не то.
да и он мне очень много ошибок выдает, но 99% внутри qt, llvm и другой шляпы...

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


Название: Re: free(): invalid next size (fast)
Отправлено: Alex Custov от Ноябрь 12, 2014, 15:32
Ты стэк смотрел? Там ниодного моего вызова нет)

Это ни о чём не говорит. В случае когда бьётся память (двойное удаление указателя), падение может произойти уже после него в совершенно нормальном месте.

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

Из репозиториев твоего дистрибутива. Ставить откуда-то ещё крайне не рекомендуется.


Название: Re: free(): invalid next size (fast)
Отправлено: vulko от Ноябрь 12, 2014, 15:44
Ты стэк смотрел? Там ниодного моего вызова нет)

Это ни о чём не говорит. В случае когда бьётся память (двойное удаление указателя), падение может произойти уже после него в совершенно нормальном месте.

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

Из репозиториев твоего дистрибутива. Ставить откуда-то ещё крайне не рекомендуется.

В принципе да, ниочем не говорит, если бы не одно но...
Приложение у меня логирует свою работу. Соотв. логи позволяют повторять одни и те же действия записанные в файл.
Так вот при воспроизведении этих логов много раз подряд случается крэш.
Т.е. крэш рандомный. А действия эти даже не что-то типа автоматизированного тестирования, а куда более идентичные, в плане работы приложения.

И вот во время воспроизведения лога в эн-ный раз отваливается.
есть у меня модель, где лежать актуальные данные, которые берутся из логов. каждый раз перед новым воспроизведением они очищаются.

если бы это была проблема double free или free памяти выделенной new или delete памяти выделенной malloc'ом, то крэш не был бы рандомным наверное?
впрочем это я проверю все же...


Название: Re: free(): invalid next size (fast)
Отправлено: Alex Custov от Ноябрь 12, 2014, 20:30
если бы это была проблема double free или free памяти выделенной new или delete памяти выделенной malloc'ом, то крэш не был бы рандомным наверное?

Поведение в такой ситуации не определено, и поэтому может быть любым.


Название: Re: free(): invalid next size (fast)
Отправлено: vulko от Ноябрь 24, 2014, 12:31
Никаких double free, как я и предполагал нет.
Лики были, пофиксил.

Не понимаю причину крэша... Хотя возможно было как-то связано с тем что я хранил ссылки на QObject в модели... Эти же QObject'ы жили в QTableWidget, который очищался при очистке модели... правда они без parent'а были, поэтому при очистке таблицы они не удалялись...

В общем так и не понял я причину...


Название: Re: free(): invalid next size (fast)
Отправлено: Bepec от Ноябрь 24, 2014, 12:40
Указатели new delete освобождение.
 Вот если б твоё приложение логировало полностью своё поеведение вплоть до занимаемых и очищаемых секторов памяти, тогда б ты мог уверенно сказать про причину :) А так раз на раз не приходится :D