2012-04-03 68 views
5

因此,我最近開始使用llvm-gcc編譯器開發一個大型軟件項目,該項目鏈接OSX上的多個靜態和動態庫。檢查不同stl鏈接的C++庫來追蹤gcc/osx上的std :: vector析構函數崩潰?

我遇到了嚴重的問題。具體來說,非常簡單的代碼會崩潰。舉例來說,在我的主要項目,下面的代碼會崩潰:

{ 
    std::vector< unsigned int > testvec; 
    testvec.resize(1); 
    testvec[0] = 0; 
} 

退出時的範圍,內部的std ::矢量< unsigned int類型>的析構函數,投擲SIGABRT和說,記憶就會死機被解除分配尚未分配。具體來說:

malloc: *** error for object 0x135e8fc30: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

這隻發生在發佈版本 - 調試版本工作得很好。

我最好的猜測是其中一個外部庫與另一個使用不同內部內存佈局的STL版本鏈接,所以它試圖釋放大小或類似的東西。

我已經在我鏈接的所有庫上運行nm,並且它們中的一些具有外部stl符號(具體來說,std :: vector < unsigned int>析構函數在nm輸出中標記爲S) 。但我無法弄清楚哪一個是罪魁禍首。

有沒有辦法檢查.a或dylib文件來追蹤哪些鏈接到不同版本的STL?

[編輯]

這看起來像在Two static libs, two different vector implementations, what would the linker do?上述情況的真實世界的例子,事實證明,鏈接器不可怕,可怕的事情.. :)

+1

如果您通過析構函數調用通過機器指令來執行,該怎麼辦?你最終會在哪個圖書館裏面? – 2012-04-03 23:41:27

+0

@ZanLynx謝謝,我最終在一個與不同庫鏈接的小項目中加入了新的操作符,最後將其縮小爲從構造函數返回不同值的那個。 – tfinniga 2012-04-04 16:15:23

回答

2

我相信otool -L是你正在尋找。這將列出程序使用的共享庫。

你也應該看看你的包含路徑。這似乎不太可能,但#include <vector>可能會拉入非標準包含,其定義與標準庫中的不一致。