Debug與Release的區別

2022-06-02 15:18:22 字數 2797 閱讀 1292

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檔案,該檔案記錄了 中...