2016-09-28 28 views
0

我有一個令人煩惱的C++問題。我有一個巨大的,複雜的代碼塊,它被編譯成一個Linux共享對象。當它通過一個特定的代碼路徑時,它會發生段錯誤。 (基本上,其中一個STL迭代器似乎指向了它應該在的一側的幾個字節)。但是,如果我將所有代碼放入一個巨大的源文件並將其編譯爲獨立程序,那麼所有代碼​​都可以正常工作。我的代碼segfaults編譯爲共享對象時,作爲獨立的二進制工作正常

我怎麼竟然開始來調試呢?這個問題似乎不是一個源代碼級別的問題,但(我猜?)某種奇怪的鏈接器問題。我完全失去了。 (我認爲STL是所有編譯時的東西......)

如果它的事項中,所以編譯如下所示:

g++ -m64 -c -D_CONSOLE -D__UNICODE__ -fPIC -O0 -g -D_DEBUG -D_GLIBCXX_DEBUG <name> -o <name>.o 
g++ -m64 -shared -o MangoLib.so <objects...> 

的單機架由一個小型驅動程序的一束#include指令,建成像這樣:

g++ -m64 -fPIC -O0 -g -D_DEBUG -D_GLIBCXX_DEBUG Test.cpp -o Test 

我不認爲沒有什麼錯在這裏...但SO出現segfaults每一次,所以我想我沒有?我不知道現在該做什麼。

+0

我會建議添加'-Wall -Wextra -Werror'並再次編譯所有內容。然後在valgrind下運行這兩個版本。 –

+0

@JohnZwinck是的,我可能不得不實際經歷強烈的依賴地獄,試圖強迫valgrind工作。我只希望它告訴我一些事情! – MathematicalOrchid

+0

Valgrind只告訴我「條件跳轉或移動取決於未初始化的值」,以及段錯誤發生時的相同行號。我是否需要通過一些選擇或其他? – MathematicalOrchid

回答

0

我會開始檢查全局變量和靜態初始值設定項的用法。這些事情發生的順序沒有明確定義AFAIK。每個全局變量或靜態初始化器都比「只用0位填充這個內存」複雜得多。幾個相互引用的靜態初始化器基本上是不可行的。

+0

我不認爲有涉及全局或靜態變量... – MathematicalOrchid

+0

和靜態構造函數的方法? – HASSeering

+0

我不認爲整個項目中都有靜態的東西。 – MathematicalOrchid

相關問題