2012-06-28 88 views
28

我必須調試一個C++項目,但因爲一個依賴項不能在調試模式下編譯,而且我目前還無法解決這個問題,所以我想嘗試在發佈模式下調試項目。如何在發佈模式下進行調試?

當前應用程序由於空指針而崩潰,但我沒有導致錯誤的代碼。由於在發佈模式中顯然忽略了斷點,我想知道找到錯誤的最佳方式是什麼。

回答

52

在VS中,右鍵單擊您的項目,選擇「屬性」。

  1. 單擊C/C++節點。將調試信息格式設置爲兼容C7(/ Z7)或程序數據庫(/ Zi)。

  2. 展開鏈接器並單擊常規節點。將增量鏈接設置爲否(/ INCREMENTAL:NO)。

  3. 選擇調試節點。將生成調試信息設置爲是(/ DEBUG)。

  4. 選擇優化節點。將參考設置爲是(/ OPT:REF)。

    如果指定了/ OPT:REF,/ OPT:默認情況下ICF開啓。

這是直接從微軟的文檔撕開:

我做的時間這一切,幾乎在調試模式不調試了。如你所知,在一個調試版本中可能不會發生髮布版本中發生的許多錯誤(幾乎可以肯定是調用UB產生的錯誤)。

此外,我在一個項目上工作,該項目使用大量圖像處理,並執行大量圖像的壓縮/解壓。使用緩慢的調試版本是不切實際的。

+0

謝謝問題解決了!對於所有這些設置的效果我都不太瞭解,所以最好只使用它們進行調試,並在編譯實際發行版時再次將其刪除? – Pedro

+5

@Pedro:是的,可能最好將它們還原,並保留ON的默認值。我通常爲這個配置創建一個新的構建類型,即「釋放w /符號」。也就是說,研究這些交換機實際做的事情並不會帶來什麼壞處。 –

4

您不能總是隻更改項目設置並重新編譯。
有時你有一個想要調試的發佈版本,或者客戶端發送的轉儲文件。

在優化版本中編譯C++項目時,調試器有時不會顯示正確的對象信息。

局部變量通常是第一個去的,很多時候,這個對象的信息會丟失給調試器。

原因是編譯器使用可用的硬件寄存器來保存信息,並使用優化來避免分配局部變量。

我建議的方式在這裏找到丟失的信息:

Debugging Release Projects in C++ - Finding the Lost Object Information

+0

@如果你有權訪問代碼和IDE,那麼答案很好。 Yochai的回答值得一讀。 –

相關問題