【问题标题】:QStringList.append() crash on OS XQStringList.append() 在 OS X 上崩溃
【发布时间】:2016-02-05 02:22:18
【问题描述】:

我在使用 Qt 4.8.6 的 OS X 上遇到了一个非常奇怪的崩溃。

我有一段非常简单的代码(在我们的 Windows 和 Linux 版本中运行良好):

QStringList list;
list << "test";

我发现追加操作会在运行时崩溃,并出现以下堆栈跟踪:

QBasicAtomicInt::ref() { asm volatile("lock\n" ... }
QString::QString(QString const&)
QString::QString(QString const&)
QList<QString>::node_copy(QList<QString>::Node*from, QList<QString>::Node*, QList<QString>::Node*)
QList<QString>::detach_helper_grow(int, int)
QList<QString>::append(QString const&)
QStringList::operator<<(QString const&)

包括 QStringList 的析构函数在内的大多数其他操作都会导致类似的崩溃。

我真的不知道如何进一步调试,任何建议将不胜感激。

谢谢!

【问题讨论】:

  • 这可能不仅仅是 QStringList 失败。最低级别的堆栈帧显示崩溃最有可能发生在 QBasicAtomicInt 类中。
  • 确实感觉它可能与隐式共享和引用计数有关。但是,我还看到在 QString 复制构造函数中,源字符串数据似乎为空...
  • 在启用addresssanitizer的情况下重新编译,再次运行它,看看它是否抱怨内存损坏。
  • 当附加的字符串或字符串列表已被删除或类似时,通常回溯看起来像这样。这两行是在整个代码之上,还是在 QStringList 声明和
  • 就是这两行,取自我所做的简单单元测试,看看它是否也会在我们的构建机器上崩溃。

标签: c++ macos qt crash qstring


【解决方案1】:

这看起来像是 Qt 库由不同的编译器构建或由与应用程序的其余部分不同的 C++ 库链接的典型案例。在 OS X 上,罪魁祸首往往是 libstdc++ 与 libc++,它们具有不兼容的字符串实现等。

你能用一个简单的例子重现这个吗?例如:

qstringlist.pro:

SOURCES = qstringlist.cpp

qstringlist.cpp:

#include <QStringList>
#include <iostream>
int main(int argc, char *argv[]) {
  QStringList list;
  list << "test";
  std::cout << list.join(" ").toStdString() << std::endl;
}

..然后qmake qstringlist.pro &amp;&amp; make &amp;&amp; ./qstringlist.app/Contents/MacOS/qstringlist

为了解决这个问题,我通常自己构建 Qt,如果我想在其他系统上运行,我会仔细选择构建设置。

【讨论】:

  • 感谢 kintel,我认为这可能是个问题,所以我确保 Qt 库和我们的构建都链接到 libstdc++ 并且都使用 clang 构建。我会按照您的建议尝试一个简单的项目,至少看看这是一个普遍问题还是我们项目的特定问题。
  • 哦,另一个常见问题是您可能在运行时选择了另一个 Qt 库,而不是您构建时所针对的库。验证:DYLD_PRINT_LIBRARIES=1 ./qstringlist.app/Contents/MacOS/qstringlist
【解决方案2】:

我们终于找到了它,结果发现我们链接的 Qt 库修改了标头,而我们的构建系统没有正确地将它们拉入。我想这是一个值得信任但最好验证的教训:)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多