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