單片機的集成開發環境(IDE)大部分都支持多目標工程,比如:我們熟知的Keil、 IAR都可以創建多目標工程。 ? 為了方便開發者,一些IDE會默認創建 Release和Debug 兩個目標工程。 ? 今天就來講講瑞薩e2?studio集成開發環境Release和Debug的差異。
?
下面以RA6M4系列MCU為例,介紹其差異
在IDE e2?studio開發環境下,新建工程默認為debug版本
也可以右擊項目工程,切換到release版本
?
那么問題來了,debug和release版本有什么區別呢?
?
這個細節往往容易被忽視。在現場技術支持時也經常會發現,在沒有弄清楚區別的情況下,容易導致出現錯誤。
比如使用debug版本產生的bin文件提交測試。程序中有很多方便調試用的ASSERT()函數。此函數編譯時可能會包含文件夾絕對路徑信息,導致在不同的電腦上編譯后,產生bin文件不同。從而引起測試和生產程序管理的混亂。
01
Debug和Release版本有什么不同
Debug:Debug通常稱為調試版本。通過一系列編譯選項的配合,編譯的結果通常包含調試信息,而且不希望做優化,便于程序員調試程序。
Release:Release通常稱為發布版本。是為量產做準備的。一般客戶不允許在發布版本上進行調試。所以不保存調試信息,同時,它往往進行了各種優化,以期達到代碼最小和速度最優。
比如:release版本選擇optimization level: Optimize more(-O2)
比如:Debug版本選擇optimization level: Optimize for debug(-Og)
實際上,Debug和Release并沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到優化過的調試版本或是帶跟蹤語句的發布版本。
02
預處理
Debug版本通常會有“DEBUG”相關的預處理(宏定義)
_DEBUG與NDEBUG
如下圖,經常使用調試宏定義:
比如常見的printf(打印信息),會通過“DEBUG”調試信息打開/關閉打印輸出信息。
類似的,ASSERT斷言,也是通過宏定義來打開/關閉。
當定義了_DEBUG時,assert()函數會被編譯,而NDEBUG時不被編譯。
大多數斷言都只在Debug版中才會被編譯,而在Release版中被忽略。唯一的例外是VERIFY()。事實上,這些宏都是調用assert()函數,只不過附加了一些與庫有關的調試代碼。如果你在這些宏中加入了任何程序代碼,而不只是布爾表達式(例如賦值、能改變變量值的函數調用等),那么 Release 版都不會執行這些操作,從而造成錯誤。
調試后,可以通過在包含#include的語句之前插入#define ndebug來禁用斷言調用。
03
怎樣"調試" Release版的程序
遇到Debug成功但Release失敗,顯然是一件很沮喪的事,而且往往無從下手。如果你看了以上的分析,結合錯誤的具體表現,很快找出了錯誤,固然很好。但如果一時找不出,以下給出了一些策略:
前面已經提過,Debug和Release只是一組編譯選項的差別,本質上很難區分差別。我們可以修改Release版的編譯選項來縮小錯誤范圍。如上所述,可以把Release的選項逐個改為與之相對的Debug選項,或運行時間優化改為程序大小優化。
審核編輯:黃飛
?
評論
查看更多