2016-02-05 401 views
1

我在Qt 4.8.6上遇到了一個非常奇怪的OS X崩潰。OS X上的QStringList.append()崩潰

我的代碼非常簡單位(工作在我們的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的析構函數導致類似的崩潰。

我真的在如何進一步調試這個損失,任何意見將不勝感激。

謝謝!

+0

這可能不僅僅是'QStringList'失敗。最低級別的堆棧框架顯示崩潰很可能發生在'QBasicAtomicInt'類中。 – owacoder

+0

它確實覺得它可能與隱式共享和參考計數有關。但是,我也看到在QString拷貝構造函數中,源字符串數據顯示爲空... – Serguei

+0

重新編譯時啓用了addresssanitizer,再次運行它並查看它是否抱怨內存損壞。 –

回答

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; 
} 

..then qmake qstringlist.pro && make && ./qstringlist.app/Contents/MacOS/qstringlist

繞過硫如果我想在其他系統上運行,我通常會自己構建Qt,並仔細選擇構建設置。

+0

感謝kintel,我認爲這可能是一個問題,所以我確保Qt庫和我們的版本都鏈接到libstdC++並且都是用clang構建的。我會嘗試一個簡單的項目,像你所建議的,至少看看這是一個普遍問題還是我們項目的特定問題。 – Serguei

+0

哦,另一個常見的問題是,你可能在運行時選擇了另一個Qt庫,而不是你正在構建的庫。驗證:'DYLD_PRINT_LIBRARIES = 1。/ qstringlist.app/Contents/MacOS/qstringlist' – kintel

0

我們終於找到了它,結果發現我們鏈接的Qt庫已經修改了頭文件,而且我們的構建系統並沒有正確地拉動它們。我想這是一個教訓,它總是最好的信任,但驗證:)

感謝您的幫助大家!