嵌入式軟件的發(fā)展
第一階段:早期的嵌入式系統(tǒng)設(shè)計(jì)方法,通常是采用“硬件優(yōu)先”原則。即在只粗略估計(jì)軟件任務(wù)需求的情況下,首先進(jìn)行硬件設(shè)計(jì)與實(shí)現(xiàn)。然后,在此硬件平臺(tái)之上,再進(jìn)行軟件設(shè)計(jì)。因而很難達(dá)到充分利用硬件軟件資源,取得最佳性能的效果。同時(shí),一旦在測(cè)試時(shí)發(fā)現(xiàn)問(wèn)題,需要對(duì)設(shè)計(jì)進(jìn)行修改時(shí),整個(gè)設(shè)計(jì)流程將重新進(jìn)行,對(duì)成本和設(shè)計(jì)周期的影響很大。這種傳統(tǒng)的設(shè)計(jì)方法只能改善硬件/軟件各自的性能,在有限的設(shè)計(jì)空間不可能對(duì)系統(tǒng)做出較好的性能綜合優(yōu)化,在很大程度上依賴于設(shè)計(jì)者的經(jīng)驗(yàn)和反復(fù)實(shí)驗(yàn)。
第二階段:90年代以來(lái)隨著電子系統(tǒng)功能的日益強(qiáng)大和微型化,系統(tǒng)設(shè)計(jì)所涉及的問(wèn)題越來(lái)越多,難度也越來(lái)越大。同時(shí)硬件和軟件也不再是截然分開的兩個(gè)概念,而是緊密結(jié)合、相互影響的。因而出現(xiàn)了軟硬件協(xié)同(codesign)設(shè)計(jì)方法,即使用統(tǒng)一的方法和工具對(duì)軟硬件,協(xié)同設(shè)計(jì)軟硬件體系結(jié)構(gòu),以最大限度地挖掘系統(tǒng)軟硬件能力,避免由于獨(dú)立設(shè)計(jì)軟硬件體系結(jié)構(gòu)而帶來(lái)的種種弊病,得到高性能低代價(jià)的優(yōu)化設(shè)計(jì)方案。
嵌入式軟件的開發(fā)流程
在嵌入式系統(tǒng)的開發(fā)過(guò)程中,一般采用的方法是現(xiàn)在通用PC機(jī)上編程;然后通過(guò)交叉編譯和鏈接,將程序做成目標(biāo)平臺(tái)上課運(yùn)行的二進(jìn)制代碼格式;最后將程序下載到目標(biāo)平臺(tái)上的特定位置,由目標(biāo)板上啟動(dòng)代碼運(yùn)行這段二進(jìn)制代碼,從而運(yùn)行起嵌入式系統(tǒng)。
嵌入式軟件開發(fā)的基本流程:整個(gè)過(guò)程中的部分工作在主機(jī)上完成的,另一部分工作在目標(biāo)板上完成。首先,是在主機(jī)上的編程工作。純粹使用匯編代碼編寫源代碼,除了編寫困難外,調(diào)試和維護(hù)困難也是匯編代碼的難題;而c語(yǔ)言可直接對(duì)硬件進(jìn)行操作,而且又有高級(jí)語(yǔ)言程序結(jié)構(gòu)化、容易移植等優(yōu)點(diǎn),因而嵌入式系統(tǒng)源代碼主要是由匯編語(yǔ)言和c語(yǔ)言混合編寫。源代碼編寫完成后容易保存為源文件,再用主機(jī)上建立的交叉編譯環(huán)境生成.obj文件,并且將.obj文件按照目標(biāo)板的要求鏈接成合適的.image文件。最后通過(guò)重定位機(jī)制和下載過(guò)程,將.image文件下載到目標(biāo)板上運(yùn)行。由于無(wú)法保證目標(biāo)板一次就可以運(yùn)行編譯、鏈接成功的程序,因此后期的調(diào)試排錯(cuò)工作就特別重要。調(diào)試只能在運(yùn)行態(tài)完成,因此在主機(jī)和目標(biāo)板之間通過(guò)連接,由主機(jī)控制目標(biāo)板上程序的運(yùn)行,可達(dá)到調(diào)試內(nèi)核或者嵌入式應(yīng)用程序的目的。
作為從事了5年之久的嵌入式軟件開發(fā),以下職責(zé)是必須要掌握的,嵌入式軟件工程師能根據(jù)項(xiàng)目管理和工程技術(shù)的實(shí)際要求,按照系統(tǒng)總體設(shè)計(jì)規(guī)格進(jìn)行軟、硬件實(shí)際,編寫系統(tǒng)開發(fā)規(guī)格說(shuō)明書等相應(yīng)的文檔;組織和指導(dǎo)嵌入式系統(tǒng)靠法實(shí)施人員實(shí)施硬件電路、編寫和調(diào)試程序,并對(duì)嵌入式系統(tǒng)硬件設(shè)備和程序進(jìn)行優(yōu)化和集成測(cè)試,開發(fā)出符合系統(tǒng)總體設(shè)計(jì)要求的高質(zhì)量嵌入式系統(tǒng);具有工程師的實(shí)際工作能力和業(yè)務(wù)水平。
同時(shí)在這樣一個(gè)技術(shù)日進(jìn)千里的時(shí)代中,嵌入式軟件開發(fā)工程師該干嘛,我給出大家列一個(gè)嵌入式軟件開發(fā)流程,對(duì)你一定有所幫助。
1.學(xué)習(xí)那些讓因特網(wǎng)實(shí)現(xiàn)的技術(shù),建議嵌入式工程師學(xué)習(xí)因特網(wǎng)有關(guān)的技術(shù),對(duì)職業(yè)生涯發(fā)展會(huì)有加分效果。
2.學(xué)習(xí)利用搜索引擎,不要閉門造車,要善用開放源碼世界的信息,很多常見的設(shè)計(jì)問(wèn)題其實(shí)透過(guò)因特網(wǎng)就能找到同領(lǐng)域菁英貢獻(xiàn)的程序代碼,與同領(lǐng)域的其他工程師們相互交流、互相幫助。
3.離開舒適圈,走出舒適圈,挑戰(zhàn)自我、去學(xué)習(xí)原本不熟悉的東西,包括工程以外的知識(shí)。
4.熟悉實(shí)時(shí)操作系統(tǒng),嵌入式工程師從一些較小型的系統(tǒng)著手,累積相關(guān)技術(shù)經(jīng)驗(yàn)。
5.培養(yǎng)多元化技能與系統(tǒng)觀,嘗試著去開發(fā)手機(jī)應(yīng)用程序、或者是學(xué)習(xí)后端服務(wù)器的相關(guān)技術(shù),能讓你開啟完全不同的觀點(diǎn),去熟悉開放性硬件,現(xiàn)在市面上有不少現(xiàn)成的開發(fā)板,能讓工程 師專注于學(xué)習(xí)獨(dú)特算法的開發(fā)。
6.了解軟件也要了解新的處理器,除了要深入了解C或C++等基本程序語(yǔ)言,有時(shí)也要認(rèn)識(shí)一些熱門的新程序語(yǔ)言以因應(yīng)特殊設(shè)計(jì)需求,但更重要的是了解新的處理器技術(shù);處理器才是嵌入式系統(tǒng)的本質(zhì)。
7.要能熟悉開放源碼軟件,建議工程師避免只專長(zhǎng)單一領(lǐng)域,因?yàn)槟强赡軙?huì)阻礙你的成長(zhǎng)。對(duì) 嵌入式工程師來(lái)說(shuō),確保自己對(duì)軟硬件技術(shù)都很了解,是非常寶貴的價(jià)值。
8.建立系統(tǒng)級(jí)的工程思維,嵌入式工程師擁有系統(tǒng)導(dǎo)向的思維是很重要的,此外每個(gè)嵌入式工程師都應(yīng)該具備優(yōu)良的項(xiàng)目管理技巧,力求準(zhǔn)時(shí)完成負(fù)責(zé)的項(xiàng)目。
9.要能明確表達(dá)自己的想法與意見透過(guò)文字或繪圖,無(wú)論是哪一種工程師,都需要能有效表達(dá)自己的想法與意見。
10.學(xué)習(xí)無(wú)線連結(jié)技術(shù),嵌入式工程師需要在接下來(lái)1—3年學(xué)習(xí)無(wú)線連結(jié)技術(shù),特別是Wi-Fi與藍(lán)牙低功耗;因?yàn)楝F(xiàn)在的嵌入式設(shè)備與使用者智能手機(jī)連結(jié)的主要方式。
嵌入式軟件的調(diào)試
在嵌入式軟件開發(fā)過(guò)程中,一般來(lái)說(shuō),花在測(cè)試和花在編碼的時(shí)間比為3:1(實(shí)際上可能更多)。這個(gè)比例隨著你的編程和測(cè)試水平的提高而不斷下降,但不論怎樣,軟件測(cè)試對(duì)一般人來(lái)講很重要。很多年前,一位開發(fā)人員為了對(duì)嵌入式有更深層次的理解,向Oracle詢問(wèn)了這樣的一個(gè)問(wèn)題:我怎么才能知道并懂得我的系統(tǒng)到底在干些什么呢? Oracle面對(duì)這個(gè)問(wèn)題有些吃驚,因?yàn)樵诋?dāng)時(shí)沒(méi)有人這么問(wèn)過(guò),而同時(shí)代的嵌入式開發(fā)人員問(wèn)的最多的大都圍繞“我怎么才能使程序跑的更快”、“什么編譯器最好”等膚淺的問(wèn)題。所以,面對(duì)這個(gè)不同尋常卻異乎成熟的問(wèn)題,Oracle感到欣喜并認(rèn)真回復(fù)了他:你的問(wèn)題很有深度很成熟,因?yàn)橹挥胁粩嗟厝ド钊肜斫獠庞锌赡懿粩嗟靥岣咚?。并且Oracle為了鼓勵(lì)這位執(zhí)著的程序員,把10條關(guān)于嵌入式軟件開發(fā)測(cè)試的秘訣告訴了他:
1.懂得使用工具
2.盡早發(fā)現(xiàn)內(nèi)存問(wèn)題
3.深入理解代碼優(yōu)化
4.不要讓自己大海撈針
5.重現(xiàn)并隔離問(wèn)題
6.以退為進(jìn)
7.確定測(cè)試的完整性
8.提高代碼質(zhì)量意味著節(jié)省時(shí)間
9.發(fā)現(xiàn)它,分析它,解決它
10.利用初學(xué)者的思維
這十條秘訣在業(yè)界廣為流傳,使很多人受益。本文圍繞這十條秘訣展開論述。
1.懂得使用工具
通常嵌入式系統(tǒng)對(duì)可靠性的要求比較高。嵌入式系統(tǒng)安全性的失效可能會(huì)導(dǎo)致災(zāi)難性的后果,即使是非安全性系統(tǒng),由于大批量生產(chǎn)也會(huì)導(dǎo)致嚴(yán)重的經(jīng)濟(jì)損失。這就要求對(duì)嵌入式系統(tǒng),包括嵌入式軟件進(jìn)行嚴(yán)格的測(cè)試、確認(rèn)和驗(yàn)證。隨著越來(lái)越多的領(lǐng)域使用軟件和微處理器控制各種嵌入式設(shè)備,對(duì)門益復(fù)雜的嵌入式軟件進(jìn)行快速有效的測(cè)試愈加顯得重要。
就象修車需要工具一樣,好的程序員應(yīng)該能夠熟練運(yùn)用各種軟件工具。不同的工具,有不同的使用范圍,有不同的功能。使用這些工具,你可以看到你的系統(tǒng)在干些什么,它又占用什么資源,它到底和哪些外界的東西打交道。讓你郁悶好幾天的問(wèn)題可能通過(guò)某個(gè)工具就能輕松搞定,可惜你就是不知道。那么為什么那么多的人總是在折騰個(gè)半死之后才想到要用測(cè)試工具呢?原因很多,主要有兩個(gè)。一個(gè)是害怕,另一個(gè)是惰性。害怕是因?yàn)榧尤霚y(cè)試用具或測(cè)試模塊到代碼需要技巧同時(shí)有可能引入新的錯(cuò)誤,所以他們總喜歡寄希望于通過(guò)不斷地修改重編譯代碼來(lái)消除bug,結(jié)果卻無(wú)濟(jì)于事。懶惰是因?yàn)樗麄兞?xí)慣了使用printf之類的簡(jiǎn)單測(cè)試手段。下面來(lái)介紹一些嵌入式常用的測(cè)試工具。
2.盡早發(fā)現(xiàn)內(nèi)存問(wèn)題
內(nèi)存問(wèn)題危害很大,不容易排查,主要有三種類型:內(nèi)存泄露、內(nèi)存碎片和內(nèi)存崩潰。對(duì)于內(nèi)存問(wèn)題態(tài)度必須要明確,那就是早發(fā)現(xiàn)早“治療”。在軟件設(shè)計(jì)中,內(nèi)存泄露的“名氣”最大,主要由于不斷分配的內(nèi)存無(wú)法及時(shí)地被釋放,久而久之,系統(tǒng)的內(nèi)存耗盡。即使細(xì)心的編程老手有時(shí)后也會(huì)遭遇內(nèi)存泄露問(wèn)題。有測(cè)試過(guò)內(nèi)存泄露的朋友估計(jì)都有深刻地體驗(yàn),那就是內(nèi)存泄露問(wèn)題一般隱藏很深,很難通過(guò)代碼閱讀來(lái)發(fā)現(xiàn)。有些內(nèi)存泄露甚至可能出現(xiàn)在庫(kù)當(dāng)中。有可能這本身是庫(kù)中的bug,也有可能是因?yàn)槌绦騿T沒(méi)有正確理解它們的接口說(shuō)明文檔造成錯(cuò)用。
在很多時(shí)候,大多數(shù)的內(nèi)存泄露問(wèn)題無(wú)法探測(cè),但可能表現(xiàn)為隨機(jī)的故障。程序員們往往會(huì)把這種現(xiàn)象怪罪于硬件問(wèn)題。如果用戶對(duì)系統(tǒng)穩(wěn)定性不是很高,那么重啟系統(tǒng)問(wèn)題也不大;但,如果用戶對(duì)系統(tǒng)穩(wěn)定很高,那么這種故障就有可能使用戶對(duì)產(chǎn)品失去信心,同時(shí)也意味著你的項(xiàng)目是個(gè)失敗的項(xiàng)目。由于內(nèi)存泄露危害巨大,現(xiàn)在已經(jīng)有許多工具來(lái)解決這個(gè)問(wèn)題。這些工具通過(guò)查找沒(méi)有引用或重復(fù)使用的代碼塊、垃圾內(nèi)存收集、庫(kù)跟蹤等技術(shù)來(lái)發(fā)現(xiàn)內(nèi)存泄露的問(wèn)題。每個(gè)工具都有利有弊,不過(guò)總的來(lái)說(shuō),用要比不用好??傊?fù)責(zé)的開發(fā)人員應(yīng)該去測(cè)試內(nèi)存泄露的問(wèn)題,做到防患于未然。
內(nèi)存碎片比內(nèi)存泄露隱藏還要深。隨著內(nèi)存的不斷分配并釋放,大塊內(nèi)存不斷分解為小塊內(nèi)存,從而形成碎片,久而久之,當(dāng)需要申請(qǐng)大塊內(nèi)存是,有可能就會(huì)失敗。如果系統(tǒng)內(nèi)存夠大,那么堅(jiān)持的時(shí)間會(huì)長(zhǎng)一些,但最終還是逃不出分配失敗的厄運(yùn)。在使用動(dòng)態(tài)分配的系統(tǒng)中,內(nèi)存碎片經(jīng)常發(fā)生。目前,解決這個(gè)問(wèn)題最效的方法就是使用工具通過(guò)顯示系統(tǒng)中內(nèi)存的使用情況來(lái)發(fā)現(xiàn)誰(shuí)是導(dǎo)致內(nèi)存碎片的罪魁禍?zhǔn)?,然后改進(jìn)相應(yīng)的部分。
由于動(dòng)態(tài)內(nèi)存管理的種種問(wèn)題,在嵌入式應(yīng)用中,很多公司干脆就禁用malloc/free的以絕后患。
內(nèi)存崩潰是內(nèi)存使用最嚴(yán)重的結(jié)果,主要原因有數(shù)組訪問(wèn)越界、寫已經(jīng)釋放的內(nèi)存、指針計(jì)算錯(cuò)誤、訪問(wèn)堆棧地址越界等等。這種內(nèi)存崩潰造成系統(tǒng)故障是隨機(jī)的,而且很難查找,目前提供用于排查的工具也很少。
總之,如果要使用內(nèi)存管理單元的話,必須要小心,并嚴(yán)格遵守它們的使用規(guī)則,比如誰(shuí)分配誰(shuí)釋放。
3.深入理解代碼優(yōu)化
講到系統(tǒng)穩(wěn)定性,人們更多地會(huì)想到實(shí)時(shí)性和速度,因?yàn)榇a效率對(duì)嵌入式系統(tǒng)來(lái)說(shuō)太重要了。知道怎么優(yōu)化代碼是每個(gè)嵌入式軟件開發(fā)人員必須具備的技能。就象女孩子減肥一樣,起碼知道她哪個(gè)地方最需要減,才能去購(gòu)買減肥藥或器材來(lái)減掉它??梢姡a優(yōu)化的前提是找到真正需要優(yōu)化的地方,然后對(duì)癥下藥,優(yōu)化相應(yīng)部分的代碼。前面提到的profile(性能分析工具,一些功能齊全I(xiàn)DE都提供這種內(nèi)置的工具)能夠記錄各種情況比如各個(gè)任務(wù)的CPU占用率、各個(gè)任務(wù)的優(yōu)先級(jí)是否分配妥當(dāng)、某個(gè)數(shù)據(jù)被拷貝了多少次、訪問(wèn)磁盤多少次、是否調(diào)用了網(wǎng)絡(luò)收發(fā)的程序、測(cè)試代碼是否已經(jīng)關(guān)閉等等。
但是,profile工具在分析實(shí)時(shí)系統(tǒng)性能方面還是有不夠的地方。一方面,人們使用profile工具往往是在系統(tǒng)出現(xiàn)問(wèn)題即CPU耗盡之后,而profile工具本身對(duì)CPU占用較大,所以profile對(duì)這種情況很可能不起作用。根據(jù)Heisenberg效應(yīng),任何測(cè)試手段或多或少都會(huì)改變系統(tǒng)運(yùn)行,這個(gè)對(duì)profiler同樣適用!
總之,提高運(yùn)行效率的前提是你必須要知道CPU到底干了些什么干的怎么樣。
4.不要讓自己大海撈針
大海撈針只是對(duì)調(diào)試的一種生動(dòng)比喻。
經(jīng)常聽到組里有人對(duì)自己正在調(diào)試的代碼說(shuō)shit!可以理解,因?yàn)榇a不是他寫的,他有足夠的理由去shit bug百出的代碼,只要他自己不要寫出這種代碼,否則有一天同組的其它人可能同樣會(huì)shit他寫的代碼。為何會(huì)有大海撈針呢?肯定是有人把針掉到海里咯;那針為何會(huì)掉在海里呢?肯定是有人不小心或草率唄。所以當(dāng)你在抱怨針那么難找的時(shí)候,你是否想過(guò)是你自己草率地丟掉的。同樣,當(dāng)你調(diào)試個(gè)半死的時(shí)候,你是否想過(guò)你要好好反省一下當(dāng)初為了尋求捷徑可能沒(méi)有嚴(yán)格地遵守好的編碼設(shè)計(jì)規(guī)范、沒(méi)有檢測(cè)一些假設(shè)條件或算法的正確性、沒(méi)有將一些可能存在問(wèn)題的代碼打上記號(hào)呢?關(guān)于如何寫高質(zhì)量請(qǐng)參考林銳的《高質(zhì)量c++/c編程指南》或《關(guān)于C的0x8本“經(jīng)書”》。
如果你確實(shí)已經(jīng)把針掉在海里是,為了防止在找到之前刺到自己,你必須要做一些防范工作,比如戴上安全手套。同樣,為了盡能地暴露和捕捉問(wèn)題根源,我們可以設(shè)計(jì)比較全面的錯(cuò)誤跟蹤代碼。怎么來(lái)做呢?盡可能對(duì)每個(gè)函數(shù)調(diào)用失敗作出處理,盡可能檢測(cè)每個(gè)參數(shù)輸入輸出的有效性包括指針以及檢測(cè)是否過(guò)多或過(guò)少地調(diào)用某個(gè)過(guò)程。錯(cuò)誤跟蹤能夠讓你知道你大概把針掉在哪個(gè)位置。
5.重現(xiàn)并隔離問(wèn)題
如果你不是把針掉在大海了,而是掉在草堆里,那要好辦寫。因?yàn)橹辽傥覀兛梢园巡荻逊殖珊芏鄩K,一塊一塊的找。對(duì)于模塊獨(dú)立的大型項(xiàng)目,使用隔離方法往往是對(duì)付那些隱藏極深bug的最后方法。如果問(wèn)題的出現(xiàn)是間歇性的,我們有必要設(shè)法去重現(xiàn)它并記錄使其重現(xiàn)的整個(gè)過(guò)程以備在下一次可以利用這些條件去重現(xiàn)問(wèn)題。如果你確信可以使用記錄的那些條件去重現(xiàn)問(wèn)題,那么我們就可以著手去隔離問(wèn)題。怎么隔離呢?我們可以用#ifdef把一些可能和問(wèn)題無(wú)關(guān)的代碼關(guān)閉,把系統(tǒng)最小化到仍能夠重現(xiàn)問(wèn)題的地步。如果還是無(wú)法定位問(wèn)題所在,那么有必要打開“工具箱”了??梢栽囍?a target="_blank">ICE或數(shù)據(jù)監(jiān)視器去查看某個(gè)可疑變量的變化;可以使用跟蹤工具獲得函數(shù)調(diào)用的情況包括參數(shù)的傳遞;檢查內(nèi)存是否崩潰以及堆棧溢出的問(wèn)題。
6.以退為進(jìn)
獵人為了不使自己在森林里迷路,他常常會(huì)在樹木上流下一些標(biāo)記,以備自己將來(lái)有一天迷路時(shí)可以根據(jù)這些標(biāo)記找到出路。對(duì)過(guò)去代碼的修改進(jìn)行跟蹤記錄對(duì)將來(lái)出現(xiàn)問(wèn)題之后的調(diào)試很有幫助。假如有一天,你最近一次修改的程序跑了很久之后忽然死掉了,那么你這時(shí)的第一反映就是我到底改動(dòng)了些什么呢,因?yàn)樯洗涡薷闹笆呛玫?。那么如何檢測(cè)這次相對(duì)于上次的修改呢?沒(méi)錯(cuò),代碼控制系統(tǒng)SCS或稱版本控制系統(tǒng)VCS(Concurrent Version Control,CVS是VCS的演化版本)。將上個(gè)版本check in下來(lái)后和當(dāng)前測(cè)試版本比較。比較的工具可以是SCS/VCS/CVS自帶的diff工具或其它功能更強(qiáng)的比較工具,比如BeyondCompare和ExamDiff。通過(guò)比較,記錄所有改動(dòng)的代碼,分析所有可能導(dǎo)致問(wèn)題的可疑代碼。
7.確定測(cè)試的完整性
你怎么知道你的測(cè)試有多全面呢?覆蓋測(cè)試(coverage testing)可以回答這個(gè)問(wèn)題。覆蓋測(cè)試工具可以告訴你CPU到底執(zhí)行了那些代碼。好的覆蓋工具通??梢愿嬖V你大概20%到40%代碼沒(méi)有問(wèn)題,而其余的可能存在bug。覆蓋工具有不同的測(cè)試級(jí)別,用戶可以根據(jù)自己的需要選擇某個(gè)級(jí)別。即使你很確信你的單元測(cè)試已經(jīng)很全面并且沒(méi)有dead code,覆蓋工具還是可以為你指出一些潛在的問(wèn)題,看下面的代碼:
if (i 》= 0 && (almostAlwaysZero == 0 || (last = i)))
如果almostAlwaysZero為非0,那么last=i賦值語(yǔ)句就被跳過(guò),這可能不是你所期望的。這種問(wèn)題通過(guò)覆蓋工具的條件測(cè)試功能可以輕松的被發(fā)現(xiàn)。
總之,覆蓋測(cè)試對(duì)于提高代碼質(zhì)量很有幫助。
8.提高代碼質(zhì)量意味著節(jié)省時(shí)間
有研究表明軟件開發(fā)的時(shí)間超過(guò)80%被用在下面幾個(gè)方面:
調(diào)試自己的代碼(單元測(cè)試)
調(diào)試自己和其他相關(guān)的代碼(模塊間測(cè)試)
調(diào)試整個(gè)系統(tǒng)(系統(tǒng)測(cè)試)
更糟糕的是你可能需要花費(fèi)10-200倍的時(shí)間來(lái)找一個(gè)bug,而這個(gè)bug在開始的時(shí)候可能很容易就能找到。一個(gè)小bug可能讓你付出巨大的代價(jià),即使這個(gè)bug對(duì)整個(gè)系統(tǒng)的性能沒(méi)有太大的影響,但很可能會(huì)影響讓那些你可以看得到的部分。所以我們必須要養(yǎng)成良好的編碼和測(cè)試手段以求更高的代碼質(zhì)量,以便縮短調(diào)試的代碼。
9.發(fā)現(xiàn)它,分析它,解決它
這世界沒(méi)有萬(wàn)能的膏藥。profile再?gòu)?qiáng)大也有力不從心的時(shí)候;內(nèi)存監(jiān)視器再好,也有無(wú)法發(fā)現(xiàn)的時(shí)候;覆蓋工具再好用,也有不能覆蓋的地方。一些隱藏很深的問(wèn)題即使用盡所有工具也有可能無(wú)法查到其根源,這時(shí)我們能做的就是通過(guò)這些問(wèn)題所表現(xiàn)出來(lái)的外在現(xiàn)象或一些數(shù)據(jù)輸出來(lái)發(fā)現(xiàn)其中的規(guī)律或異常。一旦發(fā)現(xiàn)任何異常,一定要深入地理解并回溯其根源,直到解決為止。
10.利用初學(xué)者的思維
有人這樣說(shuō)過(guò):“有些事情在初學(xué)者的腦子里可能有各種各樣的情況,可在專家的頭腦里可能就很單一”。有時(shí)候,有些簡(jiǎn)單的問(wèn)題會(huì)被想的很復(fù)雜,有些簡(jiǎn)單的系統(tǒng)別設(shè)計(jì)的很復(fù)雜,就是由于你的“專家思維”。當(dāng)你被問(wèn)題難住時(shí),關(guān)掉電腦,出去走走,把你的問(wèn)題和你的朋友甚至你的小狗說(shuō)說(shuō),或許他們可以給你意想不到的啟發(fā)。
總結(jié):嵌入式調(diào)試也是一門藝術(shù)。就想其它的藝術(shù)一樣,如果你想取得成功,你必須具備智慧、經(jīng)驗(yàn)并懂得使用工具。只要我們能夠很好地領(lǐng)悟Oracle這十條秘訣,我相信我們?cè)谇度胧綔y(cè)試方面就能夠取得成功。
評(píng)論
查看更多