【问题标题】:Segfault: Track down "invalid read" "free'd at"Segfault:追踪“无效读取”“免费”
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢 René 的回答。您究竟是如何获得符号名称的?据我所知,该变量在崩溃时已被删除,我无法再确定有用的符号名称。
  • 抱歉,回答迟了……我现在不记得细节了,但我记得“ddd”表示“很明显”导致崩溃的对象:)。跨度>
猜你喜欢
  • 2019-03-17
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2021-02-06
  • 1970-01-01
  • 2011-11-05
相关资源
最近更新 更多