2012-11-16 44 views
8

我的代碼有一個問題,有一些非常奇怪的症狀。相同的程序代碼與相同的編譯器導致不同的二進制文件

  1. 的代碼被編譯在我的電腦上有以下版本:

    一個。 GCC版本:4.4.2

    b。 CMAKE verson:2.8.7

    c。 QNX(操作系統)版本:6.5.0

和代碼有段錯誤,同時釋放一些內存和退出從功能(不會死的任何代碼,只是從一個函數退出)。

關於這個奇怪的事情是:

  1. 的代碼做它在釋放模式,但不調試模式:

    一個。代碼是線程化的,所以這表明競爭條件。

    b。我無法通過將其置於調試模式進行調試。

  2. 在具有相同版本的所有工件的同事機器上編譯時的代碼沒有這個問題。

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

所以現在新的問題:

什麼地獄?爲什麼沒有第一次改變工作,但第二次改變了,爲什麼我必須通過參考?哦,還有一個很大的問題,當我的同事編譯它並且我運行它時,怎麼會不這麼做呢?它是一個直接的內存錯誤,當然它不應該依賴於哪臺計算機編譯它,特別是因爲編譯器和所有其他重要的東西都是相同的。

感謝您的幫助球員。

+2

聽起來像是一個內存問題 - 在調試模式下的valgrind仍然值得一試 - 它有助於確定它是否是內存。 – John3136

+2

「1.代碼在釋放模式下執行,但不是調試模式:」 - 這是內存問題的罕見症狀(由於腳印差異) –

+0

@ John3136不幸的是我不能使用valgrind,因爲我在QNX上運行沒有支持。我可以嘗試將這個函數拿到linux(ubuntu或fedora)中,但這會花費很長時間,所以我想先嚐試其他的東西。 –

回答

7

...從編譯他的機器,這是相同的上創建的二進制文件,大約是6MB大

值得搞清楚的區別是什麼(即使它只是的情況下,他的建立獸皮,而你的公開,真正的錯誤):

  • 仔細檢查你的源文件完全一樣的代碼(沒有未提交的本地修改,在包含搜索路徑沒有多餘的頭,等)
    • 通過在cmake中添加一個-E切換到gcc參數進行三重檢查,因此它將使用與常規編譯相同的包含路徑預處理文件; DIFF預處理器輸出
  • 比較來自nmobjdump或輸出什麼,你必須爲你的兩個鏈接的可執行文件:如果某些系統或第三方庫是在一臺不同的版本,它可以顯示在這裏
  • 比較輸出ldd,如果它的動態鏈接,確保他們都得到相同的庫版本
    • 比較庫版本中,它實際上得到在運行時也一樣,如果可能的話。希望你能夠做一個:運行pldd,在/proc/pid/map比較.so項,下strace/dtrace/truss運行過程和比較運行時鏈接活動

至於代碼.. 。如果這不起作用:

Eigen::VectorXd ModelSearcher::getMinimumBoundingBox(); 
// ... 
Eigen::VectorXd msBb(6, 1); msBb = data.modelSearcher->getMinimumBoundingBox(); 

,這確實:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input); 
// ... 
Eigen::VectorXd msBb(6, 1); data.modelSearcher->getMinimumBoundingBox(msBb); 

你可能對賦值運算符有問題。如果它執行淺拷貝並且向量中存在動態分配的內存,則最終將有兩個向量保存相同的指針,並且它們都將是free/delete它。

請注意,如果操作員根本沒有定義,則默認爲執行此淺拷貝。

+0

+1用於檢查/區分輸出。 – Macke

+0

很好的回答,第二部分解釋了內存錯誤的問題。我會研究第一部分,看看我找到了什麼。 –

0

你說你必須從改變:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd& input); 

什麼之前是什麼呢?

如果它是:

void ModelSearcher::getMinimumBoundingBox(Eigen::MatrixXd input); 

和拷貝構造函數/賦值運算符不正確實施可能造成的問題。

請確認它們是如何實現的。這可能有幫助some info

+0

它在問題中說過這是什麼。這不是問題。感謝您的幫助。 –

+0

它必須是。你沒有遵循三條規則。 –

+0

@LightnessRacesinOrbit不是,它不是之前的輸入。 –

相關問題