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