Я работаю над довольно сложным программным обеспечением, и время от времени он выходит на выход. Я попытался исследовать проблему с 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? Или что еще я могу сделать, чтобы выявить проблемы, когда "ниже основного" очищается?
Недавно у меня была очень (очень!) Проблема с одной из моих глобальных QString, но это произошло только в Qt 5 (5.1.1), а не в Qt 4 (4.8.5)... так, как я ее решил в конец должен был запустить приложение через gdb/ddd и разрешить ему сбой, чтобы определить имя нарушающего символа. После выяснения этого я просто сделал его членом одного из моих классов, основанных на QObject (на самом деле не было причин для его глобального), и это исправило это.