王 爽,康慕寧
(西北工業(yè)大學(xué)計算機學(xué)院,西安710129)
基于Eclipse平臺的嵌入式遠程調(diào)試軟件實現(xiàn)
王 爽,康慕寧
(西北工業(yè)大學(xué)計算機學(xué)院,西安710129)
傳統(tǒng)嵌入式系統(tǒng)大多采用命令行打印的方式進行開發(fā)調(diào)試,導(dǎo)致開發(fā)周期延長。針對這個問題,基于Eclipse平臺和CDT插件設(shè)計并實現(xiàn)了一套可視化的嵌入式遠程調(diào)試軟件。主機端的調(diào)試總控通過MI接口封裝通用調(diào)試器GDB,按照DWARF調(diào)試信息格式提取目標文件中的調(diào)試信息,并通過RSP協(xié)議發(fā)送調(diào)試命令,目標機端的調(diào)試代理負責(zé)接收并處理調(diào)試命令。著重分析了調(diào)試總控的設(shè)計和調(diào)試代理的實現(xiàn)要點,最終實現(xiàn)了對MPC8270上目標程序的源碼級遠程調(diào)試。
嵌入式;調(diào)試代理;遠程調(diào)試;GDB調(diào)試器
隨著嵌入式軟件開發(fā)規(guī)模的不斷擴大,如何高效地對嵌入式軟件進行調(diào)試成為系統(tǒng)開發(fā)中的一個難題。由于嵌入式系統(tǒng)本身的計算能力、存儲能力、外設(shè)資源都非常有限,在嵌入式MCU上運行一個調(diào)試器是不太現(xiàn)實的。在很長一段時間內(nèi),開發(fā)人員大都使用串口打印輸出到命令行的方式進行調(diào)試,這種調(diào)試手段嚴重延長了軟件的開發(fā)周期,在主機端上的IDE進行遠程調(diào)試逐漸成為一個發(fā)展趨勢。遠程調(diào)試采用主機/目標機交叉的方式進行,調(diào)試器運行在主機端,被調(diào)試程序運行在目標機端,主機端的調(diào)試器通過串口或網(wǎng)絡(luò)與目標機通信,控制目標機上被調(diào)試程序的運行,實現(xiàn)對目標文件的調(diào)試。
GNU開源組織發(fā)布的GDB(GNU Debugger)是一個強大的通用程序調(diào)試工具[1],它對本地調(diào)試和遠程調(diào)試都提供支持。GDB支持CLI(Command Line Interface)和MI(Machine Interface)兩種外部調(diào)試工具接口。Eclipse是利用MI方法支持C語言源碼級調(diào)試最好的開源工具[2],故在Eclipse平臺的基礎(chǔ)上使用CDT插件開發(fā)遠程調(diào)試器圖形前端,利用GDB/MI接口封裝GDB,使圖形前端能夠和GDB相互通信,在目標機端搭建調(diào)試代理模塊,最終構(gòu)建了一個可視化的嵌入式遠程調(diào)試軟件,不僅提高了開發(fā)效率,而且減少了軟件成本。
嵌入式遠程調(diào)試軟件主要由主機端的調(diào)試器和目標機端的調(diào)試代理組成,主機調(diào)試器與調(diào)試代理通過遠程調(diào)試通信協(xié)議RSP進行通信[3]。主機調(diào)試器按照DWARF調(diào)試信息格式提取目標文件中的調(diào)試信息,根據(jù)RSP協(xié)議把要發(fā)送的調(diào)試命令封裝成數(shù)據(jù)包,通過通信接口如網(wǎng)口或串口發(fā)送給調(diào)試代理以及接收調(diào)試代理發(fā)送的調(diào)試信息數(shù)據(jù)包,并且在Eclipse圖形界面上顯示相應(yīng)的調(diào)試信息。調(diào)試代理接收并解析用戶的遠程調(diào)試命令,根據(jù)調(diào)試命令控制被調(diào)試程序的運行,并且把調(diào)試信息封裝成數(shù)據(jù)包發(fā)送給主機調(diào)試器。
CDT插件為Eclipse提供了C/C++程序的編輯、編譯、運行及本地調(diào)試功能[4]。為滿足嵌入式遠程調(diào)試的需求,需要對Eclipse的調(diào)試模塊進行功能擴展,使擴展后的CDT插件能夠調(diào)用GDB對目標機上的被調(diào)試程序進行遠程調(diào)試。主要擴展的部分如下:①調(diào)試器遠程連接部分。遠程連接目標機,首先需要配置遠程調(diào)試信息,如:連接方式、目標機IP地址、端口號等,然后遠程調(diào)試器利用配置信息連接調(diào)試代理,連接成功則建立調(diào)試會話,若遇異常則退出。②遠程調(diào)試信息處理部分。根據(jù)遠程調(diào)試時返回的調(diào)試信息格式進行信息解析、提取和存儲,根據(jù)視圖要求實時顯示調(diào)試信息。③調(diào)試管理部分。接收圖形界面中的配置信息,負責(zé)發(fā)送調(diào)試信息及調(diào)試命令至GDB。遠程調(diào)試軟件結(jié)構(gòu)如圖1所示。
圖1 遠程調(diào)試軟件結(jié)構(gòu)
3.1 調(diào)試信息提取
調(diào)試信息是GCC編譯器在編譯時從源文件中收集的信息,包括文件名、函數(shù)名、函數(shù)參數(shù)、函數(shù)入口地址、變量名、變量類型、行號以及對應(yīng)的地址等等,然后按照DWARF(Debugging With Attributed Record Formats)調(diào)試信息格式寫入到目標文件中[5]。遠程調(diào)試器在工作時能夠從目標文件中提取調(diào)試信息,建立源代碼和目標文件之間的對應(yīng)關(guān)系。
調(diào)試信息主要分布在ELF文件中的以.debug_ *開頭的節(jié),其中.debug_info節(jié)和.debug_line節(jié)中的調(diào)試信息是關(guān)鍵信息,.debug_info節(jié)保存的內(nèi)容是文件名信息、函數(shù)信息、變量信息以及類型信息等,.debug_line節(jié)保存的是機器指令地址和源文件行的對應(yīng)信息。
DWARF最基本的描述實體為DIE(Debugging Information Entry)。每個DIE都有自己的標簽(包含類型和一系列屬性),類型以DW_TAG為前綴標記,屬性以DW_AT為前綴標記。DIE以兒子兄弟樹的結(jié)構(gòu)存儲,屬性指向其他的DIE。DIE類型有:DW_TAG_compile_unit、DW_TAG_subprogram、DW_ TAG_formal_parameter、DW_TAG_variable、DW_TAG _pointer_type等。圖2是.debug_info節(jié)的樹形結(jié)構(gòu)圖。
圖2 debug_info的樹形結(jié)構(gòu)
調(diào)試信息處理模塊首先通過ELF文件頭計算出.debug_info節(jié)和.debug_line節(jié)在目標文件中的位置,然后利用開源的libdwarf庫(提供大量的API函數(shù)接口)對這兩個節(jié)中的二進制碼進行解析[6],從中提取調(diào)試信息。libdwarf庫對每個DIE進行解析,根據(jù)DIE的類型分別進行處理,最后生成的調(diào)試信息分別存儲在各自定義的結(jié)構(gòu)體中。在所有的調(diào)試信息中,源程序行號與目標文件機器指令地址的對應(yīng)關(guān)系是最重要的調(diào)試信息。該模塊采用STL的Map映射模板類來實現(xiàn)這種對應(yīng)關(guān)系,其定義如下:Map(UINT,UINT)mapAddrToFileLine,既可以完成機器指令地址到行號的對應(yīng),又可以完成行號到機器指令地址的對應(yīng)。
3.2 調(diào)試代理設(shè)計
調(diào)試代理作為目標機上運行的一段程序,接收和處理主機調(diào)試器的調(diào)試請求,并向主機調(diào)試器反饋調(diào)試信息[7]。為了使調(diào)試代理不占用過多的目標機資源,同時提高調(diào)試代理的執(zhí)行效率,目標機端的調(diào)試代理采用模塊化、層次化設(shè)計,調(diào)試代理的基本結(jié)構(gòu)如圖3所示。
調(diào)試代理根據(jù)遠程調(diào)試軟件的功能分為以下幾個模塊:
圖3 調(diào)試代理結(jié)構(gòu)
(1)異常處理模塊:當(dāng)被調(diào)試程序遇到異常暫停執(zhí)行時,調(diào)試代理獲得CPU的控制權(quán),處理完異常之后調(diào)試代理交出CPU控制權(quán),目標文件繼續(xù)運行。
(2)功能執(zhí)行模塊:主要負責(zé)執(zhí)行主機調(diào)試器發(fā)送的調(diào)試命令,包括內(nèi)存值讀寫、寄存器值讀寫、斷點設(shè)置、單步執(zhí)行等命令,將執(zhí)行結(jié)果發(fā)送給調(diào)試通信模塊。
(3)調(diào)試通信模塊:根據(jù)調(diào)試通信協(xié)議RSP對發(fā)送過來的調(diào)試命令進行解析和封裝,并且對數(shù)據(jù)進行驗證。
(4)通信接口模塊:主要負責(zé)與主機調(diào)試器的通信,接收調(diào)試命令,并返回調(diào)試結(jié)果。為了用戶方便使用,提供多種通信接口,如串口、USB、網(wǎng)口等,通信接口模塊中有相應(yīng)的接口驅(qū)動模塊,用來屏蔽不同的通信方式。
(5)功能擴展模塊:為以后擴展調(diào)試代理功能提供方便。
根據(jù)上述要求編寫調(diào)試代理程序,下面詳細介紹一下調(diào)試代理的實現(xiàn)過程:
(1)首先把主機端的調(diào)試命令預(yù)先注冊到異常向量表中,每個調(diào)試命令都對應(yīng)唯一的標識、處理函數(shù)指針等[8]。之后調(diào)試代理等待主機端的調(diào)試命令,主機調(diào)試器發(fā)出調(diào)試命令后,系統(tǒng)會將CPSR(當(dāng)前程序狀態(tài)寄存器)的值自動修改,從而調(diào)試代理知道命令類型。獲得調(diào)試命令后,調(diào)試代理首先解析出標識號,然后查表獲取處理函數(shù)的入口地址,保存現(xiàn)場,調(diào)用處理函數(shù)。
(2)進入異常處理函數(shù)后,調(diào)試代理通過通信接口接收主機調(diào)試器發(fā)送的命令,主要包括調(diào)試過程中的斷點設(shè)置,單步執(zhí)行,寄存器值讀寫,內(nèi)存值讀寫,變量值讀寫,終止等功能。調(diào)試代理獲得某個命令后,便執(zhí)行相應(yīng)的調(diào)試動作。執(zhí)行單步命令之后恢復(fù)異常之前的寄存器值,使目標文件從異常處繼續(xù)運行。
(3)調(diào)用調(diào)試通信模塊,調(diào)試通信模塊按照遠程調(diào)試信息規(guī)定的格式對數(shù)據(jù)進行解析、封裝,接收來自通信接口的數(shù)據(jù)包,解析出調(diào)試命令,通過功能執(zhí)行模塊進行相應(yīng)的處理。執(zhí)行完調(diào)試命令后,將命令的執(zhí)行結(jié)果封裝成數(shù)據(jù)包,再通過RSP通信協(xié)議發(fā)送給主機調(diào)試器。
3.3 主要調(diào)試功能設(shè)計
遠程調(diào)試軟件提供的調(diào)試功能有:連接目標機、斷點設(shè)置與刪除、單步、變量查看與修改、寄存器讀寫、內(nèi)存讀寫等。斷點設(shè)置和變量查看是調(diào)試器控制程序執(zhí)行的基本手段。下面詳細介紹斷點設(shè)置和變量查看的設(shè)計。
(1)斷點設(shè)置
斷點從實現(xiàn)方式上可以分為兩種:硬件斷點和軟件斷點。硬件斷點是依賴硬件實現(xiàn)的,具有一定的局限性;而軟件斷點具有通用性。軟件斷點是將設(shè)置斷點處原有的指令替換為產(chǎn)生異常的指令,當(dāng)目標機運行到此斷點處時,主機調(diào)試器會捕獲到異常,目標機暫停執(zhí)行,由調(diào)試代理接管對目標文件的控制。
斷點設(shè)置的實現(xiàn)過程如下:首先,在源代碼中的某一行處設(shè)置斷點時,把斷點所在行的信息保存在自定義的雙向鏈表結(jié)構(gòu)中;其次,根據(jù)當(dāng)前的源文件名和行號,通過查詢目標文件的符號表獲得源文件名加行號所對應(yīng)的目標代碼地址;第三,給目標機發(fā)送寫內(nèi)存指令,在斷點處寫上異常指令;第四,中斷產(chǎn)生后,恢復(fù)預(yù)先保存的指令代碼,此時調(diào)試者可以通過調(diào)試命令查看目標文件的上下文信息。
(2)變量操作
調(diào)試器的變量操作包括局部變量和全局變量的查看和修改,即從內(nèi)存中讀取數(shù)據(jù)或者把數(shù)據(jù)寫到相應(yīng)的內(nèi)存單元中。全局變量存放在數(shù)據(jù)區(qū),可以直接訪問其內(nèi)存地址;而局部變量存放在堆棧區(qū),其地址是變化的,因此需要對目標文件進行解析,找到變量的內(nèi)存地址。
變量在DWARF調(diào)試規(guī)范中的標簽是DW_TAG_variable。DW_TAG_variable的屬性包括變量名DW_ AT_name、源文件名DW_AT_decl_file、行號DW_AT_ decl_line、變量類型DW_AT_type、存放位置DW_AT_ location等。全局變量用DW_AT_external屬性標識[9],其DW_AT_location屬性內(nèi)容為操作碼DW_OP _addr,操作數(shù)是全局變量的內(nèi)存地址。局部變量的DW_AT_location屬性內(nèi)容為操作碼DW_OP_fbreg,操作數(shù)是相對所在函數(shù)的偏移量,即局部變量存儲在以其所在函數(shù)的幀棧基地址開始偏移DW_OP_ fbreg值處,函數(shù)屬性DW_AT_frame_base指定函數(shù)的當(dāng)前幀棧基地址。因此,讀取全局變量僅向調(diào)試代理發(fā)送變量地址,而讀取函數(shù)局部變量首先向調(diào)試代理發(fā)送讀取函數(shù)幀?;芳拇嫫鞯拿?,將調(diào)試代理返回的結(jié)果與局部變量的偏移量相加形成局部變量內(nèi)存地址,然后再向調(diào)試代理發(fā)送變量地址。
嵌入式遠程調(diào)試軟件中主機調(diào)試器運行在Windows XP上,目標機處理器為MPC8270。對于被調(diào)試的程序首先使用GCC編譯生成目標文件,主機調(diào)試器通過網(wǎng)口或串口連接到目標機的調(diào)試代理,在主機端搭建一個FTP服務(wù)器,目標機端通過FTP命令將目標文件下載到目標機[10],同時將連接信息返回給調(diào)試圖形界面,以目標機視圖的形式進行展示。在主機端設(shè)置斷點開始調(diào)試運行,調(diào)試代理會中斷目標文件的正常執(zhí)行,等待主機的調(diào)試命令。主機端發(fā)送調(diào)試命令,對運行在目標機端的目標文件進行遠程調(diào)試,操作過程與本地調(diào)試操作一樣。通過Eclipse的各個視圖可以查看和設(shè)置內(nèi)存、變量、寄存器等信息。圖4顯示的是調(diào)試過程中調(diào)試系統(tǒng)透視圖。
圖4 調(diào)試系統(tǒng)透視圖
通過對嵌入式遠程調(diào)試的原理深入研究,利用Eclipse GDB/MI接口封裝GDB和在目標機端搭建調(diào)試代理,設(shè)計并實現(xiàn)了基于Eclipse平臺的可視化嵌入式遠程調(diào)試軟件。遠程調(diào)試軟件可以完成本地調(diào)試器所具備的功能,例如內(nèi)存值讀寫、寄存器值讀寫、斷點設(shè)置、單步執(zhí)行等等,不但可以方便有效地幫助開發(fā)人員調(diào)試嵌入式程序,提高開發(fā)效率,而且大大降低項目的開發(fā)成本。由于該軟件是在Eclipse插件的基礎(chǔ)上實現(xiàn)的,因此它具有可擴展性,、可移植性強。設(shè)計的嵌入式遠程調(diào)試軟件只是針對單處理器,對多處理器的支持是下一步的研究重點。
[1]Richard Stallman,Roland Pesch,Stan Shebs,et al.Debuggingwith GDB:The GNU Source-Level Debugger,Tenth Edition[M].Boston:Free Software Foundation,2011.
[2]Jeong-Hoon Ji,Gyun Woo,Hyung-Bae Pak.Design and Implementation of Retargetable Software Debugger based on GDB[C].Third 2008 International Conference on Convergence and Hybrid Information Technology:737-740.
[3]Jeremy Bennett.Howto:GDB Remote Serial Protocol[EB/OL].Embecosm,2008[2013].http://www.embecosm.com/appnotes/ean4/embecosm-howto-rsp-serverean4-issue-2.html.
[4]Michael Galpin.Developing applications using the Eclipse C/C++Development Toolkit[EB/OL].IBM developer Works,2007[2013].http://www.ibm.com/developerworks/opensource/library/os-eclipse-stlcdt/.
[5]DWARF Standards Committee.DWARF Debugging Information Format Version 3[S].Free Standards Group,2005.
[6]龔蘭蘭,劉曉升,朱巧明.遠程調(diào)試系統(tǒng)的關(guān)鍵技術(shù)分析[J].計算機軟件與理論,2010,27(10):258-261.
[7]溫麗娜,謝彬,李連云.遠程開發(fā)環(huán)境中的目標機代理設(shè)計[J].計算機工程,2007,33(2):277-279.
[8]李紅衛(wèi).嵌入式遠程調(diào)試工具的研究與實現(xiàn)[J].微計算機信息,2009,25(1-2):87-89.
[9]張君毅,李洪威,桑釗,等.基于Eclipse的開發(fā)環(huán)境中調(diào)試器設(shè)計與實現(xiàn)[J].現(xiàn)代電子技術(shù),2009(6):53-56.
[10]李杰.Linux環(huán)境下FTP系統(tǒng)的設(shè)計與實現(xiàn)[D].長春:吉林大學(xué),2012.
Im plementation of Embedded Remote Debugging Software Based on Eclipse Platform
WANG Shuang,KANG Mu-ning
(School of Computer Science,Northwestern Polytechnical University,Xi’an 710129,China)
In order to solve the problem of long development cycle caused by the traditional embedded system,which mostly uses the command-line print for developing and debugging,the visual embedded remote debugging software based on the Eclipse platform and the CDT plug is designed and implemented in this paper.The debuging control software encapsulates the general cross debugger GDB through MI interface,analyzes debugging information of object file according to DWARF debugging information standard,and sends debugging commands via RSP.The debugging agent receives and handles debugging commands.The paper emphasizes on design and implementation of debugging control software and debugging agent,and the source level remote debugging for the target program running on MPC8270 is achieved.
Embedded;Debug Agent;Remote Debugging;GDB Debugger
10.3969/j.issn.1002-2279.2014.03.016
TP311
:A
:1002-2279(2014)03-0056-04
王爽(1989-),女,河南新鄉(xiāng)人,碩士研究生,主研方向:嵌入式系統(tǒng)及應(yīng)用。
2013-11-14