C語(yǔ)言中用ASSERT調(diào)試的八大技巧_第1頁(yè)
C語(yǔ)言中用ASSERT調(diào)試的八大技巧_第2頁(yè)
C語(yǔ)言中用ASSERT調(diào)試的八大技巧_第3頁(yè)
C語(yǔ)言中用ASSERT調(diào)試的八大技巧_第4頁(yè)
C語(yǔ)言中用ASSERT調(diào)試的八大技巧_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本文格式為Word版,下載可任意編輯——C語(yǔ)言中用ASSERT調(diào)試的八大技巧C語(yǔ)言中用ASSERT調(diào)試的八大技巧

assert宏的原型定義在中,其作用是假設(shè)它的條件返回錯(cuò)誤,那么終止程序執(zhí)行。下面是我為大家整理的C語(yǔ)言中用ASSERT調(diào)試的八大技巧,接待參考~

技巧1:記住ASSERT的定義

對(duì)大量開(kāi)發(fā)人員來(lái)說(shuō),斷言是一個(gè)令人困惑的話(huà)題,由于它們的大量使用方式與其設(shè)計(jì)初衷背道而馳。我見(jiàn)到的最明顯的斷言定義是這樣的:

“斷言是在程序某個(gè)特定點(diǎn)的一個(gè)布爾表達(dá)式,除非程序中有缺陷Bug,否那么它的值將為真?!?/p>

想要理解上述斷言定義的開(kāi)發(fā)人員理應(yīng)留意下面三個(gè)要點(diǎn):

·斷言會(huì)評(píng)估一個(gè)表達(dá)式是真還是假

·斷言是在代碼中的某個(gè)點(diǎn)對(duì)系統(tǒng)狀態(tài)的一種假設(shè)

·斷言會(huì)驗(yàn)證系統(tǒng)假設(shè),假設(shè)不為真,就說(shuō)明代碼中有一個(gè)缺陷

技巧2:使用ASSERT驗(yàn)證函數(shù)的先決條件

斷言分外適合契約式設(shè)計(jì)環(huán)境,在這種環(huán)境中,開(kāi)發(fā)人員分外明顯地定義了某個(gè)函數(shù)的先決條件。斷言可以用來(lái)檢查該函數(shù)的輸入是否得志先決條件。就拿圖1所示的代碼片段為例:

圖1:函數(shù)的先決條件

函數(shù)的STate輸入理應(yīng)在定義的系統(tǒng)狀態(tài)范圍內(nèi)。假設(shè)State不是有效的狀態(tài)值,那么它就不是錯(cuò)誤,而是缺陷!斷言可以用來(lái)驗(yàn)證State是有效的假設(shè),如圖2所示:

圖2:對(duì)函數(shù)先決條件應(yīng)用斷言

在State不小于最大值的事情中,斷言表達(dá)式將被評(píng)估為假,程序于是將中斷執(zhí)行。中斷程序執(zhí)行可以讓開(kāi)發(fā)人員很輕易連忙看到哪里的代碼出錯(cuò),而不是過(guò)段時(shí)間以后才知道。

技巧3:使用ASSERT驗(yàn)證函數(shù)的后置條件

斷言也能用來(lái)驗(yàn)證契約式設(shè)計(jì)環(huán)境中對(duì)某個(gè)函數(shù)輸出的假設(shè)。例如,假設(shè)前面定義的System_StateSet函數(shù)返回SystemState變量,開(kāi)發(fā)人員可以預(yù)計(jì)它也在期望的范圍之內(nèi)。斷言可以用來(lái)對(duì)缺陷舉行監(jiān)視,如圖3所示。

圖3:對(duì)函數(shù)后置條件應(yīng)用斷言

開(kāi)發(fā)人員在查看上述代碼后可能會(huì)感到這些檢查毫無(wú)意義。剛方才設(shè)置好的SystemState怎么就會(huì)展現(xiàn)大于SYSTEM_STATE_MAX的值呢?答案是這切實(shí)不理應(yīng)展現(xiàn),然而有時(shí)候會(huì)莫名其妙地發(fā)生變更,可能是通過(guò)中斷或并行線(xiàn)程,此時(shí)斷言可以立刻標(biāo)志出這個(gè)缺陷。

技巧4:不要把ASSERT用于錯(cuò)誤處理

在記住斷言定義之后,開(kāi)發(fā)人員理應(yīng)切記:斷言是用于檢測(cè)缺陷的,不能用于錯(cuò)誤處理。錯(cuò)誤處理是設(shè)計(jì)用于響應(yīng)錯(cuò)誤的用戶(hù)輸入和意外的事情依次的軟件。錯(cuò)誤在系統(tǒng)中預(yù)料是會(huì)發(fā)生的,但僅僅是由于有無(wú)效的輸入而并不意味著代碼中有缺陷。錯(cuò)誤處理理應(yīng)與缺陷探索分開(kāi)來(lái)。錯(cuò)誤使用斷言的一個(gè)典型例子是,在試圖開(kāi)啟一個(gè)文件用于讀取時(shí)去檢查文件的指針,如圖4所示。

圖4:ASSERT的不當(dāng)使用

讀者可以領(lǐng)會(huì)地看到,試圖開(kāi)啟文件的結(jié)果與文件系統(tǒng)的狀態(tài)和用戶(hù)數(shù)據(jù)有關(guān),而與代碼中的缺陷一點(diǎn)關(guān)系也沒(méi)有。開(kāi)發(fā)人員理應(yīng)編寫(xiě)錯(cuò)誤處理程序,而不是用斷言,以便在文件不存在時(shí),錯(cuò)誤處理程序可以用一些默認(rèn)可用數(shù)據(jù)來(lái)創(chuàng)造它,以便后續(xù)代碼持續(xù)操作。

技巧5:ASSERT僅對(duì)開(kāi)發(fā)有意義,不能用于生產(chǎn)

開(kāi)發(fā)ASSERT宏的原始意圖是在開(kāi)發(fā)過(guò)程中啟用它,在后面生產(chǎn)時(shí)要禁用??梢杂肗DEBUG宏激活和禁用ASSERT。正切實(shí)施的斷言在被禁用后理應(yīng)對(duì)嵌入式系統(tǒng)根本沒(méi)有影響。

問(wèn)題是,假設(shè)測(cè)試是在斷言啟用的處境下舉行的為了抓獲任何缺陷,理應(yīng)這樣做,那么現(xiàn)在禁用斷言將導(dǎo)致交付的產(chǎn)品與測(cè)試的產(chǎn)品處于不同的狀態(tài)。斷言切實(shí)會(huì)占用一些代碼空間,但更重要的是,它們需要占用少量的時(shí)鐘周期來(lái)評(píng)估它們的布爾表達(dá)式。禁用ASSERT可能對(duì)具有有限資源的裸機(jī)系統(tǒng)的執(zhí)行時(shí)序產(chǎn)生很大影響,從而導(dǎo)致在生產(chǎn)系統(tǒng)中產(chǎn)生新的缺陷。開(kāi)發(fā)團(tuán)隊(duì)需要判斷是否值得冒關(guān)閉斷言的風(fēng)險(xiǎn)。

一種替代方案是留存斷言在激活狀態(tài),而將它們的輸出重定向到一個(gè)系統(tǒng)日志。這樣可以確保任何揮之不去的缺陷很輕易被識(shí)別,而且能制止中止系統(tǒng)的運(yùn)行,而中止系統(tǒng)可不是明智之舉。

技巧6:不允許斷言有副作用

ASSERT的默認(rèn)實(shí)現(xiàn)允許開(kāi)發(fā)人員包含一段可執(zhí)行代碼作為布爾表達(dá)式的一片面。舉例來(lái)說(shuō),一個(gè)狀態(tài)變量可以被實(shí)現(xiàn)為表達(dá)式的一片面并傳遞給ASSERT。但假設(shè)傳遞給ASSERT的`表達(dá)式有副作用,也就是說(shuō),它會(huì)變更嵌入式系統(tǒng)的狀態(tài),那么禁用斷言將變更系統(tǒng)的行為。開(kāi)發(fā)人員理應(yīng)確保他們的表達(dá)式?jīng)]有副作用,否那么他們需要冒險(xiǎn)在系統(tǒng)中增加只針對(duì)產(chǎn)品代碼喚醒的休眠時(shí)間缺陷。

技巧7:斷言理應(yīng)占代碼的1%至3%

每個(gè)開(kāi)發(fā)人員對(duì)于代碼庫(kù)CodeBase中理應(yīng)有多少個(gè)斷言都有自己的主見(jiàn)。大家一致同意的一個(gè)數(shù)字是,代碼庫(kù)中的斷言占比理應(yīng)大于0。斷言為開(kāi)發(fā)人員供給了一種在代碼庫(kù)中發(fā)生缺陷的時(shí)刻察覺(jué)它的好方法。調(diào)試是在開(kāi)發(fā)嵌入式系統(tǒng)中最濫用時(shí)間并令人頹唐的事情之一。不管開(kāi)發(fā)人員認(rèn)可的占比是1%、3%還是5%,使用斷言斷定對(duì)你有利,并會(huì)使開(kāi)發(fā)嵌入式軟件變得多少有些趣味。

技巧8:將斷言用作可執(zhí)行代碼解釋

斷言可以生成極好的解釋?zhuān)【帉?xiě)卓越的表達(dá)式可以切當(dāng)?shù)貓?bào)告開(kāi)發(fā)人員在代碼的某個(gè)給定點(diǎn)理應(yīng)預(yù)料發(fā)生什么事情。開(kāi)發(fā)人員理應(yīng)做好他們斷言的架構(gòu),扶助人們更領(lǐng)會(huì)地理解系統(tǒng)中發(fā)生的事情,進(jìn)而扶助裁減缺陷。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論