解決方法是我在程序中用到了ASSERT宏用來調(diào)試,可是沒料到的是在release版本下,ASSERT里面的內(nèi)容就不編譯了。ASSERT和VERIFY有什么區(qū)別 ASSERT里面的內(nèi)容在Release版本中不編譯,VERIFY里面的內(nèi)容仍然翻譯,但不再判斷真假。所以后者更安全一點(diǎn)?! ±鏏SSERT(file.Open(strFileName))?! ∫坏┑搅薘elease版本中,這一行就忽略了,file根本就不Open()了,而且沒有任何出錯(cuò)的信息。如果用VERIFY()就不會有這個(gè)問題。如果不是這個(gè)問題,另附搜到的其它解決方案,希望能夠有幫助。 ASSERT和VERIFY有什么區(qū)別 ASSERT里面的內(nèi)容在Release版本中不編譯,VERIFY里面的內(nèi)容仍然翻譯,但不再判斷真假。所以后者更安全一點(diǎn)。 例如ASSERT(file.Open(strFileName))?! ∫坏┑搅薘elease版本中,這一行就忽略了,file根本就不Open()了,而且沒有任何出錯(cuò)的信息。如果用VERIFY()就不會有這個(gè)問題。檢查變量是否初始化。release編譯時(shí)有沒有變量未初始化的警告。 由于編譯優(yōu)化的原因.. 檢查未初始化的指針使用.可能是野指針的問題一般都是指針指向了非法地址或數(shù)組下標(biāo)越界造成的; 內(nèi)存紊亂。為減少在RELEASE版本中出現(xiàn)奇怪的問題,程序編制中幾個(gè)問題應(yīng)充分重視: 1、變量要盡可能初始化賦值,如TCHAR *token = NULL; TCHAR aa[10] = {0}; 2、不要在ASSERT的斷言語句中賦值,如ASSERT((ptr = getptr()) != NULL);一般是指針問題。 可以通過調(diào)試方法找到這個(gè)問題所在。 跳出來那個(gè)對話框,你就點(diǎn)擊調(diào)試,然后進(jìn)入vc環(huán)境,看看調(diào)用堆棧,定位是那個(gè)函數(shù)里面出問題了。如果函數(shù)比較大,你就使用int 3 下斷點(diǎn)來確定每行代碼的地址。這樣最終能夠發(fā)現(xiàn)是那行代碼的問題。 如果沒有源代碼就比較困難,不過還是可以跟蹤個(gè)八九不離十的。除了指針的問題外, 可能還有靜態(tài)變量的問題. 另外你改改配置文件中的優(yōu)化方式.debug和re啊release的區(qū)別主要就是變量初始化的問題,還有一些內(nèi)存溢出,在debug下沒問題,但是到了relaease下就過不去了。還有就是assert 我們最好進(jìn)行以下的檢查: 1、時(shí)常測試軟件的兩種版本。 2、不要輕易將問題歸結(jié)為DEBUG/RELEASE問題,除非你已經(jīng)充分對兩種版本進(jìn)行了測試。 3、預(yù)處理的不同,也有可能引起這樣的問題。 出現(xiàn)問題的一種可能性是在不同版本的編譯間定義了不同的預(yù)處理標(biāo)記。請對你的DEBUG版本的軟件試一下以下改動: 在"Project Setting(ALT-F7)" 中的C/C++項(xiàng)中設(shè)置目錄(category)為"General",并且改動"_DEBUG"定義為"NDEBUG". 設(shè)置目錄為"Preprocessor"并且添加定義"_DEBUG到"Undefined Symbols"輸入框. 選擇Rebuild ALL,重新編譯. 如果經(jīng)過編譯的程序產(chǎn)生了問題,請對代碼進(jìn)行如下改動: 將ASSERT() 改為 VERIFY(). 找出定義在"#ifdef _DEBUG"中的代碼,如果在RELEASE版本中需要這些代碼請將他們移到定義外。 查找TRACE(...)中代碼,因?yàn)檫@些代碼在RELEASE中也不被編譯。 所以請認(rèn)真檢查那些在RELEASE中需要的代碼是否并沒有被便宜。 4、變量的初始化所帶來的不同,在不同的系統(tǒng),或是在DEBUG/RELEASE版本間都存在這樣的差異,所以請對變量進(jìn)行初始化。 5、是否在編譯時(shí)已經(jīng)有了警告?請將警告級別設(shè)置為3或4,然后保證在編譯時(shí)沒有警告出現(xiàn). 6、是否改動了資源文件. 7、此外對RELEASE版本的軟件也可以進(jìn)行調(diào)試,請做如下改動: 在"Project Settings" 中 "C++/C " 項(xiàng)目下設(shè)置 "category" 為 "General" 并且將"Debug Info"設(shè)置為 "Program Database". 在"Link"項(xiàng)目下選中"Generate Debug Info"檢查框。 "Rebuild All" 如此做法會產(chǎn)生的一些限制: 無法獲得在MFC DLL中的變量的值。 必須對該軟件所使用的所有DLL工程都進(jìn)行改動。 另: MS BUG:MS的一份技術(shù)文檔中表明,在VC5中對于DLL的"Maximize Speed"優(yōu)化選項(xiàng)并未被完全支持,因此這將會引起內(nèi)存錯(cuò)誤并導(dǎo)致程序崩潰。