3 回答

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

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

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