Segfault:追踪“无效读取”“free'd at”

时间:2013-11-29 12:24:02

标签: c++ qt segmentation-fault exit

我正在开发一个相当复杂的软件,偶尔会在退出时出现段错误。我尝试用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实例?或者我还能做些什么来追踪“低于主要”清理的问题?

1 个答案:

答案 0 :(得分:0)

我最近和我的一个全球QString有一个非常(非常!)类似的问题,但这只发生在Qt 5(5.1.1)中,而不是Qt 4(4.8.5)...我解决的方式它最终是通过gdb / ddd运行应用程序并让它崩溃以确定违规的符号名称。在搞清楚之后,我只是让它成为我的一个QObject派生类的成员(实际上没有理由让它成为全局的)并修复它。