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