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