3 回答

TA貢獻1995條經驗 獲得超2個贊
在我見過或聽說過的100%的情況下,C或C ++程序在調試器中運行良好,但在外部運行時失敗,原因一直在寫到函數本地數組的末尾。(調試器將更多內容放在堆棧上,因此您不太可能覆蓋重要內容。)

TA貢獻1818條經驗 獲得超3個贊
當我遇到這樣的問題之前,通常是由于變量初始化。在調試模式下,變量和指針會自動初始化為零,而在發布模式下則不會。因此,如果您有這樣的代碼
int* p;
....
if (p == 0) { // do stuff }
在調試模式下,if中的代碼未執行,但在釋放模式下p中包含未定義的值,該值不太可能為0,因此執行該代碼通常會導致崩潰。
我會檢查您的代碼中是否存在未初始化的變量。這也適用于數組的內容。

TA貢獻1804條經驗 獲得超8個贊
到目前為止,還沒有任何答案試圖對可用于調試發行版應用程序的可用技術進行認真概述:
由于多種原因,發行版和調試版的行為有所不同。 這是一個很好的概述。這些差異中的每一個都可能導致Release版本中的錯誤,而該錯誤在Debug版本中不存在。
調試器的存在也可能會改變程序的行為,包括發行版和調試版。看到這個答案。簡而言之,至少當連接到程序時,Visual Studio調試器會自動使用“調試堆”。您可以使用環境變量_NO_DEBUG_HEAP關閉調試堆。您可以在計算機屬性或Visual Studio的“項目設置”中指定此設置。這可能會使崩潰與附帶的調試器一起再現。
有關調試堆損壞的更多信息,請參見此處。
如果以前的解決方案不起作用,則需要捕獲未處理的異常,并在發生崩潰的實例上附加事后調試器。您可以為此使用WinDbg,有關可用的驗尸調試器及其在MSDN上的安裝的詳細信息
您可以改進異常處理代碼,如果這是生產應用程序,則應:
一種。使用以下命令安裝自定義終止處理程序
std::set_terminate
如果要在本地調試此問題,可以在終止處理程序內運行一個無限循環,并將一些文本輸出到控制臺以通知您
std::terminate
已被調用。然后連接調試器并檢查調用堆棧。 或者您按照此答案中的說明打印堆棧跟蹤。在生產應用程序中,您可能希望將錯誤報告發送回國內,最好是將其與一個小的內存轉儲一起發送,以便您按此處所述分析問題。
b。使用Microsoft的結構化異常處理機制,該機制允許您捕獲硬件和軟件異常。參見MSDN。您可以使用SEH保護部分代碼,并使用與a)中相同的方法來調試問題。SEH提供了有關從生產應用程序發送錯誤報告時可以使用的異常的更多信息。
- 3 回答
- 0 關注
- 464 瀏覽
添加回答
舉報