斷言調(diào)試(Assertive debugging )是利用自帶代碼對程序進行監(jiān)控并能確保嵌入式系統(tǒng)性能的新型調(diào)試方法。
調(diào)試是一門有待進一步深入研究的“藝術(shù)”……最有效的調(diào)試技術(shù)是那些在程序本身基礎(chǔ)上設(shè)計并構(gòu)建的技術(shù),F(xiàn)在,許多最優(yōu)秀程序員都利用近一半的程序?qū)α硪话氤绦蜻M行調(diào)試;而用于調(diào)試的這一半程序最終將完全被摒棄。出人意料的是,這最終竟也能提高生產(chǎn)效率。 —節(jié)選自Donald Knuth的《計算機編程藝術(shù)(The Art of Computer Programming)》。
正如Don Knuth所述,調(diào)試經(jīng)常被我們嚴(yán)重忽視,而我們也因此付出了慘重的代價。近半個世紀(jì)以來,我們在調(diào)試領(lǐng)域取得的成就微乎其微,結(jié)果因軟件程序故障而陷入困境的項目比比皆是。因調(diào)試而浪費的時間和資源,在商業(yè)項目中,成本可能高達數(shù)十億美元;在軍事項目中,損失的不僅是金錢,甚至包括生命。這種現(xiàn)狀簡直讓人無法忍受:我們必須探尋新的方法和途徑。本文就提出了這樣一種新方法。
本文提出的新型軟件調(diào)試系統(tǒng)“斷言調(diào)試系統(tǒng)(ADS)”可以將調(diào)試由次要的“藝術(shù)形式”提升為現(xiàn)代工業(yè)流程。ADS雖然利用了既有的思想,即John von Neumann于1947年首先提出的“斷言”理論,但據(jù)我所知,ADS處理斷言的方式卻是Neumann或任何其他人從未提出的新方式:ADS更系統(tǒng)也更徹底地利用斷言,而不像其他工具只在程序員想到的時候才使用。為此,ADS將斷言由半個世紀(jì)以來一直漂浮不定且鮮有建樹的理論轉(zhuǎn)化為足以引領(lǐng)程序開發(fā)革命的技術(shù)。與Knuth的論述不同,ADS并不摒棄那部分用于調(diào)試的程序,而是將其作為程序主體補充的文檔進行保存,這樣,當(dāng)程序需要修改時完全可以加以復(fù)用。
程序故障是主要的瓶頸
現(xiàn)在幾乎不可能找到完全不需要編程運算的科學(xué)或工程項目,同樣地,也很難找到不因程序故障原因而無法預(yù)期交付的軟件。調(diào)試問題對幾乎所有的項目都至關(guān)重要,而因軟件程序故障帶來教訓(xùn)也足夠深刻:當(dāng)客戶對產(chǎn)品不滿意時,我們會喪失業(yè)務(wù);當(dāng)產(chǎn)品遲遲無法推向市場時,我們的銷售額會下降。隨著我們在關(guān)鍵應(yīng)用中越來越頻繁地使用計算機,我們的教訓(xùn)也越來越慘重,這不僅關(guān)乎任務(wù)完成,甚至性命攸關(guān)。
在這些關(guān)鍵應(yīng)用中,慎重地選擇調(diào)試方法并加以證明變得越來越重要,甚至成為法律需要。對于那些高度依賴調(diào)試的應(yīng)用而言,一半程序完全用于調(diào)試已日益無法忍受。ADS方法在編程的同時就能直接觸及這些問題:這有助于開發(fā)人員縮短調(diào)試進程并支持軟件對象的系統(tǒng)級和存檔級調(diào)試。本文極力主張采用該方法,這或許有助于防止陷入困境。
調(diào)試的現(xiàn)狀
調(diào)試發(fā)展歷程中最值得關(guān)注的是,現(xiàn)代調(diào)試技術(shù)居然與半個世紀(jì)前剛剛進入現(xiàn)代計算時代時沒有太大區(qū)別。我們?nèi)匀蛔尮收铣绦蜻\行至預(yù)測的關(guān)鍵點,然后停止運行并查看關(guān)鍵變量的狀態(tài)。只要其中一個關(guān)鍵變量的值與預(yù)期的不同,我們就會努力分析為什么會造成這種結(jié)果。如果不知道什么地方出錯,我們會重復(fù)執(zhí)行這個過程,在程序更早的地方停下來。經(jīng)過若干次反復(fù),我們就能在充分接近程序故障的地方停下來,結(jié)果發(fā)現(xiàn),故障的原因是:我們忘了重置某個計數(shù)器或清空某段內(nèi)存、從而使某些數(shù)據(jù)結(jié)構(gòu)產(chǎn)生溢出或犯了其他6種經(jīng)典編程錯誤中的任意一種。