Debug和Release的區別

2021-09-18 06:46:38 字數 1323 閱讀 1641

​許多ide裡面都會存在debug和release兩種模式,我們知道debug是除錯模式,可以設定斷點,觀察變數的值來進行查詢問題,那release模式和debug模式有什麼區別呢,讓我們深入了解一下。

​ debug可以稱為除錯版本,它包含除錯資訊,對**不作任何優化,便於程式設計師除錯程式。release稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優方案,所以在規則的檢查上面也更加嚴格。

​我在開發過程中總是遇到debug成功,轉化成release版本就有問題,以下是問題的分析總結。

thing *

search

(thing * something)

if(found)

return whatever[i]

;else

return

null

;

​上面的程式在debug模式中執行的很好,而在release中卻不行,是因為debug會自動給變數found初始化為false,而在release中則不會,所以要盡可能的給變數或者結構體初始化。

char buffer[10]

;int counter;

strcpy

(buffer,

"abcdefghik"

);

​debug模式下, 記憶體中的變數位址和定義的順序相同,變數開始位址都是模式位址。先定義的變數在記憶體高位址,後定義的變數在記憶體低位址 。

​release模式下, 經過優化, 變數的記憶體位址和變數定義的順序不相同! 如果變數有越界訪問的情況, release模式下的越界訪問情況未知。好像有一些規律, 依賴於編譯器的優化選項,依賴變數越界訪問達成變數的訪問, 在release模式下會和debug模式下的執行效果不相同。

​再看上面的**,在debug模式中,counter會儲存在buffer的後面,在進行strcpy時,因為多出了乙個\0,所以\0會儲存在counter的高八位,只要counter的值不大於8位,就沒有影響。如果發生在release模式中,編譯器可能會因為優化把counter儲存在暫存器中,這就導致buffer後面記憶體未知,可能是乙個函式的入口位址,這樣strcpy的話就會破壞函式的位址,發生access error

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

vs中debug和release版本的區別

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