2017-04-20 28 views
0

在開發32位Windows命令行程序時,我們最近遇到調試版本按預期工作的情況,而發行版本在其計算中顯示出奇怪的行爲不。現在,這在20多年前並不罕見。對於發佈版本,編譯器優化會打開,即使現在編譯器優化也不一定適用於所有情況。所以,在過去,如果我們遇到了這個問題,我們會關閉編譯器優化 - 如果速度或空間考慮非常重要,可能會選擇關閉。這次我們關閉了所有優化,問題依然存在!調試版本和發行版本之間的唯一區別在於一系列的編譯器和加載程序設置。我們回去修改版本設置,儘可能匹配調試設置,問題仍然存在!那我們以前從未見過。MS Visual C++發行版和調試版本之間不同行爲的可能原因

這一切都在我們通常用於32位Windows的VC6平臺上。這是正確的Microsoft Visual C++ 6.0。我們對VC6的偏好是,我們是微軟在其C/C++軟件包的所有版本上通過VC6的beta測試人員,並且對優化程序的調試非常活躍。但由於我們已經沒有與VC8真正的問題,我們嘗試過。在這種情況下,我們只需將VC8轉換成我們一直使用的項目。令我們驚訝的是,我發現VC8顯示了完全相同的問題。調試版本起作用,發行版本不起作用。我們可能會嘗試在VC8中從頭開始創建這個東西,看看它是否有所作爲,但我們更懷疑它不會。在這一點上,我們完全不瞭解這一點。它必須是一個編譯器開關設置,我們缺少的地方。還是呢?

還有什麼可以導致版本和調試版本之間的差異?

+2

如果調試和發佈版本的行爲不同,它可能是您在某處使用未初始化的內存或變量的標誌。 –

+2

我看到VC在調試中分配一些額外的堆棧空間,而不是在釋放中。所以可能你會跳出一些綁定在一個堆棧分配的數組上,這個數組現在在發行版中出現。您可以通過檢查彙編程序來檢查。 –

+0

@Paul Ogilvie感謝您的觀察,將看看。 –

回答

1

一般來說,您會發現調試可執行文件與可執行文件的不同之處在於幾個方面。通過查看可執行文件的文件大小,這是顯而易見的。可能的原因包括

  • 調試可能編譯做錯誤檢查
  • 調試通常已禁用優化額外的代碼,同時釋放很可能有一個較高的水平。
  • 調試可能會默認初始化自動變量爲零,而發佈根本不初始化。
  • 調試可能會攜帶附加信息來將可執行代碼與源代碼相關聯,而版本不可以。

我最好的建議是初始化所有的變量,即使它看起來很愚蠢。驗證所有的內存分配是否正常工作,並確保您在範圍內正確釋放。

上面的靜態分析器註釋是非常好的建議。通過編譯一個更新的編譯器,您可以獲得類似的好處。

看看CPPCHECK,或許多商業跳棋之一。

我建議你在任何情況下升級到最新的編譯器。

祝你好運。

邪惡。

+0

感謝您的回答 –

+0

在您的第三個項目符號上,添加「_automatic_」,因爲所有全局變量必須根據標準初始化爲「其值或零」。 VC Debug將自動變量初始化爲標記值。 –

+0

在您的第四個項目符號上,是的,它可能包含其他信息,但不包含其他代碼。那麼這個_information_不能影響_behavior_。 –

1

由於可能會執行完整性檢查(特別是在未定義行爲的情況下),調試實現可能與Release相比具有不同的結果。

一個很好的例子:使用std::minstd::max用的NaN(見Why does Release/Debug have a different result for std::min?)會給出不同的結果在推出/調試(見my own answer其中I分析的功能實現)。

+0

謝謝你的出發點。我們會看看。 –

相關問題