Segfault: отследить «недопустимое чтение», «free'd at»

0

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

Я использовал valgrind с --track-origins=yes, но это также не помогает понять, что это такое.

==28264== Invalid read of size 4
==28264==    at 0x563B66: QBasicAtomicInt::deref() (qatomic_x86_64.h:133)
==28264==    by 0x563DC6: QString::~QString() (in build/output/bin/qgis)
==28264==    by 0x36F8A395E9: __cxa_finalize (cxa_finalize.c:55)
==28264==    by 0x5B94212: ??? (in build/output/lib/libqgis_core.so.2.1.0)
==28264==    by 0x36F860FB69: _dl_fini (dl-fini.c:253)
==28264==    by 0x36F8A39278: __run_exit_handlers (exit.c:77)
==28264==    by 0x36F8A392C4: exit (exit.c:99)
==28264==    by 0x36F8A21B4B: (below main) (libc-start.c:308)
==28264==  Address 0x135b30b0 is 0 bytes inside a block of size 40 free'd
==28264==    at 0x4A074C4: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==28264==    by 0x36C48C31F7: QString::free(QString::Data*) (qstring.cpp:1235)
==28264==    by 0x563DDC: QString::~QString() (in build/output/bin/qgis)
==28264==    by 0x36F8A39278: __run_exit_handlers (exit.c:77)
==28264==    by 0x36F8A392C4: exit (exit.c:99)
==28264==    by 0x36F8A21B4B: (below main) (libc-start.c:308)

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

  • 0
    условная точка останова на этой линии, возможно ...
  • 1
    распечатывать адреса указателей при выделении, наряду с некоторыми общими выводами потока, аналогично скажу вам, в какой области кода выделен указатель, который был проблемой.
Показать ещё 5 комментариев
Теги:
qt
segmentation-fault
exit

1 ответ

0

Недавно у меня была очень (очень!) Проблема с одной из моих глобальных QString, но это произошло только в Qt 5 (5.1.1), а не в Qt 4 (4.8.5)... так, как я ее решил в конец должен был запустить приложение через gdb/ddd и разрешить ему сбой, чтобы определить имя нарушающего символа. После выяснения этого я просто сделал его членом одного из моих классов, основанных на QObject (на самом деле не было причин для его глобального), и это исправило это.

  • 0
    Спасибо за ответ, Рене. Как именно вы получили название символа? Насколько я могу судить, к моменту сбоя переменная уже удалена, и я больше не могу определить полезное имя символа.
  • 0
    Извините за поздний ответ ... и я не помню подробностей сейчас, но я вспоминаю, что "ddd" обозначал объект, который вызывал сбой "совершенно очевидно" :).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню