本篇會來釐清 Visual Studio 中的 Debug & Release Mode,以及其相關設定。
其實兩者並無本質上的界線,他們只是一組編譯選項的標籤,編譯器只會按照選項上的設定來執行。也就是說,兩者僅是不同設定的編譯器設定檔。
Debug Mode
通常稱為測試/偵錯模式,在此模式下編譯時,程式並不會做任何優化,且附加很多測試資料,因此執行效率較慢、檔案大小較大,但會便於開發者開發與除錯。
Release Mode
通常稱為發布模式,由於是要給使用者使用,所以在此模式編譯後,程式會做各種優化,因此執行效率較佳、檔案大小較小。
Release 版本的 exe 檔,連結的目標是標準的 MFC (Microsoft Foundation Library) dll,這些在安裝 Windows 時就已經會安裝上去了(位於 Windows 的 System 或 System32 資料夾底下),所以Release 版本可以在沒有安裝 VC++ 的電腦上執行。反之,Debug 版本則是調用測試版本的 dll(在 VS 環境安裝時會裝上,如VC++),所以 Debug 版本在沒有安裝 VC++ 的電腦上就不能執行,除非手動 copy 所需用到的 dll,但這樣太麻煩了。
而在 Release Mode 中不能做一些 Debug 的行為,如設中斷點後,開始偵錯,而後編輯再繼續。如嘗試這麼做的話,會跳錯,如下圖所示:
Debug & Release 參數定義
Debug 版本
參數 | 定義 |
---|---|
/MDd /MLd 或 /MTd | 使用 Debug runtime library(測試版本的執行時函式庫)。 |
/Od | 關閉優化開關。 |
/D “_DEBUG” | 相當於 #define _DEBUG,打開編譯測試程式開關(主要針對 assert 函式)。 |
/ZI | 創建 Edit and continue(編輯繼續)資料庫,在測試過程中如果修改了程式碼不需重新編譯。 |
/GZ | 可以幫助捕獲記憶體的錯誤。 |
/Gm | 打開最小化重 link 開關,減少 link 時間。 |
Release 版本
參數 | 定義 |
---|---|
/MD /ML 或 /MT | 使用 Release runtime library(發布版本的執行時函式庫)。 |
/O1 或 /O2 | 優化開關,使程式最小或最快。 |
/D “NDEBUG” | 關閉條件編譯測試程式開關(即不編譯 assert 函式)。 |
/GF | 合併重複的字串,並將字串常量放到 ROM,防止被修改。 |
參考資料
- Microsoft 官方文件:https://docs.microsoft.com/zh-tw/visualstudio/debugger/how-to-set-debug-and-release-configurations?view=vs-2019
- https://stackoverflow.com/questions/933739/what-is-the-difference-between-release-and-debug-modes-in-visual-studio/938665
- http://johnniebooks.blogspot.com/2009/05/debug-release.html