GDBstub的剖析與改進(jìn)_第1頁(yè)
GDBstub的剖析與改進(jìn)_第2頁(yè)
GDBstub的剖析與改進(jìn)_第3頁(yè)
GDBstub的剖析與改進(jìn)_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、GDBstub的剖析與改進(jìn)黃紅燕,史 烈 時(shí)間:2008年05月27日 字 體: 大 中 小關(guān)鍵詞:摘要:關(guān)鍵詞: 遠(yuǎn)程調(diào)試 stub GDBserver KGDB 嵌入式系統(tǒng)調(diào)試1 RSP協(xié)議GDB RSP(Remote Serial Protocol)定義了GDB宿主機(jī)與被調(diào)試目標(biāo)機(jī)進(jìn)行通信時(shí)數(shù)據(jù)包的格式。信息的格式是:數(shù)據(jù)#校驗(yàn)碼。多數(shù)信息使用ASCII碼,數(shù)據(jù)由一系列的ASCII碼組成,校驗(yàn)碼是由兩個(gè)16進(jìn)制數(shù)組成的單字節(jié)校驗(yàn)碼。接收方接收數(shù)據(jù)并校驗(yàn),若正確則回應(yīng)“”,否則回應(yīng)“”。通信的內(nèi)容包括讀寫數(shù)據(jù)、控制程序運(yùn)行、報(bào)告程序狀態(tài)等命令。RSP的基本命令從通信對(duì)話角度可以分為兩種:(

2、1)請(qǐng)求?:讀當(dāng)前系統(tǒng)狀態(tài)g:讀所有寄存器 Gregister_data:寫所有寄存器maddress,length:讀內(nèi)存Maddress,length:memory_data:寫內(nèi)存c:繼續(xù)執(zhí)行s:?jiǎn)尾綀?zhí)行k:終止進(jìn)程(2)答復(fù)“”:告訴GDB上次請(qǐng)求命令不支持。E:告訴GDB出錯(cuò)OK:上次請(qǐng)求正確 Wexit_status:系統(tǒng)在“exit_status”狀態(tài)下退出。Xsignal:系統(tǒng)在signal信號(hào)下終止。Ssignal:系統(tǒng)在signal信號(hào)下停止。O:告訴GDB控制臺(tái)輸出,這也是惟一向GDB發(fā)出的命令。2 GDB遠(yuǎn)程調(diào)試功能調(diào)試內(nèi)核時(shí)通常還沒有文件系統(tǒng),而且多數(shù)嵌入式系統(tǒng)由于自

3、身資源的限制不具備文件系統(tǒng),因此將與文件系統(tǒng)有關(guān)的源文件、目標(biāo)文件及符號(hào)表都存放在主機(jī)上,由主機(jī)上的調(diào)試器處理。同樣,調(diào)試用的輸入輸出設(shè)備也是由主機(jī)提供。主機(jī)上的調(diào)試器接收用戶輸入的調(diào)試命令并進(jìn)行預(yù)處理,對(duì)于某些命令(如breakpoint)的處理在主機(jī)GDB上實(shí)現(xiàn),不需要與目標(biāo)機(jī)通信。當(dāng)然,更多的指令需要在目標(biāo)機(jī)調(diào)試代理上實(shí)現(xiàn)。主機(jī)根據(jù)RSP對(duì)預(yù)處理之后的命令進(jìn)行封裝,發(fā)送給目標(biāo)機(jī)上的調(diào)試代理,調(diào)試代理接收命令后作相應(yīng)的處理,并返回信息給主機(jī)上的調(diào)試器。3 目標(biāo)機(jī)上stub的實(shí)現(xiàn)目標(biāo)機(jī)上stub的基本功能是與主機(jī)GDB通信,實(shí)現(xiàn)讀寫內(nèi)存、寄存器,stop、continue指令。主機(jī)GDB與目

4、標(biāo)機(jī)上stub通信的通用模型如圖2。目標(biāo)機(jī)與主機(jī)通過(guò)硬件連接,被調(diào)試部分插入stub,GDB與被調(diào)試部分通過(guò)RSP通信。根據(jù)stub所處層的不同實(shí)現(xiàn)不同層的調(diào)試,包括內(nèi)核層、應(yīng)用層的調(diào)試。3.1 內(nèi)核層調(diào)試模型內(nèi)核層調(diào)試模型如圖3,將stub插入到內(nèi)核可以實(shí)現(xiàn)內(nèi)核的調(diào)試。Linux內(nèi)核調(diào)試機(jī)制KGDB就是使用這種模式。KGDB可以分為初始化模塊和控制模塊。控制模塊與主機(jī)GDB通信的具體流程如圖4。KGDB只調(diào)試內(nèi)核態(tài)程序。handle_exception函數(shù)首先判斷CPU是否處于VM86模式或用戶態(tài),若是則返回;然后接收GDB發(fā)來(lái)的信息,根據(jù)接收的信息作出相應(yīng)的操作和回復(fù)。流程圖內(nèi)的虛線框是所

5、有GDBstub中handle_exception函數(shù)的通用流程。3.2 應(yīng)用程序調(diào)試模型在嵌入式Linux開發(fā)領(lǐng)域中調(diào)試應(yīng)用程序常用調(diào)試代理工具GDBserver。其工作原理不是在被調(diào)試應(yīng)用程序內(nèi)編譯stub,而是把被調(diào)試程序作為GDBserver的子進(jìn)程,這樣GDBserver可以利用內(nèi)核提供的代碼跟蹤機(jī)制(ptrace)監(jiān)控被調(diào)試進(jìn)程的運(yùn)行,從而完成調(diào)試任務(wù)。此工作原理與GDB本地調(diào)試相似。其調(diào)試模型如圖5。GDBserver的工作流程是:GDBserver創(chuàng)建子進(jìn)程綁定跟蹤ptrace(ptrace_traceme,)從主機(jī)傳來(lái)的各種調(diào)試命令通過(guò)GDBserver轉(zhuǎn)化為各種操作需求的p

6、trace。如果用GDBserver進(jìn)行遠(yuǎn)程調(diào)試,需要內(nèi)核操作系統(tǒng)的支持,包括子進(jìn)程、代碼跟蹤機(jī)制,這樣其他嵌入式系統(tǒng)內(nèi)核工作量會(huì)較大。而且ptrace也有其局限性,例如只能跟蹤子進(jìn)程,在調(diào)試進(jìn)程與被調(diào)試進(jìn)程之間傳送一個(gè)長(zhǎng)字的數(shù)據(jù)。使用通用的調(diào)試模式工作量會(huì)更小。如圖6,在應(yīng)用程序中編譯stub,并在應(yīng)用程序入口處插入斷點(diǎn),程序開始將控制權(quán)交給GDB,之后的流程與內(nèi)核層調(diào)試類似。4 不修改內(nèi)核前提下調(diào)試應(yīng)用程序GDB設(shè)置斷點(diǎn)的方式是使用內(nèi)存的讀寫,即將原指令用一個(gè)trap指令代替,使程序執(zhí)行到該指令時(shí)產(chǎn)生單步調(diào)試中斷,然后進(jìn)入異常處理函數(shù),針對(duì)調(diào)試器的各種操作處理函數(shù)作出相應(yīng)的操作。不同的系統(tǒng)

7、提供不同的調(diào)試異常指令,如int3、trap2等。為了使用硬件平臺(tái)提供的斷點(diǎn)指令實(shí)現(xiàn)GDBstub調(diào)試功能,需要改寫這些指令異常處理函數(shù)。因此一般的調(diào)試系統(tǒng)器或調(diào)試代理都要涉及單步調(diào)試指令的處理函數(shù),需要系統(tǒng)內(nèi)核的支持。上面提到的KGDB修改了異常處理函數(shù),GDBserver需要系統(tǒng)內(nèi)核提供ptrace函數(shù)。這種方法存在一些不足:修改內(nèi)核工作量大,移植性差。針對(duì)這些情況可以采用另一種斷點(diǎn)實(shí)現(xiàn)方案:在stub中定義一個(gè)設(shè)置斷點(diǎn)函數(shù)。斷點(diǎn)函數(shù)模擬調(diào)試異常指令,保護(hù)現(xiàn)場(chǎng)、調(diào)用異常處理函數(shù)、恢復(fù)現(xiàn)場(chǎng)并將控制權(quán)交給被調(diào)試程序。斷點(diǎn)函數(shù)的基本流程如下。#define BREAKPOINT _asm_ _v

8、olatile_(bl ent_exceptionn)void debug_trap( ) _asm_ _volatile_(ent_exception: n保存現(xiàn)場(chǎng)bl handle_exception nout_exception: n恢復(fù)現(xiàn)場(chǎng));handle_exception( )流程類似圖4中的虛線框部分,實(shí)現(xiàn)的關(guān)鍵是斷點(diǎn)指令的替換。斷點(diǎn)設(shè)置時(shí),從GDB傳來(lái)硬件平臺(tái)提供的斷點(diǎn)異常指令的二進(jìn)制碼,必須將此二進(jìn)制碼替換成stub中新定義的BREAKPOINT二進(jìn)制碼,才能進(jìn)入調(diào)試異常處理函數(shù)。因此在handle_exception( )中,如果收到的請(qǐng)求是“M”,則需要處理數(shù)據(jù),流程如圖7。這種方法理論上在內(nèi)核調(diào)試和應(yīng)用程序調(diào)試中都可以使用,但在應(yīng)用程序的調(diào)試中優(yōu)點(diǎn)更明顯。在寫stub時(shí)不涉及內(nèi)核,在調(diào)試應(yīng)用程序時(shí)不需切換到內(nèi)核模式下,直接在用戶模式中即可完成。此方法也存在不足之處。為了實(shí)現(xiàn)現(xiàn)場(chǎng)保護(hù),要求用戶了解系統(tǒng)內(nèi)的寄存器。隨著stub本身復(fù)雜度的增加,其正確性需要更多的檢驗(yàn)。加stub的遠(yuǎn)程調(diào)試方法方便而有效,而且可以降低項(xiàng)目成本,在實(shí)際工作中得到廣泛的應(yīng)用。在不修改內(nèi)核前提

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論