資源描述:
《visualstudio中的debug和release版本的區(qū)別》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、VisualStudio中的debug和release版本的區(qū)別Debug通常稱為調(diào)試版本,它包含調(diào)試信息,并且不作任何優(yōu)化,便于程序員調(diào)試程序。Release稱為發(fā)布版本,它往往是進行了各種優(yōu)化,使得程序在代碼大小和運行速度上都是最優(yōu)的,以便用戶很好地使用。Debug和Release的真正秘密,在于一組編譯選項。下面列出了分別針對二者的選項(當然除此之外還有其他一些,如/Fd/Fo,但區(qū)別并不重要,通常他們也不會引起Release版錯誤,在此不討論)Debug版本參數(shù)含義?/MDd/MLd或/MTd使用Debugruntimeli
2、brary(調(diào)試版本的運行時刻函數(shù)庫)?/Od關(guān)閉優(yōu)化開關(guān)?/D"_DEBUG"相當于#define_DEBUG,打開編譯調(diào)試代碼開關(guān)(主要針對assert函數(shù))?/ZI創(chuàng)建Editandcontinue(編輯繼續(xù))數(shù)據(jù)庫,這樣在調(diào)試過程中如果修改了源代碼不需重新編譯?/GZ可以幫助捕獲內(nèi)存錯誤?/Gm打開最小化重鏈接開關(guān),減少鏈接時間??Release版本參數(shù)含義?/MD/ML或/MT使用發(fā)布版本的運行時刻函數(shù)庫?/O1或/O2優(yōu)化開關(guān),使程序最小或最快?/D"NDEBUG"關(guān)閉條件編譯調(diào)試代碼開關(guān)(即不編譯assert函數(shù))?/
3、GF合并重復的字符串,并將字符串常量放到只讀內(nèi)存,防止被修改??實際上,Debug和Release并沒有本質(zhì)的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優(yōu)化過的調(diào)試版本或是帶跟蹤語句的發(fā)布版本。?哪些情況下Release版會出錯?有了上面的介紹,我們再來逐個對照這些選項看看Release版錯誤是怎樣產(chǎn)生的?1、RuntimeLibrary:鏈接哪種運行時刻函數(shù)庫通常只對程序的性能產(chǎn)生影響。調(diào)試版本的RuntimeLibrary包含了調(diào)試信息,并采用了一些保護機制以幫助發(fā)
4、現(xiàn)錯誤,因此性能不如發(fā)布版本。編譯器提供的RuntimeLibrary通常很穩(wěn)定,不會造成Release版錯誤;倒是由于Debug的RuntimeLibrary加強了對錯誤的檢測,如堆內(nèi)存分配,有時會出現(xiàn)Debug有錯但Release正常的現(xiàn)象。應(yīng)當指出的是,如果Debug有錯,即使Release正常,程序肯定是有Bug的,只不過可能是Release版的某次運行沒有表現(xiàn)出來而已。?2、優(yōu)化:這是造成錯誤的主要原因,因為關(guān)閉優(yōu)化時源程序基本上是直接翻譯的,而打開優(yōu)化后編譯器會作出一系列假設(shè)。這類錯誤主要有以下幾種:?1.幀指針(Fra
5、mePointer)省略(簡稱FPO):在函數(shù)調(diào)用過程中,所有調(diào)用信息(返回地址、參數(shù))以及自動變量都是放在棧中的。若函數(shù)的聲明與實現(xiàn)不同(參數(shù)、返回值、調(diào)用方式),就會產(chǎn)生錯誤,但Debug方式下,棧的訪問通過EBP寄存器保存的地址實現(xiàn),如果沒有發(fā)生數(shù)組越界之類的錯誤(或是越界“不多”),函數(shù)通常能正常執(zhí)行;Release方式下,優(yōu)化會省略EBP?;分羔?,這樣通過一個全局指針訪問棧就會造成返回地址錯誤是程序崩潰。?7C++的強類型特性能檢查出大多數(shù)這樣的錯誤,但如果用了強制類型轉(zhuǎn)換,就不行了。你可以在Release版本中強制加入
6、/Oy-編譯選項來關(guān)掉幀指針省略,以確定是否此類錯誤。此類錯誤通常有:MFC消息響應(yīng)函數(shù)書寫錯誤。正確的應(yīng)為:afx_msgLRESULTOnMessageOwn(WPARAMwparam,LPARAMlparam);?ON_MESSAGE宏包含強制類型轉(zhuǎn)換。防止這種錯誤的方法之一是重定義ON_MESSAGE宏,把下列代碼加到stdafx.h中(在#include"afxwin.h"之后),函數(shù)原形錯誤時編譯會報錯。#undefON_MESSAGE#defineON_MESSAGE(message,memberFxn){messa
7、ge,0,0,0,AfxSig_lwl,(AFX_PMSG)(AFX_PMSGW)(static_cast(&memberFxn)},2.volatile型變量:volatile告訴編譯器該變量可能被程序之外的未知方式修改(如系統(tǒng)、其他進程和線程)。優(yōu)化程序為了使程序性能提高,常把一些變量放在寄存器中(類似于register關(guān)鍵字),而其他進程只能對該變量所在的內(nèi)存進行修改,而寄存器中的值沒變。?如果你的程序是多線程的,或者你發(fā)現(xiàn)某個變量的
8、值與預期的不符而你確信已正確的設(shè)置了,則很可能遇到這樣的問題。這種錯誤有時會表現(xiàn)為程序在最快優(yōu)化出錯而最小優(yōu)化正常。把你認為可疑的變量加上volatile試試。3.變量優(yōu)化:優(yōu)化程序會根據(jù)變量的使用情況優(yōu)化變量。例如,函數(shù)中有一個未被