實(shí)時(shí)嵌入式系統(tǒng)軟件調(diào)試問題分析
例如,假設(shè)一個(gè)設(shè)備必須在向其發(fā)任何指令前就完成初始化。編譯器可能會移動指令位置,以便改善性能。這可能會造成設(shè)備的故障。如果你的設(shè)備驅(qū)動器調(diào)試后的版本是可行的,而采用經(jīng)過優(yōu)化的版本時(shí)會出現(xiàn)故障,那么你會想查看設(shè)備的初始化中是否有被移動的指令。你可能不得不采用恰當(dāng)?shù)木幾g器指南以便指導(dǎo)編譯器不去對每條基本函數(shù)執(zhí)行這樣的優(yōu)化,而不至于損失性能。
有時(shí),將代碼從一個(gè)架構(gòu)移植到另一種架構(gòu)上,也會帶來某種數(shù)據(jù)類型上的問題。例如,一種架構(gòu)內(nèi)的整數(shù)可能是32 bit的,而其它的架構(gòu)中可能是48 bit或者64 bit的。這可能會導(dǎo)致數(shù)據(jù)的失效或者被截?cái)唷?/p>
異常所帶來的問題
如果異常是與程序的執(zhí)行相同步的,則這往往是一種不當(dāng)?shù)牟僮鞯慕Y(jié)果,例如零作為除數(shù)所造成的異常。某些異常則是架構(gòu)所特有的。處理異常的最佳方法是采用缺省的異常處理器,并在出現(xiàn)異常時(shí)檢查異常出現(xiàn)的環(huán)境。異常所處的環(huán)境背景是寄存器量值的集合,包括狀態(tài)寄存器。大多數(shù)架構(gòu)將擁有一個(gè)指令地址寄存器,用來保存造成問題的指令地址。在多數(shù)情況下,要知道一個(gè)異常是如何發(fā)生的并不難,但是,是何種指令路徑可以隔離出這一失效,則是調(diào)試時(shí)棘手的地方。有些架構(gòu)支持跟蹤,即讓你可以看到程序順序執(zhí)行的指令的歷史。這將給出造成異常的指令順序的某些細(xì)節(jié)信息。內(nèi)存和寄存器訛誤則是造成異常及程序邏輯錯誤的主要原因。通過細(xì)致檢查造成異常的內(nèi)存指向或者寄存器,將可以縮小問題的范圍。
不能執(zhí)行錯誤檢驗(yàn)的代碼會造成內(nèi)存的訛誤
由于性能方面的原因,開發(fā)商可能會放棄對錯誤的檢查。跳過錯誤檢查將讓內(nèi)存泄漏等事件無法為人所知,而最終導(dǎo)致內(nèi)存訛誤。例如,如果malloc()出現(xiàn)故障,而由于返回的值并未得到檢驗(yàn),則開發(fā)商將開始覆蓋在內(nèi)存的地址0x0地址所寫入的量值,在很多嵌入式系統(tǒng)中,這則是一個(gè)有效的內(nèi)存區(qū)域。一個(gè)技巧是,讓某些地址0x0處的內(nèi)存控制,以便排查出任何一種潛在的訛誤。某些處理器架構(gòu)就容許應(yīng)用監(jiān)測數(shù)據(jù)總線的活動,從而能抓住相應(yīng)事件。
探尋架構(gòu)特有的功能:
大多數(shù)嵌入式處理器都支持某種層次上的調(diào)試功能。內(nèi)置的跟蹤單元就是一種得到硬件支持的跟蹤機(jī)制。例如,ADI公司的Blackfin處理器系列就具有硬件跟蹤單元,它可以跟蹤至少16路的時(shí)序控制器的訪問。當(dāng)硬件跟蹤緩沖器充滿后,就會產(chǎn)生跟蹤異常。使用這種跟蹤單元后,人們可以構(gòu)建出完整的執(zhí)行路徑。所提供的跟蹤輸出來自于一種可以免費(fèi)提供的工具(http://www.blackfin.org/) ,它可以構(gòu)造完整的執(zhí)行路徑。
觀察點(diǎn):
觀察點(diǎn)可以讓你監(jiān)測特定的內(nèi)存位置或者內(nèi)存塊區(qū)正在被更改時(shí)出現(xiàn)的情況。觀察點(diǎn)可以監(jiān)測內(nèi)部的數(shù)據(jù)總線傳送,如果在觀察點(diǎn)寄存器中,發(fā)現(xiàn)任何匹配的對象,則讓處理器暫停。如果一個(gè)特定內(nèi)存位置不斷出現(xiàn)訛誤,則觀察點(diǎn)就非常有用。對內(nèi)存塊區(qū)進(jìn)行觀察以查看是否有任何正在損毀存儲器數(shù)據(jù)的惡意代碼。
大多數(shù)當(dāng)前的調(diào)試環(huán)境都容許對內(nèi)存和寄存器的內(nèi)容進(jìn)行修改。有時(shí),修改寄存器的內(nèi)容,可以讓我們洞察何處出現(xiàn)了故障。例如,通過更改程序計(jì)數(shù)器,你可以迫使程序在特定函數(shù)出現(xiàn)時(shí)恢復(fù)執(zhí)行。必須謹(jǐn)慎地對恰當(dāng)?shù)募拇嫫髟O(shè)定恰當(dāng)?shù)牧恐?,具體方式則取決于處理器C函數(shù)的運(yùn)行時(shí)間模型。另外一個(gè)有用的寄存器是IMASK,如果你正在調(diào)試任何一種實(shí)時(shí)操作系統(tǒng),則調(diào)試(分步深入時(shí))進(jìn)程中任何時(shí)刻都會出現(xiàn)中斷。由于調(diào)試后的代碼不一定處于關(guān)鍵區(qū),你可能幾乎時(shí)時(shí)刻刻都要訪問中斷的例程。你可能無法屏蔽中斷,因?yàn)樗鼈冏屇愕?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/系統(tǒng)">系統(tǒng)完成設(shè)定,并運(yùn)行起來。例如,任何系統(tǒng)中的定時(shí)器的中斷都可能會被觸發(fā)。更好的方法是對IMASK寄存器進(jìn)行編輯,將所有的中斷都屏蔽掉,直到你調(diào)試完代碼為止。
結(jié)論:
總之,由于調(diào)試是開發(fā)過程的最后步驟,因此它將對產(chǎn)品上市時(shí)間造成直接的影響。調(diào)試本身也是難以調(diào)度的,因?yàn)樗l(fā)現(xiàn)的問題在復(fù)雜性和可避免性方面都大相徑庭,上面所討論的是一些在嵌入式系統(tǒng)開發(fā)期間常見的問題。這些調(diào)試技巧和提示旨在著重強(qiáng)調(diào)節(jié)省時(shí)間,因此在開發(fā)復(fù)雜的嵌入式系統(tǒng)時(shí),應(yīng)用現(xiàn)代的開發(fā)工具和擁有豐富調(diào)試功能的處理器能夠改善投資收益。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論