vs中debug和release版本的區別

2021-09-14 01:24:02 字數 2099 閱讀 9971

vs中的程式有debug和release兩個版本,debug通常稱為除錯版本,通過一系列編譯選項的配合,編譯的結果通常包含除錯資訊,而且不做任何優化,以為開發 人員提供強大的應用程式除錯能力。而release通常稱為發布版本,是為使用者使用的,一般客戶不允許在發布版本上進行除錯。所以不儲存除錯信 息,同時,它往往進行了各種優化,以期達到**最小和速度最優。為使用者的使用提供便利。

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

只有debug版的程式才能設定斷點、單步執行、使用 trace/assert等除錯輸出語句。release不包含任何除錯資訊,所以體積小、執行速度快。

一、debug和release的區別

debug:除錯版本,包含除錯資訊,所以容量比release大很多,並且不進行任何優化(優化會使除錯複雜化,因為源**和生成的指令間關係會更複雜),便於程式設計師除錯。debug模式下生成兩個檔案,除了.exe或.dll檔案外,還有乙個.pdb檔案,該檔案記錄了**中斷點等除錯資訊

release:發布版本,不對源**進行除錯,編譯時對應用程式的速度進行優化,使得程式在**大小和執行速度上都是最優的。(除錯資訊可在單獨的pdb檔案中生成)。release模式下生成乙個檔案.exe或.dll檔案

二、obj資料夾的作用

obj目錄中也有debug和release兩個子目錄,obj目錄是專案生成dll的源目錄,然後將生成好的dll複製到bin目錄下。obj用於存放編譯過程中生成的中間臨時檔案。在.net中,編譯時分模組進行的,每個模組的編譯結果都儲存在obj目錄下,最後會合併為乙個.exe或則.dll檔案儲存到bin目錄下。

因為每次編譯都是增量編譯,也就是只重新編譯改變了的模組,所以這個obj目錄的作用就是儲存這些小塊的編譯結果,加快編譯速度。

三、debug 和 release 編譯方式的本質區別

debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何優化,便於程式設計師除錯程式。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 並沒有本質的界限,他們只是一組編譯選項的集合,編譯

器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優化過的調

試版本或是帶跟蹤語句的發布版本。

四、附錄:

dll的災難 :如果你的程式使用你自己的dll時請注意:

不能將debug和release版的dll混合在一起使用。debug都是debug版,release版都是release版。

解決辦法是將debug和release的程式分別放在主程式的debug和release目錄下

vc中debug版程式正常但release版崩潰

i.記憶體分配問題 1.變數未初始化。為debug中會自動給變數初始化found false,而在release版中 則不會。所以盡可能的給變數 類或結構初始化。2.資料溢位的問題 如 char buffer 10 int counter lstrcpy buffer,abcdefghik 在deb...

VS中Debug 選單中的選單命令和功能

debug 選單中的選單命令和功能 選單命令 快捷鍵功能 gof5 開始或繼續除錯程式,到某個斷點,程式的結束或需要使用者輸入的地方停止 restart ctrl shift f5 重新開始執行程式,並處於除錯狀態 stop debugging shift f5 終止程式的除錯,放回到程式編輯的狀態...

AQS中的acquire方法release方法

aqs中的acquire方法解釋,首先呼叫 tryacquire方法判斷當前執行緒是否拿到鎖,沒有拿到的話執行addwaiter方法把失敗的這個執行緒打包成乙個節點,通過迴圈cas機制強行加入到佇列的尾部,該方法的返回值會返回這個節點,再打包交給acquirequeued方法,acquirequeu...