【发布时间】:2013-11-29 12:24:01
【问题描述】:
我正在开发一个相当复杂的软件,有时它会在退出时出现段错误。我试图调查 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 实例?或者我还能做些什么来追踪“低于主要”清理的问题?
【问题讨论】:
-
该行的条件断点可能...
-
在分配时打印出指针地址,连同一些一般的流输出,很可能会告诉您哪个代码区域分配了问题的指针。
-
你有静态 QStrings 吗?
-
制作一个测试用例会为你做到这一点。基本调试技术。
-
RichardPlunkett:您的想法是使用修改后的 QString 构造函数重新编译 Qt 吗?或者你能想到一个更简单的方法(也许是一个宏?) FrankOsterfeld:有几个静态 QStrings(可能还有一堆包含 QStrings 的静态对象)。
标签: c++ qt segmentation-fault exit