細說Debug和Release區別

2021-09-07 03:25:43 字數 2635 閱讀 1879

vc下debug和release區別

最近寫**過程中,發現 debug 下執行正常,release 下就會出現問題,百思不得其解,而release 下又無法進行除錯,於是只能採用printf方式逐步定位到問題所在處,才發現原來是給定的乙個陣列未初始化,導致後面處理異常。網上查詢了些資料,在這 羅列彙總下,做為備忘~

一、debug 和 release 的區別

debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。release 稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好地使用。

debug 和 release 的真正區別,在於一組編譯選項。

debug 版本

引數 含義

/mdd /mld 或 /mtd 使用 debug runtime library(除錯版本的執行時刻函式庫)

/od 關閉優化開關

/d "_debug" 相當於 #define _debug,開啟編譯除錯**開關(主要針對assert函式)

/zi

建立 edit and continue(編輯繼續)資料庫,這樣在除錯過程中如果修改了源**不需重新編譯

gz 可以幫助捕獲記憶體錯誤

release 版本 引數含義

/md /ml 或 /mt 使用發布版本的執行時刻函式庫

/o1 或 /o2 優化開關,使程式最小或最快

/d "ndebug" 關閉條件編譯除錯**開關(即不編譯assert函式)

/gf 合併重複的字串,並將字串常量放到唯讀記憶體,防止被修改

debug 和 release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。

相關經驗: **

1. 變數。

大家都知道,debug跟release在初始化變數時所做的操作是不同的,debug是將每個位元組位都賦成0xcc(注1),而release的賦值近 似於隨機(我想是直接從記憶體中分配的,沒有初始化過)。這樣就明確了,如果你的程式中的某個變數沒被初始化就被引用,就很有可能出現異常:用作控制變數將 導致流程導向不一致;用作陣列下標將會使程式崩潰;更加可能是造成其他變數的不準確而引起其他的錯誤。所以在宣告變數後馬上對其初始化乙個預設的值是最簡 單有效的辦法,否則專案大了你找都沒地方找。**存在錯誤在debug方式下可能會忽略而不被察覺到,如debug方式下陣列越界也大多不會出錯,在 release中就暴露出來了,這個找起來就比較難了:( 還是自己多加注意吧

呵呵,就是我犯的問題~~

2. 自定義訊息的訊息引數。

mfc為我們提供了很好的訊息機制,更增加了自定義訊息,好處我就不用多說了。這也存在debug跟release的問題嗎?答案是肯定的。在自定義訊息 的函式體宣告時,時常會看到這樣的寫法:afx_msg lresult onmessageown(); debug情況下一般不會有任何問題,而當你在release下且多執行緒或程序間使用了訊息傳遞時就會導致無效控制代碼之類的錯誤。導致這個錯誤直接原因是消 息體的引數沒有新增,即應該寫成:afx_msg lresult onmessageown(wparam wparam, lparam lparam); (注2)

3. release模式下不出錯,但debug模式下報錯。

這種情況下大多也是因為**書寫不正確引起的,檢視mfc的原始碼,可以發現好多assert的語句(斷言),這個巨集只是在debug模式下才有效,那麼就 清楚了,release版不報錯是忽略了錯誤而不是沒有錯誤,這可能存在很大的隱患,因為是debug模式下,比較方便除錯,好好的檢查自己的**,再此 就不多說了。

4. assert, verify, trace..........除錯巨集

這種情況很容易解釋。舉個例子:請在vc下輸入assert然後選中按f12跳到巨集定義的地方,這裡你就能夠發現debug中assert要執行 afxassertfailedline,而release下的巨集定義卻為"#define assert(f) ((void)0)"。所以注意在這些除錯巨集的語句不要用程式相關變數如i++寫操作的語句。verify是個例外,"#define verify(f) ((void)(f))",即執行,這裡的作用就不多追究了,有興趣可自己研究:)。

1. 此外對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"優化選項並未被完全支援,因此這將會引起記憶體錯誤並導致程式崩潰。

2. 有 乙個程式debugview,用來捕捉outputdebugstring的輸出,執行起來後(估計是自設為system debugger)就可以**所有程式的outputdebugstring的輸出。此後,你可以脫離vc來執行你的程式並**除錯資訊。

3. 有乙個叫gimpel lint的靜態**檢查工具,據說比較好用 不過要化$的。

DEBUG和RELEASE 的區別

debug和release 版本差異及除錯相關問題 記憶體分配問題 1.變數未初始化。下面的程式在debug中執行的很好。thing search thing something bool found for int i 0 i whatever.getsize i found it if foun...

debug和release版本對比

debug和release,在我看來主要是針對其面向的目標不同的而進行區分的 debug通常稱為除錯版本,通過一系列編譯選項的配合,編譯的結果通常包含除錯資訊,而且不做任何優化,以為開發人員提供強大的應用程式除錯能力。release通常稱為發布版本,是為使用者使用的,一般客戶不允許在發布版本上進行除...

Debug和Release之區別

debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程 序。release 稱為發布版本,它往往是進行了各種優化,使得程式在 大小和執行速度 上都是最優的,以便使用者很好地使用。debug 模式下會將很多除錯資訊新增到程式中,而release模式下不會有,速度有一定變化...