專利名稱::內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)及嵌入式系統(tǒng)調(diào)試方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及嵌入式系統(tǒng)軟件和/或硬件的調(diào)試系統(tǒng)及方法,尤其是涉及一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)及嵌入式系統(tǒng)調(diào)試方法。
背景技術(shù):
:調(diào)試是嵌入式系統(tǒng)軟件開發(fā)過程中必不可少的環(huán)節(jié),通用的桌面操作系統(tǒng)與嵌入式操作系統(tǒng)在調(diào)試環(huán)境上存在明顯的差別。前者,調(diào)試器與^皮調(diào)試的程序往往是運行在同一臺機(jī)器、相同的操作系統(tǒng)上的兩個進(jìn)程,調(diào)試器進(jìn)程通過操作系統(tǒng)專門提供的接口控制、訪問被調(diào)試進(jìn)程(比如微軟開發(fā)的visual0++,它集開發(fā)環(huán)境、編譯和調(diào)試于一身,程序的開發(fā)、編譯和調(diào)試都由VisualC+十完成,VisualC++調(diào)試和^皮調(diào)試程序都運行在同一臺才幾器下)。嵌入式開發(fā)和調(diào)試有別于通用的桌面軟件的開發(fā),嵌入式開發(fā)采用交叉開發(fā)的模式(CrossDevelopping):開發(fā)系統(tǒng)是建立在軟硬件資源豐富的PC機(jī)(或者工作站)上,我們稱之為宿主機(jī)(HOST),嵌入式程序的編輯,編譯,鏈接過程都在host端完成,而程序最終運行的卻是和host有4艮大區(qū)別的嵌入式設(shè)備,我們稱之為目標(biāo)機(jī)(Target),目標(biāo)機(jī)和宿主機(jī)的差別主要指硬件環(huán)境差別通常CPU類型不同,例如H0ST的CPU為intelX86,而Target為freescale公司的powerpc。軟件環(huán)境的差異在host上都有成熟的操作系統(tǒng)的應(yīng)用軟件支持,比如windows,以及freescale公司的codewarriorIDE集成開發(fā)和調(diào)試器。而Target—般都是棵機(jī),或者需要調(diào)試的嵌入式操作系統(tǒng)。嵌入式系統(tǒng)的調(diào)試和故障診斷一般有以下幾種方法(I)添加打印調(diào)試信息和調(diào)試命令這種方法是程序開發(fā)人員在程序開發(fā)階段在需要調(diào)試的程序中插入打印信息的代碼(比如在C語言中使用printf語句輸出調(diào)試信息),可以打印程序變量的值、內(nèi)存地址或者寄存器的內(nèi)容、收/發(fā)數(shù)據(jù)包的內(nèi)容等;程序運行時,當(dāng)指定位置的打印程序被執(zhí)行后,它就會打印出指定的信息(打印信息的輸出位置可以多種多樣,可以是串口,也可以把輸出信息保存到文件中,或者從通信端口輸出等);開發(fā)人員通過分析輸出的打印信息,來分析程序執(zhí)行的過程,觀察程序變量的值、或者收發(fā)包的內(nèi)容等是否和期望的一致來進(jìn)行調(diào)試。和打印調(diào)試信息類似,開發(fā)人員通過添加一些調(diào)試命令來顯示程序的運行狀態(tài)(打印變量的值,寄存器的值,統(tǒng)計信息等),程序運行后,開發(fā)人員通過輸入調(diào)試命令讓程序輸出調(diào)試信息,通過對比輸出信息來進(jìn)行調(diào)試。此種調(diào)試方法存在以下缺陷(II)不夠靈活程序開發(fā)人員需要預(yù)先在期望的位置添加代碼,或者預(yù)先添加調(diào)試命令,打印的位置以及打印的內(nèi)容在開發(fā)階段就已經(jīng)固定,程序運行后不能修改;因為在調(diào)試階段開發(fā)人員對于需要在何處打印信息?打印什么信息?不是非常的清楚,這會導(dǎo)致打印的信息不充分,無法進(jìn)行故障定位,或者打印的信息很多都沒用,無助于故障分析和調(diào)試;這導(dǎo)致的結(jié)果是程序開發(fā)人員需要不斷修改添加打印信息,然后重新編譯運行,重新分析打印信息,這樣不斷循環(huán)直至故障解決。(12)無法支持指令級的調(diào)試很顯然這種調(diào)試方法無法進(jìn)行設(shè)置斷點和單步跟蹤;斷點指的是用戶可以指定程序執(zhí)行到什么位置先停下來,停下來后用戶可以查看機(jī)器的當(dāng)前狀態(tài)(內(nèi)存的值,或者寄存器的值),可以讓程序從斷點的位置繼續(xù)執(zhí)行,單步跟蹤指的是目標(biāo)機(jī),每執(zhí)行一條指令,會停下來,讓用戶觀察機(jī)器狀態(tài)。(13)調(diào)試信息不能應(yīng)用在實際運行系統(tǒng)中,當(dāng)程序開發(fā)和調(diào)試完畢,程序作為最終程序被實際用戶使用前,原來添加的打印調(diào)試信息要被刪除,否則最終用戶會看到一堆看不懂的調(diào)試信息,影響用戶的使用,而且這會大大影響實際運行系統(tǒng)的性能(打印信息會很大耗費CPU的資源),因此在程序發(fā)布前需要刪除這些調(diào)試信息的程序。這就導(dǎo)致調(diào)試信息無法在實際運行系統(tǒng)中使用。如果最終程序出問題,就無法使用原來的調(diào)試信息進(jìn)行調(diào)試。(2)系統(tǒng)中附帶故障診斷和分析模塊該模塊屬于系統(tǒng)軟件的一部分,正常情況下該模塊沒有工作,在發(fā)現(xiàn)問題后,用戶使用該模塊診斷系統(tǒng)的故障(主要指的是硬件故障)進(jìn)行分析和診斷,例如DellPC的BIOS上就附帶有故障診斷模塊,用戶如果發(fā)現(xiàn)PC工作不正常,就可以進(jìn)入BIOS的故障診斷模塊進(jìn)行測試,看看是哪個硬件可能有問題;該模式可以在正式系統(tǒng)中附帶該功能,非常方便產(chǎn)品維護(hù)和維修人員使用,有這個模塊產(chǎn)品客戶支持人員就能快速定位產(chǎn)品是否有問題;但是該模式也有自己的弊端(21)只能對硬件故障進(jìn)行診斷,不能診斷軟件故障;但是在嵌入式系統(tǒng)中更多的故障是軟件引起,而且也無法作為開發(fā)階段軟件調(diào)試和診斷手段,只適合產(chǎn)品維護(hù)和維修人員使用。(22)只能診斷可預(yù)知的故障,對于可預(yù)知的每個設(shè)備的每個故障都要有相應(yīng)的診斷程序和他對應(yīng)。由于每個設(shè)備的每個故障都要有相對應(yīng)的診斷程序,因此程序的開發(fā)工作量大,而且每新增加或者修改一個設(shè)備就要相應(yīng)增加和修改程序,靈活性低。(3)樁(Stub)模式交叉調(diào)試方法這種模式需要預(yù)先在目標(biāo)機(jī)增加Stub模塊,Stub是運行在目標(biāo)系統(tǒng)的一段程序,它負(fù)責(zé)監(jiān)控目標(biāo)機(jī)上被調(diào)試程序的運行,通常和host端的調(diào)試器一起完成應(yīng)用程序的調(diào)試,包括以下步驟調(diào)試器控制、訪問被調(diào)試程序調(diào)試器的這類請求實際上都將轉(zhuǎn)換成對被調(diào)試程序的地址空間或目標(biāo)平臺的某些寄存器的訪問,這些訪問通過協(xié)議的方式傳給Stub,Stub接收到請求后對目標(biāo)地址或者寄存器直接進(jìn)行訪問,并把處理結(jié)果通過Stub發(fā)送給調(diào)試器,調(diào)試器處理后把結(jié)果顯示給用戶;斷點調(diào)試和單步跟蹤。Stub在需要產(chǎn)生斷點的位置用一條異常指令代替原來的指令,當(dāng)程序執(zhí)行到該位置,產(chǎn)生異常,異常被Stub模塊捕獲通知調(diào)試模塊,并循環(huán)等待調(diào)試模塊的命令;這時調(diào)試模塊就會解釋Stub發(fā)送過來的信息為斷點異常,并且通知用戶CPU已經(jīng)停下來,這時用戶可以通過調(diào)試模塊命令Stub,查看目標(biāo)機(jī)的內(nèi)存和寄存器等信息進(jìn)行調(diào)試;斷點恢復(fù)Stub首先恢復(fù)斷點位置的指令,并且退出異常處理,讓程序從斷點位置繼續(xù)執(zhí)行;單步跟蹤單步跟蹤和斷點調(diào)試原理類似,Stub會通過設(shè)置CPU特殊寄存器,讓CPU每執(zhí)行完一條指令,就產(chǎn)生一次異常,異常被Stub接管后,后續(xù)流程和斷點調(diào)試流程一致。該方法存在以下缺陷(31)該方法的實質(zhì)是用軟件接管目標(biāo)系統(tǒng)的全部異常處理(exceptionhandler)及部分中斷處理,在其中插入調(diào)試端口通信模塊,與主機(jī)的調(diào)試器交互。它只能在目標(biāo)操作系統(tǒng)初始化,特別是調(diào)試通信端口初始化完成后才起作用,所以一般只用于調(diào)試運行于目標(biāo)操作系統(tǒng)之上的應(yīng)用程序,而不宜用來調(diào)試目標(biāo)操作系統(tǒng),特別是無法調(diào)試目標(biāo)操作系統(tǒng)的啟動過程。(32)HOST端需要調(diào)試器軟件。(33)Stub要支持和調(diào)試器相配套的通訊協(xié)議,通訊協(xié)議實現(xiàn)復(fù)雜,而且每個調(diào)試器的通訊標(biāo)準(zhǔn)都不一樣,需要為每個調(diào)試器開發(fā)相應(yīng)的Stub,開發(fā)工作量大。(34)必須改動目標(biāo)操作系統(tǒng),這一改動即使沒有對操作系統(tǒng)在調(diào)試過程中的表現(xiàn)造成不利影響,至少也會導(dǎo)致目標(biāo)系統(tǒng)多了一個不用于正式發(fā)布的調(diào)試版,也就是說最終系統(tǒng)不能帶有該功能,而實際上很多故障只有在最終系統(tǒng)上出現(xiàn),因此該模式也無法支持在實際運行系統(tǒng)中的調(diào)試。(4)片上調(diào)試(OnChipDebugging)交叉調(diào)試方法該方法和Stub類似,片上調(diào)試把Stub模塊做在一個特殊的硬件設(shè)備上(我們稱之仿真器),仿真器通過串口、以太口、usb和主機(jī)相連,同時仿真器還通過專用的接口(比如JTAG)和目標(biāo)板上的處理器相連接,片上調(diào)試需要在處理器內(nèi)部嵌入額外的控制模塊,當(dāng)滿足了一定的觸發(fā)條件時進(jìn)入某種特殊狀態(tài)。在該狀態(tài)下被調(diào)試程序停止運行,主機(jī)的調(diào)試器可以通過專用接口(比如JTAG)訪問各種資源(寄存器、存儲器等)并執(zhí)行指令。內(nèi)嵌的控制模塊以基于微碼的監(jiān)控器(microcodemonitor)或純硬件資源的形式存在,包括一些提供給用戶的接口(如斷點寄存器等)。該方法存在以下缺陷(41)該方法需要CPU支持調(diào)試模塊,現(xiàn)有的CPU并不一定都支持調(diào)試模塊。(42)這種方案需要仿真器,仿真器價格昂貴不適合大規(guī)模使用,(43)目標(biāo)板上需要可供仿真器連接的接插件,由于接插件會占用物理空間,而且對信號有影響,因此實際產(chǎn)品時不會預(yù)留供調(diào)試用的接插件接口,另外調(diào)試時需要預(yù)先連接好仿真器,因此該調(diào)試方案也不適合在實際產(chǎn)品上的調(diào)試。綜上所述,現(xiàn)有嵌入式系統(tǒng)的故障診斷和調(diào)試方案都有各自優(yōu)缺點但都存在如下問題無法解決在實際系統(tǒng)上的直接進(jìn)行故障診斷和調(diào)試功能;無法支持對未知故障的現(xiàn)場診斷功能;無法對未知協(xié)議的分析功能;而且需要特殊的軟、硬件支持,增加投入,因此不利于大規(guī)模采用;軟件開發(fā)投入大,靈活性差,擴(kuò)展性差。
發(fā)明內(nèi)容本發(fā)明的目的是針對上述現(xiàn)有技術(shù)的缺陷,提出了內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)以及嵌入式系統(tǒng)調(diào)試方法,使得處于目標(biāo)設(shè)備上的嵌入式系統(tǒng),同時包括嵌入式操作單元以及調(diào)試單元,以實現(xiàn)在嵌入式系統(tǒng)上直接對軟件和/或硬件進(jìn)行調(diào)試,從而降低了設(shè)置額外硬件和/或開發(fā)額外的軟件而導(dǎo)致的成本。為實現(xiàn)上述目的,本發(fā)明提供了一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng),包括嵌入式操作單元,其中還包括調(diào)試單元,與所述嵌入式操作單元連接;所述調(diào)試單元包括驅(qū)動模塊以及與驅(qū)動模塊連接的調(diào)試模塊;驅(qū)動模塊,用于控制調(diào)試命令的輸入和輸出;調(diào)試模塊,用于觸發(fā)嵌入式操作單元產(chǎn)生異常,捕獲異常,以及對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。為實現(xiàn)上述目的,本發(fā)明還提供了一種嵌入式系統(tǒng)調(diào)試方法,其中包括調(diào)試模塊觸發(fā)嵌入式操作單元產(chǎn)生異常;調(diào)試模塊捕獲異常,對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法;調(diào)試模塊采用所述預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。由以上技術(shù)方案可知,本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)及嵌入式系統(tǒng)調(diào)試方法,通過在嵌入式系統(tǒng)中內(nèi)嵌調(diào)試單元,使得處于目標(biāo)設(shè)備上的嵌入式系統(tǒng),同時包括嵌入式操作單元以及調(diào)試單元,以實現(xiàn)在嵌入式系統(tǒng)上直接對軟件和/或硬件進(jìn)行調(diào)試,從而降低了設(shè)置額外硬件和/或開發(fā)額外的軟件而導(dǎo)致的成本,方便大規(guī)模的推廣應(yīng)用。同時由于嵌入式操作單元與調(diào)試單元位于同一目標(biāo)設(shè)備上,因此當(dāng)嵌入式操作單元出現(xiàn)故障或需調(diào)試時,可以直接利用調(diào)試單元進(jìn)入調(diào)試模式,從而加快了疑難問題的解決速度。圖l為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例一的結(jié)構(gòu)示意圖;圖2為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例二的結(jié)構(gòu)示意圖;圖3為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例三的結(jié)構(gòu)示意圖;圖4為調(diào)試模塊的一結(jié)構(gòu)示意圖;圖5為本發(fā)明一種嵌入式系統(tǒng)調(diào)試方法的流程圖;圖6為調(diào)試模塊的另一結(jié)構(gòu)示意圖。具體實施方式下面通過附圖和實施例,對本發(fā)明的技術(shù)方案做進(jìn)一步的詳細(xì)描述。圖1為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例一的結(jié)構(gòu)示意圖。該實施例中內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)200,安裝在目標(biāo)設(shè)備100上,包括嵌入式操作單元210,其中還包括與嵌入式操作單元21G連接的調(diào)試單元220。嵌入式操作單元210包括彼此互相連接的驅(qū)動模塊211、嵌入式搡作系統(tǒng)212以及應(yīng)用程序213。調(diào)試單元220包括驅(qū)動模塊221以及與驅(qū)動模塊221連接的調(diào)試模塊222;驅(qū)動模塊221,用于控制調(diào)試命令的輸入和輸出;調(diào)試模塊222,用于觸發(fā)嵌入式操作單元210產(chǎn)生異常,捕獲異常,以及對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法嵌入式操作單元210中的硬件和/或軟件進(jìn)行調(diào)試。調(diào)試模塊222觸發(fā)嵌入式操作單元210產(chǎn)生異常具體為調(diào)試模塊222對目標(biāo)設(shè)備100和/或嵌入式操作單元210的訪問和/或控制,如對目標(biāo)設(shè)備100和/或嵌入式操作單元210的寄存器或者地址空間進(jìn)行數(shù)據(jù)讀寫,修改,配置,通過修改或設(shè)置相應(yīng)的數(shù)據(jù)對目標(biāo)設(shè)備100和/或嵌入式操作單元210進(jìn)行控制,如設(shè)置斷點、在斷點處設(shè)置特殊指令來產(chǎn)生異常。嵌入式操作系統(tǒng)是固化在硬件里面的系統(tǒng),比如手機(jī)、路由器里面的系統(tǒng)。常見的嵌入式操作系統(tǒng)有Linux、uCli證、WinCE、PalmOS、Symbian等。一般情況下,調(diào)試模塊在接收到調(diào)試命令的通知時,才進(jìn)行調(diào)試操作。用戶可以根據(jù)測試需要或開發(fā)經(jīng)驗,手動地通過人機(jī)操作界面的方式選擇或輸入調(diào)試命令。嵌入式操作單元也可以根據(jù)其內(nèi)部的自檢功能模塊,定時地向調(diào)試模塊發(fā)送調(diào)試命令的通知;或?qū)崟r地根據(jù)嵌入式操作單元的運行狀態(tài),當(dāng)檢測到故障狀態(tài)或準(zhǔn)故障狀態(tài)時,自動地向調(diào)試模塊發(fā)送調(diào)試命令的通知。圖2為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例二的結(jié)構(gòu)示意圖。該實施例與實施例一的區(qū)別在于,調(diào)試單元220還包括調(diào)試界面223,驅(qū)動模塊221與調(diào)試界面223連接,用于控制調(diào)試界面223的顯示和調(diào)試命令的輸入和輸出;調(diào)試模塊222與調(diào)試界面223連接,用于接收并響應(yīng)由調(diào)試界面223發(fā)送的調(diào)試命令。該實施例中用戶通過調(diào)試界面223輸入調(diào)試命令或用戶通過調(diào)試界面223選擇一條調(diào)試命令,然后由調(diào)試界面223將相應(yīng)的輸入或選擇的調(diào)試命令發(fā)送至調(diào)試模塊222。圖3為本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)實施例三的結(jié)構(gòu)示意圖。該實施例與實施例一的區(qū)別在于,嵌入式操作單元210還包括通知模塊214,用于向調(diào)試單元220發(fā)送調(diào)試命令。該實施例中,嵌入式操作單元210中的通知模塊214可以定時地向調(diào)試單元220中的調(diào)試模塊222發(fā)送調(diào)試命令的通知;或?qū)崟r地根據(jù)嵌入式操作單元的運行狀態(tài),當(dāng)檢測到故障狀態(tài)或準(zhǔn)故障狀態(tài)時,自動地向調(diào)試模塊發(fā)送調(diào)試命令的通知。圖4為調(diào)試模塊的一結(jié)構(gòu)示意圖。調(diào)試模塊包括異常處理子模塊A以及與所述異常處理子模塊A連接的調(diào)試功能子模塊B。異常處理子模塊A,捕獲異常,對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型將異常信息發(fā)送至調(diào)試功能子模塊;調(diào)試功能子模塊B,用于觸發(fā)嵌入式操作單元產(chǎn)生異常,并與所述異常處理子模塊連接,用于采用所述調(diào)試功能子模塊內(nèi)的預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。其中調(diào)試功能子模塊又可以包括但不限于固定斷點處理子模塊B1、動態(tài)斷點處理子模塊B2、單步跟蹤處理子模塊B3、數(shù)據(jù)監(jiān)視處理子模塊B4及指令監(jiān)視處理子模塊B5中的任一種或其組合。固定斷點處理子模塊Bl,用于采用固定斷點實現(xiàn)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。固定斷點實現(xiàn)方法中,斷點的位置在開發(fā)階段就決定,一般用于調(diào)試系統(tǒng)的初始化,系統(tǒng)運行到固定斷點位置可以產(chǎn)生固定斷點異常,系統(tǒng)暫停,并等待用戶調(diào)試。動態(tài)斷點處理子模塊B2,用于采用動態(tài)實現(xiàn)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。動態(tài)斷點實現(xiàn)方法中,可以在系統(tǒng)運行后通過命令的方式添加/刪除斷點,系統(tǒng)運行到動態(tài)斷點位置可以產(chǎn)生動態(tài)斷點異常,系統(tǒng)暫停,并等待用戶調(diào)試。單步跟蹤處理子模塊B3,用于采用單步跟蹤實現(xiàn)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。單步跟蹤實現(xiàn)方法中,系統(tǒng)每執(zhí)行一步可以產(chǎn)生單步跟蹤異常,系統(tǒng)暫停,并等待用戶調(diào)試。數(shù)據(jù)監(jiān)視處理子模塊B4,對嵌入式操作單元中的數(shù)據(jù)訪問進(jìn)行監(jiān)控,監(jiān)視系統(tǒng)對指定空間的訪問,如果指定空間被訪問,系統(tǒng)產(chǎn)生數(shù)據(jù)監(jiān)視異常,報告監(jiān)視地址被訪問,系統(tǒng)暫停,并等待用戶調(diào)試。指令監(jiān)視處理子模塊B5,對嵌入式操作單元中的指令執(zhí)行進(jìn)行監(jiān)控,監(jiān)視指定空間的指令是否被運行,如果指定空間的指令被運行,系統(tǒng)產(chǎn)生指令監(jiān)視異常,報告監(jiān)視地址被運行,系統(tǒng)暫停,并等待用戶調(diào)試。圖5為本發(fā)明一種嵌入式系統(tǒng)調(diào)試方法的流程圖。如圖5,其中包括步驟1、嵌入式操作單元或用戶通過調(diào)試界面向調(diào)試模塊輸入調(diào)試命令;步驟2、調(diào)試模塊響應(yīng)調(diào)試命令,觸發(fā)嵌入式操作單元產(chǎn)生異常;步驟3、調(diào)試模塊捕獲異常,對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法;步驟4、調(diào)試模塊采用所述預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。所述預(yù)設(shè)方法為固定斷點實現(xiàn)方法、動態(tài)斷點實現(xiàn)方法或單步跟蹤實現(xiàn)方法、數(shù)據(jù)監(jiān)視實現(xiàn)方法、指令監(jiān)視實現(xiàn)方法或其他實現(xiàn)方法。下面分別對上述技術(shù)方案中提到的異常處理、固定斷點方法、動態(tài)斷點實現(xiàn)方法、單步跟蹤實現(xiàn)方法、數(shù)據(jù)監(jiān)4^L實現(xiàn)方法以及指令監(jiān)^L實現(xiàn)方法進(jìn)行描述。(1)異常處理原理CPU執(zhí)行指令是按照順序執(zhí)行的,當(dāng)有外部事件產(chǎn)生時比如中斷(在powerpc中中斷也是一種異常),CPU要先暫停當(dāng)前程序的執(zhí)行,轉(zhuǎn)而執(zhí)行每個異常對應(yīng)的入口程序,當(dāng)異常程序退出后,CPU能夠恢復(fù)到剛才的位置繼續(xù)執(zhí)行,比如當(dāng)程序執(zhí)行到IOO位置時,產(chǎn)生一個外部中斷,這是CPU直接跳轉(zhuǎn)到中斷所對應(yīng)的異常入口(如powerpc:0x900)當(dāng)中斷處理完畢后退出中斷,程序繼續(xù)從100處開始運行,而在powerpc中,多種事件可以產(chǎn)生異常,可以采用如下異常用于調(diào)試目的異常異常向量用途說明使用的寄存調(diào)用的處理模器和指令塊(如何產(chǎn)生異常)Program0x0700固定斷點當(dāng)異常產(chǎn)生時使用twge固定斷點處理產(chǎn)生異常SRR0=產(chǎn)生異常r2,r2指令子模塊的指令地址,作為固定斷SRR0+4就是用戶點指令。用斷點的地址SystemCallOxOCOO動態(tài)斷點當(dāng)異常產(chǎn)生時使用sc指動態(tài)斷點處理產(chǎn)生異常SRRO-產(chǎn)生異常令作為動態(tài)子模塊的指令地斷點指令。址,SRR0+4就是用戶斷點的地址TraceOxOODOO單步跟蹤當(dāng)異常產(chǎn)生時設(shè)置單步跟蹤處理Exception產(chǎn)生異常SRRO=下一次將MSR[SE]=子模塊被執(zhí)行的指令地1:,每執(zhí)行址該指令就會產(chǎn)生該異常DataStorage0x0300用戶監(jiān)視當(dāng)異常產(chǎn)生時DABR和數(shù)據(jù)監(jiān)視處理CPU對數(shù)據(jù)SRRO=產(chǎn)生異常DABR2用于子模塊的訪問,當(dāng)?shù)闹噶畹刂吩O(shè)定監(jiān)視的CPU訪問DAR-訪問的數(shù)地址和訪問(讀/寫)據(jù)地址。方式的地址空DBCR:用于間落在監(jiān)設(shè)置監(jiān)視地視范圍內(nèi)址匹配和組時產(chǎn)生該合方式異常Instruction0x01300用戶監(jiān)視當(dāng)異常產(chǎn)生時IABR和指令監(jiān)視處理<table>tableseeoriginaldocumentpage14</column></row><table>對于不同的異常有不同的異常處理入口(異常向量),調(diào)試模塊通過改寫異常向量的指令(可以是開發(fā)階段就改寫,也可以在運行階段才改寫),讓CPU產(chǎn)生異常時執(zhí)行的是調(diào)試系統(tǒng)的指令,這樣調(diào)試系統(tǒng)就接管的CPU的運行。當(dāng)CPU跳轉(zhuǎn)到異常向量,并執(zhí)行異常向量的程序時,CPU會在特定的位置記錄程序返回的地址(異常的地址),并且記錄其他有用的信息,調(diào)試模塊可以獲取這些信息進(jìn)行處理。為了讓CPU執(zhí)行完異常處理后能夠返回到原來的位置,因此進(jìn)入異常后要進(jìn)行現(xiàn)場保護(hù),退出異常前再恢復(fù)現(xiàn)場。異常處理流程如下al)保護(hù)現(xiàn)場(保存異常時CPU的相關(guān)寄存器到內(nèi)存),a2)調(diào)用調(diào)試系統(tǒng)程序a3)調(diào)試系統(tǒng)程序,分析異常的類型,獲取所需要的異常前的信息,并調(diào)用其它處理子模塊進(jìn)行處理。a4)調(diào)試系統(tǒng)退出時復(fù)現(xiàn)場(從內(nèi)存中獲取,并且改寫CPU的寄存器,這樣現(xiàn)場恢復(fù)后CPU的所有寄存器就和異常前一樣,CPU如同沒有發(fā)生異常一樣),讓CPU繼續(xù)從原來的位置繼續(xù)執(zhí)行。(2)固定斷點實現(xiàn)方法固定斷點為開發(fā)人員經(jīng)常使用。開發(fā)人員在開發(fā)程序時,在希望產(chǎn)生斷點的程序位置插入一行,由調(diào)試系統(tǒng)提供固定斷點程序(例如開發(fā)人員希望程序執(zhí)行到第100行停下來,那么開發(fā)人員需要在第100行代碼中插入SET-BREAKPOINT這行程序),該固定斷點程序和其他程序被一起編譯鏈接,并被加載到目標(biāo)系統(tǒng)中運行,當(dāng)程序執(zhí)行到固定斷點位置時程序就會停下來。實際上該行程序(固定斷點程序)是一條可以產(chǎn)生異常的特殊指令,當(dāng)目標(biāo)系統(tǒng)執(zhí)行該指令會產(chǎn)生異常,而該異常會產(chǎn)生異常中斷,產(chǎn)生異常中斷后會被調(diào)試系統(tǒng)接管,后續(xù)調(diào)試系統(tǒng)就可以對系統(tǒng)進(jìn)行調(diào)試,(比如通過宏的形式來代替#defineSET—BREAKPOINTtwger2,r2,mpc8248CPU(freescale公司的一款通訊CPU)中可以是twger2,r2指令,當(dāng)CPU執(zhí)行到該指令時產(chǎn)生一個progame異常(異常向量為0x700)。在進(jìn)入異常處理前CPU會把產(chǎn)生異常指令的地址記錄在srr0寄存器中,并進(jìn)入調(diào)試模式。(記錄第100行程序的位置在srr0寄存器中,而程序繼續(xù)執(zhí)行時需要從101開始繼續(xù)執(zhí)行,因此srr0寄存器的值+4就等于斷點的下一行程序位置(在powerpc中指令每條指令占用4個字節(jié)),程序退出調(diào)試模式(斷點繼續(xù)執(zhí)行),從srr0寄存器的值+4的位置開始執(zhí)行。在進(jìn)入調(diào)試模式后,調(diào)試系統(tǒng)可以根據(jù)產(chǎn)生異常的位置(比如0x700),知道是固定斷點異常,根據(jù)srrO的值就可以知道程序執(zhí)行到何處停下來,繼續(xù)執(zhí)行時該從何處繼續(xù)執(zhí)行(srrO寄存器的值+4)。進(jìn)入調(diào)試命令模式后,以字符命令或者圖形的方式顯示斷點的位置,調(diào)試系統(tǒng)指示程序在固定斷點停下來(可以指示源代碼的位置),并等待用戶的下一步調(diào)試操作。在調(diào)試模式下等待用戶輸入命令進(jìn)行調(diào)試(比如查看內(nèi)存情況,查看寄存器狀態(tài),查看源代碼等操作)。用戶調(diào)試完畢后,希望程序從斷點繼續(xù)執(zhí)行,用戶可以通過特殊的調(diào)試命令,退出調(diào)試模式,從斷點繼續(xù)執(zhí)行(比如通過quit-breakpoint命令),調(diào)試系統(tǒng)接收到該調(diào)試命令后,進(jìn)行現(xiàn)場恢復(fù)后(恢復(fù)異常前所有相關(guān)的寄存器,保證異常前和退出異常后寄存器都一致)通過設(shè)置特殊的寄存器和執(zhí)行特定的指令,讓程序從斷點出繼續(xù)執(zhí)行。(比如在mpc8248中,設(shè)置srrO寄存器為第101行程序的地址,并且最后執(zhí)行ri指令,那么CPU就會從101行開始執(zhí)行)程序從斷點恢復(fù)后CPU進(jìn)入嵌入式模式,繼續(xù)執(zhí)行嵌入式系統(tǒng)的指令。對于不同的CPU有不同的指令來產(chǎn)生固定斷點異常,固定斷點異常時斷點保存在哪一個寄存器中不同CPU也不一樣,但是所有CPU的原理都類似,就是讓一條特殊的指令產(chǎn)生固定斷點異常,而產(chǎn)生異常時固定斷點的位置會記錄在CPU的寄存器中,調(diào)試模塊就是根據(jù)這些信息進(jìn)行調(diào)試。(3)動態(tài)斷點實現(xiàn)方法動態(tài)斷點的原理和固定斷點原理一樣,也就是在斷點處用一條特殊的指令來產(chǎn)生異常,由調(diào)試模塊捕捉和分析該異常,可以知道是動態(tài)斷點產(chǎn)生異常,并知道何處產(chǎn)生異常,程序該從何處繼續(xù)執(zhí)行;不同的地方在于動態(tài)斷點不是在程序開發(fā)的時候確定(不需要寫程序),而是等待程序運行起來后,在嵌入式模式或者調(diào)試模式下,輸入特殊的命令,添加動態(tài)斷點的位置,因此動態(tài)斷點不需要預(yù)先開發(fā),可以在程序運行后動態(tài)添加,過程如下bl)在嵌入式系統(tǒng)模式(嵌入式系統(tǒng)中需要添加一條動態(tài)斷點添加的命令)或者在調(diào)試模式下,通過某個特殊的調(diào)試命令,用戶添加一條動態(tài)斷點(例如add—breakpoing[breakpointaddress],這里的breakpointaddress可以通過查看編譯器產(chǎn)生的MAP文件-源代碼和二進(jìn)制代碼對應(yīng)關(guān)系文件,得到某一行源代碼對應(yīng)的執(zhí)行地址,或者通過后文介紹的"源代碼級別調(diào)試實現(xiàn)方法"直接查看運行時的源代碼及對應(yīng)二進(jìn)制代碼的運行地址)。b2)該添加調(diào)試動態(tài)斷點的命令,會獲取用戶輸入的動態(tài)斷點的位置(也就是breakpoingaddress)。b3)保存斷點處原來的程序指令(把breakpoingaddress對應(yīng)的指令保存起來)。b4)把斷點處指令替換成可以產(chǎn)生異常的特殊指令(比如把原來breakpointaddress位置的指令替換成mpc8248的SC指令_-系統(tǒng)調(diào)用指令)。b5)當(dāng)程序執(zhí)行到斷點處(breakpointaddress),由于執(zhí)行特殊指令,會產(chǎn)生一個異常,在進(jìn)入異常處理前CPU會把產(chǎn)生異常指令的下一條指令的地址記錄在srr0寄存器中,也就是說srr0的寄存器保留的是斷點位置+4,因此產(chǎn)生異常的指令位置為srr0寄存器值-4,并進(jìn)入調(diào)試;漠式。b6)進(jìn)入調(diào)試命令模式后,以字符命令或者圖形的方式顯示斷點的位置,調(diào)試系統(tǒng)指示程序在動態(tài)斷點停下來(可以指示源代碼的位置),并等待用戶的下一步調(diào)試操作。b7)在調(diào)試模式下等待用戶輸入命令進(jìn)行調(diào)試(比如查看內(nèi)存情況,查看寄存器狀態(tài),查看源代碼等操作)。b8)用戶調(diào)試完畢后,希望程序從斷點繼續(xù)執(zhí)行,用戶可以通過特殊的調(diào)試命令,退出調(diào)試才莫式,乂人斷點繼續(xù)扭J亍(比如通過quit—breakpoint命令),調(diào)試系統(tǒng)接收到該調(diào)試命令后,進(jìn)行現(xiàn)場恢復(fù)后(恢復(fù)異常前所有相關(guān)的寄存器,保證異常前和退出異常后寄存器都一致),還要把breakpointaddress位置的指令恢復(fù)成原來的指令(因為在用戶設(shè)置斷點時已經(jīng)設(shè)置成特殊指令),并且讓程序繼續(xù)從breakpingaddress執(zhí)行讓程序從斷點出繼續(xù)執(zhí)行。例如mpc8248的處理方法是srr0設(shè)置成原來srr0寄存器的值-4,并且調(diào)用rti返回到原來的斷點處極性執(zhí)行。b9)程序從斷點恢復(fù)后CPU進(jìn)入嵌入式模式,繼續(xù)執(zhí)行嵌入式系統(tǒng)的指令。B10)因為在退出異常時動態(tài)斷點的指令已經(jīng)被替換成正常的指令,如果下一次程序執(zhí)行到該位置就再不會產(chǎn)生斷點異常,因此需要一種方法讓它退出異常后,后續(xù)如果再執(zhí)行到該位置,仍然可以產(chǎn)生動態(tài)斷點(除非用戶刪除動態(tài)斷點),處理方法是程序重新執(zhí)行完真正的斷點處指令后,讓它產(chǎn)生一個單步跟蹤異常,在單步跟蹤異常處理中,又重新把斷點位置的指令替換成特殊指令,使它下一次能夠繼續(xù)進(jìn)行斷點跟蹤。bll)當(dāng)然動態(tài)斷點也可以刪除,刪除方法比較簡單,只要把斷點處的指令換成原來的指令就可,這樣程序指令到該位置時指令的是正常的指令,不會產(chǎn)生斷點異常。斷點就不存在。b12)對于不同的CPU有不同的指令來產(chǎn)生動態(tài)斷點異常,動態(tài)斷點異常時斷點保存在哪一個寄存器中不同CPU也不一樣,但是所有CPU的原理都類似,就是讓一條特殊的指令產(chǎn)生動態(tài)斷點異常,而產(chǎn)生異常時動態(tài)斷點的位置會記錄在CPU的寄存器中,調(diào)試模塊就是根據(jù)這些信息進(jìn)行調(diào)試。(4)單步跟蹤實現(xiàn)方法單步跟蹤的原理是通過設(shè)置CPU的特殊寄存器,讓CPU每執(zhí)行完一條指令產(chǎn)生異常,調(diào)試模塊接管該異常,調(diào)試模塊根據(jù)異常的信息知道這是單步跟蹤異常,程序執(zhí)行的位置等信息,實現(xiàn)方法如下cl)用戶在調(diào)試模式的命令下輸入單步跟蹤命令(比如輸入trance)。c2)同固定斷點和動態(tài)斷點處理類似,調(diào)試模塊退出,讓CPU從上一次斷點處繼續(xù)執(zhí)行,但是不同的地方是在退出前需要設(shè)置CPU特殊的寄存器,讓CPU每執(zhí)行完畢一條指令就會產(chǎn)生一個單步跟蹤異常,比如MPC8248的處理方法是通過MSR[SE]寄存器(該寄存器設(shè)置CPU每執(zhí)行完畢一條指令就會產(chǎn)生一個單步跟蹤異常),這里還有一個特殊的地方是,在調(diào)試模塊不直接設(shè)置MSR[SE]寄存器,因為如果直接設(shè)置MSR[SE],那么在調(diào)試模式下每執(zhí)行一條指令也會產(chǎn)生一個單步異常,這是不期望的;對于MPC8248的處理方式是設(shè)置SRR1寄存器,因為在調(diào)用rti指令是SRR1寄存器會被賦值給MSR寄存器,這樣當(dāng)程序開始從原來斷點處繼續(xù)執(zhí)行是MSR[SE]才被i殳置,因此可以產(chǎn)生單步跟蹤異常。c3)當(dāng)程序退出異常(調(diào)試模式)繼續(xù)執(zhí)行嵌入式程序時,由于CPU已經(jīng)被設(shè)置使能單步跟蹤功能,因此當(dāng)CPU每執(zhí)行完畢一條指令就會產(chǎn)生單步跟蹤異常。c4)在進(jìn)入異常處理前CPU會把下一條指令的地址記錄在srr0寄存器中。c5)進(jìn)入調(diào)試模式,清楚CPU的單步跟蹤異常使能位,讓CPU退出調(diào)試模式繼續(xù)運行用戶模式時不會繼續(xù)產(chǎn)生單步跟蹤。c6)進(jìn)入調(diào)試命令模式后,以字符命令或者圖形的方式顯示斷點的位置,調(diào)試系統(tǒng)指示程序在單步跟蹤位置(可以指示源代碼的位置),并等待用戶的下一步調(diào)試4喿作。c7)在調(diào)試模式下等待用戶輸入命令進(jìn)行調(diào)試(比如查看內(nèi)存情況,查看寄存器狀態(tài),查看源代碼等操作)。c8)用戶調(diào)試完畢后,希望程序從斷點繼續(xù)執(zhí)行,用戶可以通過特殊的調(diào)試命令,退出調(diào)試模式,從斷點繼續(xù)執(zhí)行(比如通過quit-breakpoint命令),由于srrO保存的斷點處下一條將要執(zhí)行的指令,因此退出異常時程序直接從srr0指示的位置繼續(xù)執(zhí)行。c9)程序從斷點恢復(fù)后CPU進(jìn)入嵌入式模式,繼續(xù)執(zhí)行嵌入式系統(tǒng)的指令。clO)對于不同的CPU有使能CPU單步跟蹤功能的方法不一樣,異常時斷點保存在哪一個寄存器中不同CPU也不一樣,但是所有CPU的原理都類似,就是使能CPU的單步跟蹤功能(要求CPU支持該功能),讓CPU每執(zhí)行一條指令產(chǎn)生一次單步跟蹤異常,而產(chǎn)生異常時斷點的位置會記錄在CPU的寄存器中,調(diào)試才莫塊就是根據(jù)這些信息進(jìn)行調(diào)試。cll)以上所訴的單步跟蹤指的時指令級的單步跟蹤,很多源代碼級別的單步跟蹤(每執(zhí)行完畢一行源代碼才停下來,而一條源代碼可以對應(yīng)多條指令)可以通過添加、刪除動態(tài)斷點的方式來實現(xiàn)(在每行源代碼的位置自動添加一個動態(tài)斷點),不同的動態(tài)斷點的刪除和添加都是通過調(diào)試模塊實現(xiàn),無需通過用戶來操作。(5)數(shù)據(jù)監(jiān)視實現(xiàn)方法數(shù)據(jù)監(jiān)視的方法是通過設(shè)置CPU的特殊寄存器(要求CPU支持該功能),當(dāng)程序訪問指定位置的數(shù)據(jù)是,會產(chǎn)生數(shù)據(jù)監(jiān)視異常,調(diào)試模塊可以獲取產(chǎn)生異常的指令的位置,以及產(chǎn)生異常時訪問數(shù)據(jù)的地址以及訪問方式,有這些信息調(diào),試模塊就能把結(jié)果顯示給用戶。dl)在嵌入式系統(tǒng)模式(嵌入式系統(tǒng)中需要添加一條數(shù)據(jù)監(jiān)視的命令)或者在調(diào)試模式下,通過個添加數(shù)據(jù)監(jiān)視命令,用戶添加一條數(shù)據(jù)監(jiān)視點(例如add-data_watchpoint[watchpointaddress][mode])d2)該添加數(shù)據(jù)監(jiān)視點的命令獲取用戶輸入的監(jiān)^L的地址(watchpointaddress)和監(jiān)視方式(mode))d3)根據(jù)地址和監(jiān)視方式,設(shè)置CPU的數(shù)據(jù)監(jiān)視寄存器,讓CPU訪問該地址時產(chǎn)生數(shù)據(jù)監(jiān)視異常,(例如在mpc8248通過設(shè)置DABR/DABM/DBCR寄存器,可以用來監(jiān)^f見數(shù)據(jù)存儲,當(dāng)CPU訪問的地址和該寄存器的地址相等時,就會產(chǎn)生異常,異常地址為0x300.)d4)當(dāng)程序訪問監(jiān)視地址時,CPU會產(chǎn)生數(shù)據(jù)監(jiān)視異常。d5)CPU在進(jìn)入異常前會記錄產(chǎn)生異常是指令地址記錄和訪問的數(shù)據(jù)地址記錄在特定的寄存器中。d6)調(diào)試模塊接管異常處理,并且獲取產(chǎn)生異常指令的地址,以及訪問數(shù)據(jù)的地址,進(jìn)入調(diào)試模式把訊息顯示給用戶,并等待用戶的下一步調(diào)試操作。d7)在調(diào)試模式下等待用戶輸入命令進(jìn)行調(diào)試(比如查看內(nèi)存情況,查看寄存器狀態(tài),查看源代碼等操作)。d8)對于不同的CPU有使能設(shè)置數(shù)據(jù)監(jiān)視地址和監(jiān)視方式的方法或者指令以及對應(yīng)的寄存器地址都不同。d9)和添加相對應(yīng),用戶可以通過命令刪除數(shù)據(jù)監(jiān)視點,刪除的方法就是通過清除數(shù)據(jù)監(jiān)視寄存器,讓CPU不使能數(shù)據(jù)監(jiān)視功能。(6)指令監(jiān)視實現(xiàn)方法指令監(jiān)視的方法是通過設(shè)置CPU的特殊寄存器(要求CPU支持該功能),當(dāng)該位置的指令被執(zhí)行時,會產(chǎn)生指令監(jiān)視異常,調(diào)試模塊可以獲取產(chǎn)生異常的指令的位置,試模塊就能把結(jié)果顯示給用戶。el)在嵌入式系統(tǒng)模式(嵌入式系統(tǒng)中需要添加一條指令監(jiān)視的命令)或者在調(diào)試模式下,通過個添加指令監(jiān)視命令,用戶添加一條指令監(jiān)視點(例如add-instruction—watchpoint[watchpointaddress][mode])。e2)該添加指令監(jiān)視點的命令獲取用戶輸入的監(jiān)一見的地址(watchpointaddress)。e3)設(shè)置CPU的指令監(jiān)視寄存器,讓CPU執(zhí)行該地址的指令時產(chǎn)生指令監(jiān)視異常,(例如在mpc8248通過設(shè)置IABR/IABR2/IBCR寄存器,可以用來監(jiān)視指令執(zhí)行,當(dāng)CPU執(zhí)行指令的地址和該寄存器的地址相等時,就會產(chǎn)生異常,異常地址為0x1300.)。e4)當(dāng)程序執(zhí)行該地址的指令時,CPU會產(chǎn)生指令監(jiān)視異常。e5)CPU在進(jìn)入異常前會記錄產(chǎn)生異常是指令地址記錄在特定的寄存器中。e6)調(diào)試模塊接管異常處理,并且獲取產(chǎn)生異常指令的地址,并等待用戶的下一步調(diào)試操作。e7)在調(diào)試^^莫式下等待用戶輸入命令進(jìn)行調(diào)試(比如查看內(nèi)存情況,查看寄存器狀態(tài),查看源代碼等操作)。e8)對于不同的CPU有使能設(shè)置指令監(jiān)視地址或者指令以及對應(yīng)的寄存器地址者卩不同。e9)和添加相對應(yīng),用戶可以通過命令刪除指令監(jiān)視點,刪除的方法就是通過清除指令監(jiān)視寄存器,讓CPU不使能指令監(jiān)視功能。為配合實現(xiàn)調(diào)試模塊的以上功能,調(diào)試模塊中的調(diào)試功能子才莫塊還包括有用于實現(xiàn)反匯編的反匯編處理子模塊,用于實現(xiàn)源代碼級別調(diào)試的源代碼調(diào)試子模塊以及用于查看斷點處程序執(zhí)行的過程的路徑跟蹤調(diào)試子模塊,以及用戶訪問和修改嵌入式操作單元的數(shù)據(jù)訪問子模塊中的任一種或其任意組合,以配合固定斷點處理子模塊、動態(tài)斷點處理子模塊、單步跟蹤處理子模塊、數(shù)據(jù)監(jiān)^L處理子模塊或指令監(jiān)^L處理子模塊以完成調(diào)試工作。如圖6所示,調(diào)試模塊中的調(diào)試功能子模塊B還包括反匯編處理子模塊B6、源代碼調(diào)試子模塊B7及路徑跟蹤調(diào)試子模塊B8,數(shù)據(jù)訪問子模塊B9。相應(yīng)地為實現(xiàn)上述實施例中的固定斷點方法、動態(tài)斷點實現(xiàn)方法、單步跟蹤實現(xiàn)方法、數(shù)據(jù)監(jiān)視實現(xiàn)方法或指令監(jiān)視實現(xiàn)方法,還需要有反匯編實現(xiàn)方法、源代碼調(diào)試實現(xiàn)方法、數(shù)據(jù)訪問實現(xiàn)方法、和/或路徑跟蹤實現(xiàn)方法。如系統(tǒng)暫停后,用戶可以通過調(diào)試命令的方式觸發(fā)匯編、源代碼調(diào)試子才莫塊查看斷點處或者其他位置的程序的匯編或者源代碼,用戶可以通過調(diào)試命令的方式觸發(fā)路徑跟蹤子模塊,查看斷點處系統(tǒng)運行的過程,可以通過數(shù)據(jù)訪問子模塊查看/修改嵌入式操作單元的數(shù)據(jù)。下面分別對反匯編實現(xiàn)方法、源代碼調(diào)試實現(xiàn)方法、以及路徑跟蹤實現(xiàn)方法,數(shù)據(jù)訪問實現(xiàn)方法進(jìn)行描述。(7)反匯編實現(xiàn)方法程序執(zhí)行的都是二進(jìn)制代碼,但是每個CPU能執(zhí)行的指令,指令都有固定的格式,根據(jù)這個格式可以匯編指令翻譯成二進(jìn)制代碼,也可以把二進(jìn)制代碼翻譯成匯編代碼。實現(xiàn)過程如下fl)在嵌入式系統(tǒng)模式(嵌入式系統(tǒng)中需要添加一條反匯編命令)或者在調(diào)試模式下,用戶輸入一條反匯編命令,并且指明需要反匯編代碼的位置(例如assemble[instructionaddress])。f2)讀取指定位置的指令內(nèi)存中的指令。f3)根據(jù)CPU指令格式,把該二進(jìn)制指令翻譯成匯編指令,并且顯示給用戶。f4)可以在調(diào)試模式直接反匯編斷點處的指令,這時用戶不用指定反匯編地址,因為調(diào)試才莫塊已經(jīng)知道斷點的位置。其中不同的CPU指令格式不同。(8)源代碼調(diào)試實現(xiàn)方法在編譯程序時可以通過設(shè)置編譯器的選項讓編譯器編譯鏈接產(chǎn)生的文件有附帶源y氏碼信息,也就是該文件會記錄每條二進(jìn)制代碼對應(yīng)的源代碼的位置,以及源代碼的內(nèi)容,這樣就可以根據(jù)程序執(zhí)行的位置找到對應(yīng)的源代碼,如果要支持該功能嵌入式系統(tǒng)中還需要保存該文件。gl)在嵌入式系統(tǒng)模式(嵌入式系統(tǒng)中需要添加一條源代碼調(diào)試命令)或者在調(diào)試才莫式下,用戶輸入一條源代碼調(diào)試命令,并且指明需要調(diào)試代碼的位置(例如source[instructionaddress])。g2)讀取指定位置的指令內(nèi)存中的指令(instructionaddress)。g3)查找二進(jìn)制代碼和源代碼對應(yīng)關(guān)系的文件,找到源代碼,并且把源代碼信息顯示給用戶。g4)可以在調(diào)試模式直接查看斷點處的源代碼,這時用戶不用指定指令地址,因為調(diào)試模塊已經(jīng)知道斷點的位置。(9)路徑跟蹤調(diào)試實現(xiàn)方法當(dāng)程序執(zhí)行到斷點時,CPU只知道斷點指令的位置,但是不知道程序調(diào)用的過程,也就是說該斷點對應(yīng)的函數(shù)是被什么函數(shù)調(diào)用的,路徑跟蹤就是要知道斷點位置的程序是被什么上級函數(shù)調(diào)用,它的函數(shù)又被什么函數(shù)調(diào)用,依此類推直到找到整個調(diào)用過程的源頭,反過來可以知道從源頭一直到斷點函數(shù)調(diào)用關(guān)系。路徑跟蹤實現(xiàn)過程如下hl)用戶通過如上介紹的功能模塊或者命令,設(shè)置斷點(動態(tài)或者固定),或者設(shè)置數(shù)據(jù)或者指令監(jiān)視,導(dǎo)致CPU產(chǎn)生異常。h2)CPU產(chǎn)生異常后調(diào)試模塊接管異常,并按如上描述的功能對異常進(jìn)行處理。h3)CPU獲取異常指令的位置。獲取SP堆棧信息,則-sp的值指向上一個函數(shù)的堆棧指針,"sp指向上上一個堆棧指針,以次類推,而"sp+4)指向上一個函數(shù),*(*sp+4)指向上上一個函數(shù),以次類推,獲取調(diào)用路徑對應(yīng)的指令地址,通過反匯編模塊或者源代碼查看模塊再顯示處調(diào)用過程對應(yīng)的匯編代碼或者源代碼。(10)數(shù)據(jù)訪問實現(xiàn)方法用戶輸入命令后,該命令直接使用向指定的空間寫入、讀出數(shù)據(jù),并且把結(jié)果顯示給用戶。對于不同CPU,不同空間的寫入和讀出方法不一樣。也可以采用嵌入式才喿作單元提供的接口,訪問或者修改嵌入式操作單元數(shù)據(jù)。本領(lǐng)域普通技術(shù)人員可以理解(1)實現(xiàn)上述方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲于一計算機(jī)可讀取存儲介質(zhì)中,該程序在執(zhí)行時,4丸行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括R0M、RAM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。(2)以上實施例所述的調(diào)試單元不僅可以在具有嵌入式操作系統(tǒng)的嵌入式系統(tǒng)中實現(xiàn),也可以在具有通用操作系統(tǒng)的通用系統(tǒng)中實現(xiàn),或在棵機(jī)中實現(xiàn),只要在添加調(diào)試單元后,不影響正常的程序(目標(biāo)設(shè)備被最終用戶實際使用的程序)的情況均屬于本發(fā)明保護(hù)的范圍。(3)上述實施例中所描述的調(diào)試單元的功能以及功能模塊僅用于說明內(nèi)嵌調(diào)^>器的嵌入式系統(tǒng)及嵌入式系統(tǒng)調(diào)試方法,而非限制,可以根據(jù)實際需要,如嵌入式操作單元及目標(biāo)設(shè)備的類型,減少或擴(kuò)展調(diào)試功能,或者結(jié)合多種功能模塊實現(xiàn)更加高級的調(diào)試功能。(4)本發(fā)明不局限于調(diào)試單元與嵌入式操作單元完全獨立的情況,調(diào)試單元也可以與嵌入式操作單元共用嵌入式操作系統(tǒng)及驅(qū)動模塊。本發(fā)明不局限于目標(biāo)設(shè)備的類型以及目標(biāo)設(shè)備的處理器的類型,目標(biāo)設(shè)備可以為計算機(jī)、手機(jī)終端或路由器等,目標(biāo)設(shè)備的處理器可以為嵌入式CPU,也可以是通用CPU,或者數(shù)字信號處理器(DigitalSignalProcessing,簡稱DSP),或者其它具有可編程能力的器件。(5)上述實施例中,不同類型的CPU可以采用不同異常處理方式,即使針對同一類型的CPU,如powerpc,也可以采用不同的異常處理方式。(6)上述實施例中,調(diào)試界面用于獲取用戶的調(diào)試請求,顯示調(diào)試結(jié)果信息,本發(fā)明不限制采用何種實現(xiàn)方式,可以使用如DOS調(diào)試命令的方式,也可以采用windows可^/f匕調(diào)i式界面。綜上所述,本發(fā)明一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng)及嵌入式系統(tǒng)調(diào)試方法的實施例具有以下有益效果(1)通過在嵌入式系統(tǒng)中內(nèi)嵌調(diào)試單元,使得處于目標(biāo)設(shè)備上的嵌入式系統(tǒng),同時包括嵌入式操作單元以及調(diào)試單元,以實現(xiàn)在嵌入式系統(tǒng)上直接對軟件和/或硬件進(jìn)行調(diào)試,從而降低了設(shè)置額外硬件和/或開發(fā)額外的軟件而導(dǎo)致的成本,方便大規(guī);f莫的推廣應(yīng)用。同時由于嵌入式操作單元與調(diào)試單元位于同一目標(biāo)設(shè)備上,因此當(dāng)嵌入式操作單元出現(xiàn)故障或需調(diào)試時,可以直接利用調(diào)試單元進(jìn)入調(diào)試模式,從而加快了疑難問題的解決速度。(2)嵌入式系統(tǒng)中的調(diào)試單元與嵌入式操作單元相互獨立,調(diào)試單元的存在不會影響原有的嵌入式系統(tǒng),因此實際系統(tǒng)中可以帶調(diào)試單元,以實現(xiàn)直接在實際系統(tǒng)上對軟件和/或硬件的故障診斷和調(diào)試。(3)對現(xiàn)有的嵌入式系統(tǒng)JLit簡單易行。(4)支持在現(xiàn)場環(huán)境對軟硬件已知和未知故障進(jìn)行診斷和分析,以及支持在現(xiàn)場環(huán)境對未知通訊協(xié)議的分析和診斷,方便開發(fā)人員和維護(hù)人員使用。最后應(yīng)說明的是以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述實施例對本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解其依然可以對前述各實施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精神和范圍。權(quán)利要求1、一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng),包括嵌入式操作單元,其特征在于還包括調(diào)試單元,與所述嵌入式操作單元連接;所述調(diào)試單元包括驅(qū)動模塊以及與驅(qū)動模塊連接的調(diào)試模塊;驅(qū)動模塊,用于控制調(diào)試命令的輸入和輸出;調(diào)試模塊,用于觸發(fā)嵌入式操作單元產(chǎn)生異常,捕獲異常,以及對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。2、根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng),其特征在于,還包括調(diào)試界面,所述驅(qū)動模塊與所述調(diào)試界面連接,用于控制調(diào)試界面的顯示和調(diào)試命令的輸入;所述調(diào)試模塊與所述調(diào)試界面連接,用于接收并響應(yīng)由所述調(diào)試界面發(fā)送的調(diào)試命令。3、根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng),其特征在于,所述嵌入式操作單元包括通知模塊,用于向所述調(diào)試單元發(fā)送調(diào)試命令。4、根據(jù)權(quán)利要求l所述的嵌入式系統(tǒng),其特征在于,所述調(diào)試模塊包括異常處理子模塊,用于捕獲異常,對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型將異常信息發(fā)送至調(diào)試功能子才莫塊;調(diào)試功能子模塊,用于觸發(fā)嵌入式操作單元產(chǎn)生異常,并與所述異常處理子模塊連接,用于采用所述調(diào)試功能子模塊內(nèi)的預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。5、根據(jù)權(quán)利要求4所述的嵌入式系統(tǒng),其特征在于,所述調(diào)試功能子模塊包括固定斷點處理子模塊、動態(tài)斷點處理子模塊、單步跟蹤處理子模塊、數(shù)據(jù)監(jiān)視處理子模塊、和/或指令監(jiān)視處理子模塊。6、根據(jù)權(quán)利要求5所述的嵌入式系統(tǒng),其特征在于,所述調(diào)試功能子模塊還包括反匯編處理子模塊、源代碼調(diào)試子模塊、數(shù)據(jù)訪問子模塊、和/或路徑跟蹤調(diào)試子模塊。7、一種嵌入式系統(tǒng)調(diào)試方法,其特征在于,包括調(diào)試^i塊觸發(fā)嵌入式操作單元產(chǎn)生異常;調(diào)試模塊捕獲異常,對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法;調(diào)試模塊采用所述預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。8、根據(jù)權(quán)利要求7所述的調(diào)試方法,其特征在于,在調(diào)試模塊對目標(biāo)設(shè)備和嵌入式操作單元的訪問和/或控制之前還包括驅(qū)動模塊或嵌入式操作單元向調(diào)試模塊輸入調(diào)試命令。9、根據(jù)權(quán)利要求7所述的調(diào)試方法,其特征在于,所述預(yù)設(shè)方法包括固定斷點實現(xiàn)方法、動態(tài)斷點實現(xiàn)方法、單步跟蹤實現(xiàn)方法、數(shù)據(jù)監(jiān)視實現(xiàn)方法和/或指令監(jiān)視實現(xiàn)方法。10、根據(jù)權(quán)利要求9所述的調(diào)試方法,其特征在于,所述預(yù)設(shè)方法還包括反匯編實現(xiàn)方法、源代碼調(diào)試實現(xiàn)方法、數(shù)據(jù)訪問實現(xiàn)方法、和/或路徑跟蹤實現(xiàn)方法。全文摘要本發(fā)明涉及一種內(nèi)嵌調(diào)試器的嵌入式系統(tǒng),包括嵌入式操作單元,其中還包括調(diào)試單元,與嵌入式操作單元連接;調(diào)試單元包括驅(qū)動模塊以及與驅(qū)動模塊連接的調(diào)試模塊;驅(qū)動模塊,用于控制調(diào)試命令的輸入和輸出;調(diào)試模塊,用于觸發(fā)嵌入式操作單元產(chǎn)生異常,捕獲異常,以及對異常信息進(jìn)行分析處理,根據(jù)異常信息的類型選擇預(yù)設(shè)方法對嵌入式操作單元中的硬件和/或軟件進(jìn)行調(diào)試。本發(fā)明還涉及一種嵌入式系統(tǒng)調(diào)試方法。本發(fā)明通過在嵌入式系統(tǒng)中內(nèi)嵌調(diào)試單元,以實現(xiàn)在嵌入式系統(tǒng)上直接對軟件和/或硬件進(jìn)行調(diào)試,從而降低了設(shè)置額外硬件和/或開發(fā)額外的軟件而導(dǎo)致的成本,方便大規(guī)模的推廣應(yīng)用。文檔編號G06F11/36GK101122880SQ20071012186公開日2008年2月13日申請日期2007年9月17日優(yōu)先權(quán)日2007年9月17日發(fā)明者王龍順申請人:福建星網(wǎng)銳捷網(wǎng)絡(luò)有限公司