d ebug 通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。release 稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好地使用。
debug 和 release 的真正秘密,在於一組編譯選項。下面列出了分別針對二者的選項(當然除此之外還有其他一些,如/fd /fo,但區別並不重要,通常他們也不會引起 release 版錯誤,在此不討論)
debug 版本:
/mdd /mld 或 /mtd 使用 debug runtime library(除錯版本的執行時刻函式庫)
/od 關閉優化開關
/d "_debug" 相當於 #define _debug,開啟編譯除錯**開關(主要針對
assert函式)
/zi 建立 edit and continue(編輯繼續)資料庫,這樣在除錯過
程中如果修改了源**不需重新編譯
/gz 可以幫助捕獲記憶體錯誤
/gm 開啟最小化重鏈結開關,減少鏈結時間
release 版本:
/md /ml 或 /mt 使用發布版本的執行時刻函式庫
/o1 或 /o2 優化開關,使程式最小或最快
/d "ndebug" 關閉條件編譯除錯**開關(即不編譯assert函式)
/gf 合併重複的字串,並將字串常量放到唯讀記憶體,防止
被修改
實際上,debug 和 release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優化過的除錯版本或是帶跟蹤語句的發布版本。
這種情況很容易解釋。舉個例子:請在vc下輸入assert然後選中按f12跳到巨集定義的地方,這裡你就能夠發現debug中assert要執行 afxassertfailedline,而release下的巨集定義卻為"#define assert(f) ((void)0)"。所以注意在這些除錯巨集的語句不要用程式相關變數如i++寫操作的語句。verify是個例外,"#define verify(f) ((void)(f))",即執行,這裡的作用就不多追究了,有興趣可自己研究:)。
三、怎樣「除錯」 release 版的程式
遇到 debug 成功但 release 失敗,顯然是一件很沮喪的事,而且往往無從下手。如
果你看了以上的分析,結合錯誤的具體表現,很快找出了錯誤,固然很好。但如果一時找
不出,以下給出了一些在這種情況下的策略。
1. 前面已經提過,debug 和 release 只是一組編譯選項的差別,實際上並沒有什麼
定義能區分二者。我們可以修改 release 版的編譯選項來縮小錯誤範圍。如上所述,可以
把 release 的選項逐個改為與之相對的 debug 選項,如 /md 改為 /mdd、/o1 改為 /od
,或執行時間優化改為程式大小優化。注意,一次只改乙個選項,看改哪個選項時錯誤消
失,再對應該選項相關的錯誤,針對性地查詢。這些選項在 project\settings... 中都可
以直接通過列表選取,通常不要手動修改。由於以上的分析已相當全面,這個方法是最有
效的。
2. 在程式設計過程中就要時常注意測試 release 版本,以免最後**太多,時間又很緊 。
3. 在 debug 版中使用 /w4 警告級別,這樣可以從編譯器獲得最大限度的錯誤資訊,
比如 if( i =0 )就會引起 /w4 警告。不要忽略這些警告,通常這是你程式中的 bug 引起
的。但有時 /w4 會帶來很多冗餘資訊,如 未使用的函式引數 警告,而很多訊息處理函式
都會忽略某些引數。我們可以用
#progma warning(disable: 4702) //禁止
//...
#progma warning(default: 4702) //重新允許
來暫時禁止某個警告,或使用
#progma warning(push, 3) //設定警告級別為 /w3
//...
#progma warning(pop) //重設為 /w4
來暫時改變警告級別,有時你可以只在認為可疑的那一部分**使用 /w4。
4.你也可以像 debug 一樣除錯你的 release 版,只要加入除錯符號。在 project/s
ettings... 中,選中 settings for "win32 release",選中 c/c++ 標籤,category 選
general,debug info 選 program database。再在 link 標籤 project options 最後
加上 "/opt:ref" (引號不要輸)。這樣偵錯程式就能使用 pdb 檔案中的除錯符號。但除錯時
你會發現斷點很難設定,變數也很難找到——這些都被優化過了。不過令人慶幸的是,ca
ll stack 視窗仍然工作正常,即使幀指標被優化,棧資訊(特別是返回位址)仍然能找到
。這對定位錯誤很有幫助。
四、除錯舉例
人們將不同版本dll混合造成的不一致性形象的稱為 「動態連線庫的地獄「(dll hell) ,甚至微軟自己也這麼說
vii. 將project settings" 中 "c++/c " 專案下優化選項改為disbale(debug)。編譯器的優化可能導致許多意想不到的錯誤,請參
3. 有乙個叫gimpel lint的靜態**檢查工具,據說比較好用
不過要化$的。
參考:
Debug與Release的不同
i.記憶體分配問題 1.變數未初始化。為debug中會自動給變數初始化found false,而在release版中 則不會。所以盡可能的給變數 類或結構初始化。2.資料溢位的問題 如 char buffer 10 int counter lstrcpy buffer,abcdefghik 在deb...
VC下關於debug和release的區別的討論
vc下關於debug和release的區別的討論 網上總結 2008 09 17 02 30 p.m.最近寫 過程中,發現 debug 下執行正常,release 下就會出現問題,百思不得其解,而release 下又無法進行除錯,於是只能採用printf方式逐步定位到問題所在處,才發現原來是給定的乙...
專案發布Debug和Release版的區別
一 debug和release的區別 debug 除錯版本,包含除錯資訊,所以容量比release大很多,並且不進行任何優化 優化會使除錯複雜化,因為源 和生成的指令間關係會更複雜 便於程式設計師除錯。debug模式下生成兩個檔案,除了.exe或.dll檔案外,還有乙個.pdb檔案,該檔案記錄了 中...