嵌入式系統(tǒng)軟件開發(fā)環(huán)境中調試器的設計
1、程序調式與調試器的設計與概述
調試就是發(fā)現程序中的錯誤并修改錯誤的過程,在軟件開發(fā)流程中,調試是一個比較重要的環(huán)節(jié)。調試器就是幫助程序員發(fā)現并排除錯誤的軟件工具,它給程序員提供從不同角度觀察程序執(zhí)行情況的能力。同時,好的調試器也是“讀”程序的好幫手,程序員通過調試器調試程序時提供的各種功能和運行時的狀態(tài)信息可以更深刻地理解程序功能??梢哉f調試器的優(yōu)劣是衡量軟件開發(fā)環(huán)境好壞的重要標準。在嵌入式系統(tǒng)軟件開發(fā)環(huán)境中,調試尤顯其重要性。因為許多嵌入式應用系統(tǒng)的軟件規(guī)模并不是太大,也就是說設計和代碼編寫工作量相對較小,而開發(fā)者所面對的硬件對象千差萬別,操作系統(tǒng)和就用程序也往往是綁定在一起的,如何“導出”調式結果信息也是軟硬件開發(fā)者必須考慮的一個問題。
2、調試的一般過程
當程序運行后未得到預期結果,也就是程序有了“問題”,如何從程序的運行結果出發(fā)找到出錯的根源,不同的程序員可能各有自己不同的經驗和方法,但基本的調試過程還是類似的,可簡單圖示如下:
500)this.style.width=500;" border="0" />
圖1—1調試的一般過程
3、調試器的分類
從調試器參與與調試的時機來看,或劃分為靜態(tài)調度器和動態(tài)調器兩類。靜態(tài)調試器的典型做法是在源程序中需要收集信息的位置插入跟蹤語句,然后重新編譯、執(zhí)行程序,程序執(zhí)行完畢后,用調試器分析執(zhí)行時出跟蹤語句保留下來的信息,將分析的結果給程序員作判斷用。動態(tài)調器(又稱源代碼調試器或符號調試器),則是在程序運行的過程中動態(tài)地監(jiān)控程序運行,并提供給程序員控制被調試程序的運行和訪問被調試程序信息的手段。這一類調試器最本質的特征是提供有設置斷點(breakpoint)和單步跟蹤程序運行等能力,被調試程序運行時遇到斷點后便停下來,調試器給程序員提供可從不同的角度觀察程序運行情況的能力,以方便程序找出錯原因,進而修改程序。本論文討論的主要是這類調試器。其實,現在有些調試器這兩種特點兼而有之。
從調試器提供給程序員的抽象層次來分,可分為高層調試器和低層解試器。所謂的低層調試器通常指調試程序時僅能在匯編代碼一級反映程序的運行狀態(tài),程序員只能從指令級和CPU的各種寄存器狀態(tài)中分析程序運行是否正常。高層調試器則指能在高級語言一級反映程序的運行狀態(tài)的調試器。
從使用的被調試程序的功能特點來分,又可分為簡單調試器。并行調試器,分布式調試器等等。
4、調試器設計應遵循的一般原則
●Heisnberg原則:調試器應盡量減少對被調試器對象的影響
特別是對于動態(tài)調試器來說,出于其直接介入了被調度對象的運行,就必須考慮這種介入是否對被調度器程序有所干擾,如果產生了干擾,其反映的被調試對象的信息肯定就不完全真實。對大多數傳統(tǒng)的順序執(zhí)行的程序而言,出于被調試的程序進行與調試器程序進程不同一虛地址空間,因而不存在多大的干擾。但是,對于并行和分布式系統(tǒng)中的程序調試而言這種干擾就不可避免了,如何盡可能的減少對被調試對象的影響,則是這類調試器設計要考慮的首要問題。
●程序員通過調試器所獲得的信息應真實反映被調試器執(zhí)行的實際情況
如對于高層調試器設計而言,程序實際執(zhí)行代碼的實際位置得與源代碼行應準確對應起來,特別是再考慮到允許編譯器做代碼優(yōu)化工作話,這個原則更必須予以重視,因為代碼優(yōu)化之后,源代碼行與目標代碼指令序列的對應關系遭到破壞,從而也就打亂了目標文件調試信息中的對應關系。故一般調試程序時,都要求編譯器在編譯時不使用優(yōu)化選項。
●盡可能我的給出有關被調試對象的上下文信息[!--empirenews.page--]
調試器應提供給程序員從不角度和層次觀察調試對象狀態(tài)和行為的功能。一般而言,調試器至少得具有斷點設置和查看、單步跟蹤程序執(zhí)行流程、以及程序在斷點處停下來時對各種寄存器和內存內容的訪問、顯示調用棧中函數的調用關系等等功能。當然,對于多進程和多線程的調試器,還得具有查看進程或線程之間的通信關系,以及它們各自的狀態(tài)信息等等。
5、嵌入式系統(tǒng)軟件開發(fā)中的調試方法
嵌入式系統(tǒng)產品的開發(fā)中,嵌入式操作系統(tǒng)和開發(fā)具起到非常重要的作用。首先嵌入式操作系統(tǒng)機構了軟件開發(fā)的基本執(zhí)行支撐,是軟件開發(fā)的基礎。另一方面,嵌入式系統(tǒng)產品的硬件通常使用專用芯片及System—On—Chinp技術,通常需要新的工具包支持。工具中編譯工具對發(fā)揮芯片的性能至關重要,調試工具對開發(fā)效率至關重要。
對嵌入式系統(tǒng)的軟件開環(huán)境而言,開發(fā)者所面對的硬件對象往往千差萬別,軟件開發(fā)的規(guī)模一般較小,還帶有各種如實時性、內存大不、能耗小、安全性的特殊需求,調試荼就顯成尤為重要。最早期的調試方法基本采取的是“crash and burn”的方法,即把編譯好的目標代碼“燒”到目標板上,讓它跑起來,如果未得到預期結果,仔細檢查源代碼,猜測出問題可能出現的地方,嘗試修試源代碼,再重新“燒”到目標板上,再運行,一直重復這個過程,直到結果正確為止。使用這種方法,猶如在暗室中維修精密儀器,可想而各程序調試的難度有多大。
為了方便嵌入系統(tǒng)中代碼的調試,在硬件上,出現了各種各樣的具有調式功能的調試板(本文稱之為目標板-Target)。如增加了串口,并口,網口使之通過串、并口線或網線并借助另外一臺通用計算機(本文稱之為主機-Host)把調式信息輸出并顯示出來,有的甚至在微代碼一級增加了實現調試功能的指令。在軟件上,也出現了大量嵌入式調試器,即使不是專門向嵌入系統(tǒng)的調試器往往也是一定程度上考慮了嵌入式系統(tǒng)軟件調試功能。如Microsoft.VxWOrks,pSoS均提供圖形化的易用的程序開發(fā)調試環(huán)境,開發(fā)調試環(huán)境已經監(jiān)控系統(tǒng)核心(Kernel Aware),可視化整個系統(tǒng)(System Visual)。但由于一些嵌入式系統(tǒng)產品的通常使用專用芯片,其開發(fā)環(huán)境相對較弱,調試器的開發(fā)也必然是完善這些軟件開發(fā)環(huán)境的重要環(huán)節(jié)。
6、嵌入式系統(tǒng)軟件開發(fā)環(huán)境中調試器的特點
●具有跨平臺的交叉調試功能,與嵌入系統(tǒng)軟件開發(fā)環(huán)境的編譯器一樣,被調試程序的運行平臺與調試器本身的運行平臺往往是不一致的。
●一般得具有遠程調試的功能。嵌入式系統(tǒng)中對程序的調試往往通過串口通信,網絡通信等方式來完成調試器與運行目標程序的嵌入式設備的交互。這就使得被調試程序中得有實現這種交互的功能模塊。
●根據嵌入式硬件環(huán)境的不同特點,針對這種硬件平臺的調試器往往也具備一些獨特功能。
●如果有某類嵌入式設備的仿真環(huán)境的話,相應的應用程序的調試一般先考慮在仿真環(huán)境下調試,以減少調試代價。