OS X

时间:2016-02-05 02:22:18

标签: c++ macos qt crash qstring

我正在使用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的析构函数导致类似的崩溃。

我真的不知道如何进一步调试,任何建议都会非常感激。

谢谢!

2 个答案:

答案 0 :(得分: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 && make && ./qstringlist.app/Contents/MacOS/qstringlist

为了解决这个问题,我通常会自己构建Qt,如果我想在其他系统上运行,可以使用精心选择的构建设置。

答案 1 :(得分:0)

我们最终追踪它,结果我们链接的Qt库修改了标题,我们的构建系统没有正确地将它们拉出来。我想这是一个教训,它总是最值得信赖,但要验证:)

感谢大家的帮助!