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