亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

程序僅在發布版本時崩潰-如何調試?

程序僅在發布版本時崩潰-如何調試?

C++
慕村225694 2019-11-25 10:21:40
我這里遇到的是“薛定inger之貓”類型的問題-我的程序(實際上是我程序的測試套件,但仍然是一個程序)崩潰了,但僅在以發布模式構建時才出現,并且僅在從命令行啟動時才崩潰。通過穴居人調試(即到處都是討厭的printf()消息),我確定了代碼崩潰的測試方法,盡管不幸的是,實際的崩潰似乎發生在某些析構函數中,因為我看到的最后一條跟蹤消息在其他執行干凈的析構函數。當我嘗試在Visual Studio中運行該程序時,它不會崩潰。從WinDbg.exe啟動時也是如此。僅在從命令行啟動時才發生崩潰。順便說一句,這是在Windows Vista下發生的,不幸的是,我現在無法使用XP計算機進行測試。如果我可以讓Windows打印出堆棧跟蹤信息,或者可以像終止程序一樣干凈地終止程序,那真是太好了。是否有人對我如何在此處獲取一些更有意義的信息以及希望修復此錯誤有任何建議?編輯:問題確實是由越界數組引起的,我將在本文中對此進行更多描述。感謝大家為發現此問題所提供的幫助!
查看完整描述

3 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

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


查看完整回答
反對 回復 2019-11-25
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

當我遇到這樣的問題之前,通常是由于變量初始化。在調試模式下,變量和指針會自動初始化為零,而在發布模式下則不會。因此,如果您有這樣的代碼


int* p;

....

if (p == 0) { // do stuff }

在調試模式下,if中的代碼未執行,但在釋放模式下p中包含未定義的值,該值不太可能為0,因此執行該代碼通常會導致崩潰。


我會檢查您的代碼中是否存在未初始化的變量。這也適用于數組的內容。


查看完整回答
反對 回復 2019-11-25
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

到目前為止,還沒有任何答案試圖對可用于調試發行版應用程序的可用技術進行認真概述:

  1. 由于多種原因,發行版和調試版的行為有所不同。 這是一個很好的概述。這些差異中的每一個都可能導致Release版本中的錯誤,而該錯誤在Debug版本中不存在。

  2. 調試器的存在也可能會改變程序的行為,包括發行版和調試版。看到這個答案。簡而言之,至少當連接到程序時,Visual Studio調試器會自動使用“調試堆”。您可以使用環境變量_NO_DEBUG_HEAP關閉調試堆。您可以在計算機屬性或Visual Studio的“項目設置”中指定此設置。這可能會使崩潰與附帶的調試器一起再現。

    有關調試堆損壞的更多信息,請參見此處。

  3. 如果以前的解決方案不起作用,則需要捕獲未處理的異常,并在發生崩潰的實例上附加事后調試器。您可以為此使用WinDbg,有關可用的驗尸調試器及其在MSDN上的安裝的詳細信息

  4. 您可以改進異常處理代碼,如果這是生產應用程序,則應:

    一種。使用以下命令安裝自定義終止處理程序std::set_terminate

    如果要在本地調試此問題,可以在終止處理程序內運行一個無限循環,并將一些文本輸出到控制臺以通知您std::terminate已被調用。然后連接調試器并檢查調用堆棧。 或者您按照此答案中的說明打印堆棧跟蹤。

    在生產應用程序中,您可能希望將錯誤報告發送回國內,最好是將其與一個小的內存轉儲一起發送,以便您按此處所述分析問題。

    b。使用Microsoft的結構化異常處理機制,該機制允許您捕獲硬件和軟件異常。參見MSDN。您可以使用SEH保護部分代碼,并使用與a)中相同的方法來調試問題。SEH提供了有關從生產應用程序發送錯誤報告時可以使用的異常的更多信息。


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 464 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號