我的代碼有一個問題,有一些非常奇怪的症狀。相同的程序代碼與相同的編譯器導致不同的二進制文件
的代碼被編譯在我的電腦上有以下版本:
一個。 GCC版本:4.4.2
b。 CMAKE verson:2.8.7
c。 QNX(操作系統)版本:6.5.0
和代碼有段錯誤,同時釋放一些內存和退出從功能(不會死的任何代碼,只是從一個函數退出)。
關於這個奇怪的事情是:
的代碼做它在釋放模式,但不調試模式:
一個。代碼是線程化的,所以這表明競爭條件。
b。我無法通過將其置於調試模式進行調試。
在具有相同版本的所有工件的同事機器上編譯時的代碼沒有這個問題。
a。關於這個的奇怪之處在於工作代碼的工作原理,而且在他的機器上編譯的二進制文件也是相同的,大約大6mB。
現在令人討厭的是我無法發佈代碼,因爲它太大,也適合工作。但任何人都可以指出我沿着一條路徑來解決這個問題。
由於我使用QNX,我的調試工具受到限制,我無法使用Valgrind,並且由於它在QNX中不受支持,所以GDB並沒有真正的幫助。
我正在尋找任何有類似/相同問題的人,以及原因是什麼以及他們如何解決問題。
編輯:
的sooo ...我發現它是什麼,但它是如何發生的IM還是有點困惑。
罪魁禍首代碼是這樣的:
Eigen::VectorXd msBb = data.modelSearcher->getMinimumBoundingBox();
其中用於getMinimumBoundingBox
的定義是這樣的:
Eigen::VectorXd ModelSearcher::getMinimumBoundingBox();
,它返回一個VectorXd它總是初始化爲VectorXd output(6, 1)
。於是,我馬上想到,右那一定是因爲VectorXd不被初始化,但它改變這樣:
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox();
但這並沒有工作。事實上,我不得不改變功能的,以這個定義來解決這個問題:
void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input);
,並調用此
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb);
所以現在新的問題:
什麼地獄?爲什麼沒有第一次改變工作,但第二次改變了,爲什麼我必須通過參考?哦,還有一個很大的問題,當我的同事編譯它並且我運行它時,怎麼會不這麼做呢?它是一個直接的內存錯誤,當然它不應該依賴於哪臺計算機編譯它,特別是因爲編譯器和所有其他重要的東西都是相同的。
感謝您的幫助球員。
聽起來像是一個內存問題 - 在調試模式下的valgrind仍然值得一試 - 它有助於確定它是否是內存。 – John3136
「1.代碼在釋放模式下執行,但不是調試模式:」 - 這是內存問題的罕見症狀(由於腳印差異) –
@ John3136不幸的是我不能使用valgrind,因爲我在QNX上運行沒有支持。我可以嘗試將這個函數拿到linux(ubuntu或fedora)中,但這會花費很長時間,所以我想先嚐試其他的東西。 –