王 爽,康慕寧
(西北工業大學計算機學院,西安710129)
基于Eclipse平臺的嵌入式遠程調試軟件實現
王 爽,康慕寧
(西北工業大學計算機學院,西安710129)
傳統嵌入式系統大多采用命令行打印的方式進行開發調試,導致開發周期延長。針對這個問題,基于Eclipse平臺和CDT插件設計并實現了一套可視化的嵌入式遠程調試軟件。主機端的調試總控通過MI接口封裝通用調試器GDB,按照DWARF調試信息格式提取目標文件中的調試信息,并通過RSP協議發送調試命令,目標機端的調試代理負責接收并處理調試命令。著重分析了調試總控的設計和調試代理的實現要點,最終實現了對MPC8270上目標程序的源碼級遠程調試。
嵌入式;調試代理;遠程調試;GDB調試器
隨著嵌入式軟件開發規模的不斷擴大,如何高效地對嵌入式軟件進行調試成為系統開發中的一個難題。由于嵌入式系統本身的計算能力、存儲能力、外設資源都非常有限,在嵌入式MCU上運行一個調試器是不太現實的。在很長一段時間內,開發人員大都使用串口打印輸出到命令行的方式進行調試,這種調試手段嚴重延長了軟件的開發周期,在主機端上的IDE進行遠程調試逐漸成為一個發展趨勢。遠程調試采用主機/目標機交叉的方式進行,調試器運行在主機端,被調試程序運行在目標機端,主機端的調試器通過串口或網絡與目標機通信,控制目標機上被調試程序的運行,實現對目標文件的調試。
GNU開源組織發布的GDB(GNU Debugger)是一個強大的通用程序調試工具[1],它對本地調試和遠程調試都提供支持。GDB支持CLI(Command Line Interface)和MI(Machine Interface)兩種外部調試工具接口。Eclipse是利用MI方法支持C語言源碼級調試最好的開源工具[2],故在Eclipse平臺的基礎上使用CDT插件開發遠程調試器圖形前端,利用GDB/MI接口封裝GDB,使圖形前端能夠和GDB相互通信,在目標機端搭建調試代理模塊,最終構建了一個可視化的嵌入式遠程調試軟件,不僅提高了開發效率,而且減少了軟件成本。
嵌入式遠程調試軟件主要由主機端的調試器和目標機端的調試代理組成,主機調試器與調試代理通過遠程調試通信協議RSP進行通信[3]。主機調試器按照DWARF調試信息格式提取目標文件中的調試信息,根據RSP協議把要發送的調試命令封裝成數據包,通過通信接口如網口或串口發送給調試代理以及接收調試代理發送的調試信息數據包,并且在Eclipse圖形界面上顯示相應的調試信息。調試代理接收并解析用戶的遠程調試命令,根據調試命令控制被調試程序的運行,并且把調試信息封裝成數據包發送給主機調試器。
CDT插件為Eclipse提供了C/C++程序的編輯、編譯、運行及本地調試功能[4]。為滿足嵌入式遠程調試的需求,需要對Eclipse的調試模塊進行功能擴展,使擴展后的CDT插件能夠調用GDB對目標機上的被調試程序進行遠程調試。主要擴展的部分如下:①調試器遠程連接部分。遠程連接目標機,首先需要配置遠程調試信息,如:連接方式、目標機IP地址、端口號等,然后遠程調試器利用配置信息連接調試代理,連接成功則建立調試會話,若遇異常則退出。②遠程調試信息處理部分。根據遠程調試時返回的調試信息格式進行信息解析、提取和存儲,根據視圖要求實時顯示調試信息。③調試管理部分。接收圖形界面中的配置信息,負責發送調試信息及調試命令至GDB。遠程調試軟件結構如圖1所示。

圖1 遠程調試軟件結構
3.1 調試信息提取
調試信息是GCC編譯器在編譯時從源文件中收集的信息,包括文件名、函數名、函數參數、函數入口地址、變量名、變量類型、行號以及對應的地址等等,然后按照DWARF(Debugging With Attributed Record Formats)調試信息格式寫入到目標文件中[5]。遠程調試器在工作時能夠從目標文件中提取調試信息,建立源代碼和目標文件之間的對應關系。
調試信息主要分布在ELF文件中的以.debug_ *開頭的節,其中.debug_info節和.debug_line節中的調試信息是關鍵信息,.debug_info節保存的內容是文件名信息、函數信息、變量信息以及類型信息等,.debug_line節保存的是機器指令地址和源文件行的對應信息。
DWARF最基本的描述實體為DIE(Debugging Information Entry)。每個DIE都有自己的標簽(包含類型和一系列屬性),類型以DW_TAG為前綴標記,屬性以DW_AT為前綴標記。DIE以兒子兄弟樹的結構存儲,屬性指向其他的DIE。DIE類型有:DW_TAG_compile_unit、DW_TAG_subprogram、DW_ TAG_formal_parameter、DW_TAG_variable、DW_TAG _pointer_type等。圖2是.debug_info節的樹形結構圖。

圖2 debug_info的樹形結構
調試信息處理模塊首先通過ELF文件頭計算出.debug_info節和.debug_line節在目標文件中的位置,然后利用開源的libdwarf庫(提供大量的API函數接口)對這兩個節中的二進制碼進行解析[6],從中提取調試信息。libdwarf庫對每個DIE進行解析,根據DIE的類型分別進行處理,最后生成的調試信息分別存儲在各自定義的結構體中。在所有的調試信息中,源程序行號與目標文件機器指令地址的對應關系是最重要的調試信息。該模塊采用STL的Map映射模板類來實現這種對應關系,其定義如下:Map(UINT,UINT)mapAddrToFileLine,既可以完成機器指令地址到行號的對應,又可以完成行號到機器指令地址的對應。
3.2 調試代理設計
調試代理作為目標機上運行的一段程序,接收和處理主機調試器的調試請求,并向主機調試器反饋調試信息[7]。為了使調試代理不占用過多的目標機資源,同時提高調試代理的執行效率,目標機端的調試代理采用模塊化、層次化設計,調試代理的基本結構如圖3所示。
調試代理根據遠程調試軟件的功能分為以下幾個模塊:

圖3 調試代理結構
(1)異常處理模塊:當被調試程序遇到異常暫停執行時,調試代理獲得CPU的控制權,處理完異常之后調試代理交出CPU控制權,目標文件繼續運行。
(2)功能執行模塊:主要負責執行主機調試器發送的調試命令,包括內存值讀寫、寄存器值讀寫、斷點設置、單步執行等命令,將執行結果發送給調試通信模塊。
(3)調試通信模塊:根據調試通信協議RSP對發送過來的調試命令進行解析和封裝,并且對數據進行驗證。
(4)通信接口模塊:主要負責與主機調試器的通信,接收調試命令,并返回調試結果。為了用戶方便使用,提供多種通信接口,如串口、USB、網口等,通信接口模塊中有相應的接口驅動模塊,用來屏蔽不同的通信方式。
(5)功能擴展模塊:為以后擴展調試代理功能提供方便。
根據上述要求編寫調試代理程序,下面詳細介紹一下調試代理的實現過程:
(1)首先把主機端的調試命令預先注冊到異常向量表中,每個調試命令都對應唯一的標識、處理函數指針等[8]。之后調試代理等待主機端的調試命令,主機調試器發出調試命令后,系統會將CPSR(當前程序狀態寄存器)的值自動修改,從而調試代理知道命令類型。獲得調試命令后,調試代理首先解析出標識號,然后查表獲取處理函數的入口地址,保存現場,調用處理函數。
(2)進入異常處理函數后,調試代理通過通信接口接收主機調試器發送的命令,主要包括調試過程中的斷點設置,單步執行,寄存器值讀寫,內存值讀寫,變量值讀寫,終止等功能。調試代理獲得某個命令后,便執行相應的調試動作。執行單步命令之后恢復異常之前的寄存器值,使目標文件從異常處繼續運行。
(3)調用調試通信模塊,調試通信模塊按照遠程調試信息規定的格式對數據進行解析、封裝,接收來自通信接口的數據包,解析出調試命令,通過功能執行模塊進行相應的處理。執行完調試命令后,將命令的執行結果封裝成數據包,再通過RSP通信協議發送給主機調試器。
3.3 主要調試功能設計
遠程調試軟件提供的調試功能有:連接目標機、斷點設置與刪除、單步、變量查看與修改、寄存器讀寫、內存讀寫等。斷點設置和變量查看是調試器控制程序執行的基本手段。下面詳細介紹斷點設置和變量查看的設計。
(1)斷點設置
斷點從實現方式上可以分為兩種:硬件斷點和軟件斷點。硬件斷點是依賴硬件實現的,具有一定的局限性;而軟件斷點具有通用性。軟件斷點是將設置斷點處原有的指令替換為產生異常的指令,當目標機運行到此斷點處時,主機調試器會捕獲到異常,目標機暫停執行,由調試代理接管對目標文件的控制。
斷點設置的實現過程如下:首先,在源代碼中的某一行處設置斷點時,把斷點所在行的信息保存在自定義的雙向鏈表結構中;其次,根據當前的源文件名和行號,通過查詢目標文件的符號表獲得源文件名加行號所對應的目標代碼地址;第三,給目標機發送寫內存指令,在斷點處寫上異常指令;第四,中斷產生后,恢復預先保存的指令代碼,此時調試者可以通過調試命令查看目標文件的上下文信息。
(2)變量操作
調試器的變量操作包括局部變量和全局變量的查看和修改,即從內存中讀取數據或者把數據寫到相應的內存單元中。全局變量存放在數據區,可以直接訪問其內存地址;而局部變量存放在堆棧區,其地址是變化的,因此需要對目標文件進行解析,找到變量的內存地址。
變量在DWARF調試規范中的標簽是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屬性內容為操作碼DW_OP _addr,操作數是全局變量的內存地址。局部變量的DW_AT_location屬性內容為操作碼DW_OP_fbreg,操作數是相對所在函數的偏移量,即局部變量存儲在以其所在函數的幀棧基地址開始偏移DW_OP_ fbreg值處,函數屬性DW_AT_frame_base指定函數的當前幀?;刂?。因此,讀取全局變量僅向調試代理發送變量地址,而讀取函數局部變量首先向調試代理發送讀取函數幀?;芳拇嫫鞯拿?,將調試代理返回的結果與局部變量的偏移量相加形成局部變量內存地址,然后再向調試代理發送變量地址。
嵌入式遠程調試軟件中主機調試器運行在Windows XP上,目標機處理器為MPC8270。對于被調試的程序首先使用GCC編譯生成目標文件,主機調試器通過網口或串口連接到目標機的調試代理,在主機端搭建一個FTP服務器,目標機端通過FTP命令將目標文件下載到目標機[10],同時將連接信息返回給調試圖形界面,以目標機視圖的形式進行展示。在主機端設置斷點開始調試運行,調試代理會中斷目標文件的正常執行,等待主機的調試命令。主機端發送調試命令,對運行在目標機端的目標文件進行遠程調試,操作過程與本地調試操作一樣。通過Eclipse的各個視圖可以查看和設置內存、變量、寄存器等信息。圖4顯示的是調試過程中調試系統透視圖。

圖4 調試系統透視圖
通過對嵌入式遠程調試的原理深入研究,利用Eclipse GDB/MI接口封裝GDB和在目標機端搭建調試代理,設計并實現了基于Eclipse平臺的可視化嵌入式遠程調試軟件。遠程調試軟件可以完成本地調試器所具備的功能,例如內存值讀寫、寄存器值讀寫、斷點設置、單步執行等等,不但可以方便有效地幫助開發人員調試嵌入式程序,提高開發效率,而且大大降低項目的開發成本。由于該軟件是在Eclipse插件的基礎上實現的,因此它具有可擴展性,、可移植性強。設計的嵌入式遠程調試軟件只是針對單處理器,對多處理器的支持是下一步的研究重點。
[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]龔蘭蘭,劉曉升,朱巧明.遠程調試系統的關鍵技術分析[J].計算機軟件與理論,2010,27(10):258-261.
[7]溫麗娜,謝彬,李連云.遠程開發環境中的目標機代理設計[J].計算機工程,2007,33(2):277-279.
[8]李紅衛.嵌入式遠程調試工具的研究與實現[J].微計算機信息,2009,25(1-2):87-89.
[9]張君毅,李洪威,桑釗,等.基于Eclipse的開發環境中調試器設計與實現[J].現代電子技術,2009(6):53-56.
[10]李杰.Linux環境下FTP系統的設計與實現[D].長春:吉林大學,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-),女,河南新鄉人,碩士研究生,主研方向:嵌入式系統及應用。
2013-11-14