摘 "要: 在嵌入式軟件開發(fā)過程中調(diào)試占據(jù)很重要的位置。在詳細分析Eclipse,CDT和GDB的特征后,擴展CDT的調(diào)試服務(wù)框架及其擴展點,實現(xiàn)在宿主機/目標機的開發(fā)模式中使用交叉GDB進行嵌入式軟件的源代碼級交叉調(diào)試軟件。該交叉調(diào)試軟件使用Eclipse作為集成開發(fā)環(huán)境,集成并擴展CDT插件,在宿主機端解析、加載帶調(diào)試信息的目標文件,啟動交叉GDB處理用戶的調(diào)試操作,通過目標機服務(wù)器把經(jīng)過封裝的調(diào)試命令發(fā)給目標機執(zhí)行,完成調(diào)試功能。該交叉調(diào)試方式支持通用的調(diào)試操作如設(shè)置/刪除斷點、源代碼級或匯編級單步執(zhí)行、連續(xù)執(zhí)行目標程序、查看/修改目標程序變量、寄存器、內(nèi)存和查看表達式等,以全軟件的方式解決了嵌入式軟件開發(fā)調(diào)試比較困難的、代價高的問題,加快了嵌入式軟件開發(fā)周期。
關(guān)鍵詞: 交叉調(diào)試; Eclipse; CDT; GDB; 嵌入式軟件
中圖分類號: TN911?34 " " " " " " " " " 文獻標識碼: A " " " " " " " " " " " " " "文章編號: 1004?373X(2015)06?0086?04
Cross?debugging of Eclipse?based embedded software
TIAN Dan, LI Yun?xi, HU Ning, MAI Xian?gen
(The Third Laboratory of ACTRI, AVIC, Xi’an 710068, China)
Abstract: Based on the detailed analysis of the characteristics of Eclipse, CDT and GDB, the debugging service framework of CDT and its extension point was extended, and the cross debugging of embedded software in the source code level was realized by cross GDB used in development mode of host/target computer. Eclipse is adopted in the cross debugging software as the integrated development environment to integrate and expand the CDT plug?in, parse and load the object file with debugging information at host machine end, start the cross GDB to process the debugging operation of users, and sent the packed debugging command to the target machine through the target server to complete the debugging functions. The cross debugging mode supports universal debugging operations such as breakpoint setting/deletion, single step execution in source code level or assembly level, continuous execution of the target program, check/edition of object program variables, register, memory and expression check. It solved the difficulty in the process of embedded software development and debugging in the whole software mode, reduced its cost, and accelerate the development cycle of embedded software.
Keywords: cross?debugging; Eclipse; CDT; GDB; embedded software
0 "引 "言
開發(fā)任何一個軟件都不可避免地存在各種錯誤,通常程序員利用調(diào)試器來跟蹤程序執(zhí)行情況,定位錯誤產(chǎn)生的位置,找到引起錯誤的原因,最終改正錯誤。一般來說,調(diào)試器的主要功能是控制目標程序執(zhí)行過程,查看、修改目標程序?qū)ο螅ㄔ谀繕顺绦蛑性O(shè)置刪除斷點;源代碼級或匯編級單步執(zhí)行、連續(xù)執(zhí)行目標程序;查看、修改目標程序變量、寄存器和內(nèi)存等。嵌入式軟件調(diào)試通常采用宿主機/目標機模式,借助通用計算機作為宿主機,在宿主機上編輯源代碼,使用交叉編譯器編譯生成目標機的可執(zhí)行代碼,通過通信介質(zhì)將目標代碼下載到目標機上運行,使用交叉調(diào)試器進行跟蹤調(diào)試,其一般通用結(jié)構(gòu)見圖1。
lt;E:\王芳\現(xiàn)代電子技術(shù)201506\現(xiàn)代電子技術(shù)15年38卷第6期\Image\44T1.tifgt;
圖1 交叉調(diào)試結(jié)構(gòu)
國外計算機業(yè)在嵌入式軟件調(diào)試領(lǐng)域發(fā)展很快,開發(fā)出多款功能強大、支持多種目標機的交叉調(diào)試器。目前國內(nèi)的嵌入式系統(tǒng)發(fā)展迅速,對嵌入式軟件的開發(fā)環(huán)境也提出了新的要求,因此在此著手進行嵌入式軟件的源代碼級交叉調(diào)試器的設(shè)計與實現(xiàn)。
1 "Eclipse、CDT和GDB
Eclipse項目是由IBM、Borland、Rational等多家軟件工具開發(fā)公司參與研究和推廣的新一代通用集成開發(fā)環(huán)境,核心是動態(tài)發(fā)現(xiàn)插件(Plug?in)的體系結(jié)構(gòu)[1]。微內(nèi)核形式的平臺核心負責(zé)處理基本環(huán)境的后臺工作,基于功能的單個插件專注于執(zhí)行特定的任務(wù)。通過集成來自不同供貨商的插件,Eclipse可以不斷擴展,實現(xiàn)各種不同的功能:支持C/C++開發(fā)的CDT(C/C++ Development Toolkit)插件;支持Java開發(fā)調(diào)試的JDT插件;支持XML開發(fā)的WST插件;支持遠程系統(tǒng)開發(fā)的RSE(Remote System Explorer)插件;支持版本管理的CVS插件;支持模型驅(qū)動開發(fā)的GEF、EMF插件等。Eclipse當(dāng)前已經(jīng)成為主流的嵌入式軟件集成開發(fā)環(huán)境基礎(chǔ)平臺[2],其中集成有嵌入式軟件開發(fā)調(diào)試過程中的各種工具,如目標機應(yīng)用程序項目管理、源代碼編輯、項目構(gòu)建、交叉運行、交叉調(diào)試、交叉測試、固化、遠程系統(tǒng)查詢?yōu)g覽等[3]。
GDB是GNU提供的開放源代碼的源代碼級調(diào)試工具,可以用于C/C++等程序的跟蹤調(diào)試[4]。在嵌人式系統(tǒng)開發(fā)軟件中, 開發(fā)人員能夠使用GDB以遠程調(diào)試的方式單步執(zhí)行目標平臺上的程序代碼、設(shè)置斷點、查看內(nèi)存, 和目標平臺交換信息。GDB同目標機交換信息的能力相當(dāng)強大, 勝過絕大多數(shù)的商業(yè)調(diào)試工具, 甚至可以與某些低端仿真器媲美。同樣, 與打印輸出等傳統(tǒng)的軟件調(diào)試手段相比, GDB遠程調(diào)試的動態(tài)、實時、方便等方面的優(yōu)勢非常明顯。
CDT是在Eclipse平臺上支持C/C++開發(fā)的工具插件,支持創(chuàng)建、編輯、資源管理、編譯、運行和調(diào)試本地C/C++程序[5]。CDT由一組相關(guān)聯(lián)插件組成,每個插件都作為一個獨立自主的項目運行。
CDT的本地調(diào)試大致分為3步:
(1) 初始化運行環(huán)境。CDT需要初始化運行環(huán)境、設(shè)置被調(diào)試的目標文件、設(shè)置調(diào)試入口、確定源代碼位置和查找規(guī)則、設(shè)置和GDB調(diào)試器的通信鏈接參數(shù)等。啟動調(diào)試會話后, CDT創(chuàng)建并初始化調(diào)試對象、線程信息、斷點信息、寄存器信息、內(nèi)存信息、源代碼信息等;
(2) 啟動GDB調(diào)試器。CDT以圖形化的方式提供調(diào)試功能, 但底層仍然采用傳統(tǒng)調(diào)試器GDB。CDT 使用MI接口啟動GDB,每一條發(fā)給GDB的調(diào)試命令都會有返回信息。CDT啟動GDB輸出流監(jiān)聽線程,該線程負責(zé)通過MI協(xié)議與GDB通信并完成事件觸發(fā)任務(wù)。CDT中圖形界面的變化是通過接收并解析這些信息而產(chǎn)生的;
(3) 開始調(diào)試。用戶發(fā)出調(diào)試命令后,CDT首先檢測被調(diào)試對象的狀態(tài), 如此時對象已經(jīng)運行則拋出異常(如被掛起), 并向GDB發(fā)出continue命令;如被終止或沒有運行, 則向GDB發(fā)出run命令,運行調(diào)試對象, 直到觸發(fā)事件。當(dāng)有事件被觸發(fā), CDT將收集事件發(fā)生時的目標機現(xiàn)場,根據(jù)該現(xiàn)場決定被調(diào)試的線程、斷點位置、源代碼位置以及目標機對象信息, 并反饋給用戶,用戶可執(zhí)行下一條的調(diào)試命令,CDT通過MI 接口將具體的調(diào)試命令傳遞給GDB執(zhí)行,依次循環(huán)直至完成本次調(diào)試。
CDT的調(diào)試支持部分包括CDT調(diào)試核心、CDT調(diào)試UI、CDT調(diào)試MI和 CDT調(diào)試啟動等插件,通過擴展上述插件,可啟動交叉調(diào)試器GDB,實現(xiàn)對遠程目標機程序的源代碼級交叉調(diào)試功能。
根據(jù)Eclipse、CDT以及GDB的以上功能特性,以Eclipse為交叉調(diào)試環(huán)境基礎(chǔ)平臺,調(diào)用CDT調(diào)試服務(wù)框架,擴展調(diào)試相關(guān)功能,將嵌入式交叉工具鏈無縫集成到交叉調(diào)試環(huán)境基礎(chǔ)平臺中。
2 交叉調(diào)試組成結(jié)構(gòu)
交叉調(diào)試由CDT交叉調(diào)試支持、目標機服務(wù)器通信支持和交叉GDB,如圖2所示。CDT交叉調(diào)試擴展CDT的調(diào)試擴展服務(wù),調(diào)用交叉GDB,提供遠程交叉調(diào)試支持。
lt;E:\王芳\現(xiàn)代電子技術(shù)201506\現(xiàn)代電子技術(shù)15年38卷第6期\Image\44T2.tifgt;
圖2 交叉調(diào)試組成圖
2.1 CDT交叉調(diào)試
CDT調(diào)試覆蓋基本的調(diào)試工具,包括調(diào)試啟動、調(diào)試視圖、斷點視圖、表達式視圖、變量視圖、反匯編視圖、內(nèi)存視圖和源碼編輯器等。調(diào)試啟動管理調(diào)試啟動配置。調(diào)試視圖管理調(diào)試會話,顯示調(diào)試棧幀,提供調(diào)試操作。斷點視圖提供調(diào)試斷點管理功能,包括設(shè)置、刪除、關(guān)閉和打開斷點等操作。變量視圖提供局部變量和全局變量操作功能。寄存器視圖提供寄存器操作功能,在多核條件下,支持查看不同核上的寄存器。內(nèi)存視圖提供內(nèi)存操作。表達式視圖提供表達式求值功能。反匯編視圖支持反匯編調(diào)試。源碼編輯器提供源代碼級調(diào)試。
交叉調(diào)試擴展CDT,實現(xiàn)兩個新的插件:cross.debug.core和cross.debug.ui。cross.debug.core需要擴展命令工廠擴展點,實現(xiàn)交叉調(diào)試命令集;擴展調(diào)試器擴展點,啟動交叉調(diào)試GDB;實現(xiàn)符號表管理器,提供脫離GDB的符號表查詢接口,在GDB沒有啟動的情況下(如加載時)查詢符號地址;擴展調(diào)試啟動器擴展點,鏈接目標機服務(wù)器,根據(jù)調(diào)試類型加載目標文件。cross.debug.ui插件擴展調(diào)試運行類型擴展點, 為支持的嵌入式操作系統(tǒng)添加專有的調(diào)試運行類型組,與該嵌入式操作系統(tǒng)相關(guān)的調(diào)試啟動歸屬于這個組;擴展調(diào)試器配置頁擴展點,配置調(diào)試參數(shù)如選擇目標機服務(wù)器、調(diào)試初始入口和加載配置等。
2.2 目標機服務(wù)器通信支持
目標機服務(wù)器用于管理宿主機與目標機之間的通信鏈接,是嵌入式軟件集成開發(fā)環(huán)境與目標機的通信中心。目標機服務(wù)器可以管理多個目標機,同時向多個目標機發(fā)送數(shù)據(jù),可以同時接收多個目標機的數(shù)據(jù)。目標機服務(wù)器將開發(fā)環(huán)境中所有和目標機通信相關(guān)統(tǒng)一管理,并為開發(fā)工 具提供目標機通信接口。
目標機服務(wù)器提供目標機管理、數(shù)據(jù)傳輸、目標機通信、目標機通信連接檢查、命令管理、目標機事件管理、RSP數(shù)據(jù)處理、符號表管理、日志記錄等功能。
2.3 交叉GDB
交叉GDB提供不同體系結(jié)構(gòu)目標機系統(tǒng)的遠程調(diào)試支持,在調(diào)試啟動配置中可以選擇不同版本的交叉GDB。GDB和目標機服務(wù)器之間接口是MI協(xié)議。目標機服務(wù)器把MI協(xié)議命令轉(zhuǎn)化為RSP協(xié)議,發(fā)給目標機代理處理。
3 交叉調(diào)試工作流程
交叉調(diào)試設(shè)計為遠程調(diào)試模式,與CDT本地調(diào)試有所不同,交叉調(diào)試需要與待目標機的體系結(jié)構(gòu)相符的交叉調(diào)試GDB;交叉調(diào)試需要和遠程目標機通信,這由目標機服務(wù)器負責(zé);調(diào)試命令由GDB發(fā)給目標機服務(wù)器,返回信息由目標機服務(wù)器傳給GDB,再由CDT界面顯示。
交叉調(diào)試基本步驟為:
(1) 初始化目標機系統(tǒng),建立宿主機與待調(diào)試目標機之間的通信通道,加載運行被調(diào)試的目標文件到目標機中;
(2) 啟動交叉調(diào)試器。確定宿主機中和目標機上所運行程序?qū)?yīng)的包含調(diào)試信息的目標文件,然后啟動宿主機上和目標機體系結(jié)構(gòu)匹配的交叉調(diào)試器GDB,建立該交叉調(diào)試器和目標機服務(wù)器的通信鏈接,以后的調(diào)試命令通過該通信鏈接向目標機發(fā)送命令并接收目標機返回的信息;
(3) 初始化交叉調(diào)試運行環(huán)境,建立交叉調(diào)試會話。啟動交叉調(diào)試會話后,CDT創(chuàng)建并初始化調(diào)試對象、 遠程目標機中的線程信息、斷點信息、寄存器信息、內(nèi)存信息、源代碼信息等;
(4) 開始交叉調(diào)試。該過程與CDT的本地調(diào)試步驟(3)類似,GDB收到MI調(diào)試命令后,轉(zhuǎn)換為遠程串行協(xié)議(Remote Serial Protocol,RSP)命令,發(fā)給目標機服務(wù)器;目標機服務(wù)器將RSP命令發(fā)送給目標機執(zhí)行,并接收目標機返回的執(zhí)行結(jié)果信息和目標機程序執(zhí)行中觸發(fā)事件,送給GDB處理;GDB收到目標機報告的數(shù)據(jù),轉(zhuǎn)換為MI命令回復(fù)交給CDT;CDT根據(jù)MI命令回復(fù)確定該調(diào)試命令的執(zhí)行結(jié)果。
4 關(guān)鍵技術(shù)
4.1 符號表管理技術(shù)
符號表是源碼級調(diào)試的必要功能。在本地調(diào)試過程中,由GDB管理符號表并提供查詢接口。交叉調(diào)試時,可能GDB尚未啟動,或者不具備查詢狀態(tài),不能從GDB獲得符號信息,需要調(diào)用脫離GCC工具鏈和GDB的符號表解析程序。解析程序包含4部分:Symbol類、Section類、ElfHeaher類、Elf類和符號表管理類SymbolManager。
Symbol類描述符號相關(guān)信息,包括符號名字、符號地址、符號類型以及符號所屬段等數(shù)據(jù)。
Section類描述段相關(guān)信息,包括段名字、段類型、段屬性、裝入地址和段偏移及大小等數(shù)據(jù)。
ElfHeaher類描述Elf文件頭信息,包括文件類型、目標體系類型、處理器標識、文件入口地址、Elf頭偏移及大小、段表信息等數(shù)據(jù)。
Elf類解析帶有調(diào)試信息的目標文件信息,創(chuàng)建相關(guān)信息對象:一個ElfHeader對象、一組Section對象和一組Symbol對象。
SymbolManager類提供設(shè)置符號文件、根據(jù)源代碼行號查地址、根據(jù)地址查源代碼行號、根據(jù)地址查符號、根據(jù)符號查地址以及獲得指定段等接口。
4.2 CDT調(diào)試擴展技術(shù)
交叉調(diào)試對CDT調(diào)試的擴展主要是在建立和目標機服務(wù)器的通信鏈接,啟動并初始化支持交叉調(diào)試的GDB方面,主要包括以下方面:
(1) 擴展交叉調(diào)試命令集實現(xiàn)CrossCommandFactory。CDT默認的調(diào)試命令集包含GDB的MI命令和部分CLI命令,需要加入新的命令如增加符號文件、根據(jù)源代碼行號查地址命令、根據(jù)地址查符號以及根據(jù)符號查地址等命令;
(2) 擴展交叉調(diào)試器實現(xiàn)CrossDebugger。啟動交叉調(diào)試器需要找到符合目標機體系結(jié)構(gòu)的GDB,添加符號表文件,把CDT建立的本地調(diào)試對象Target轉(zhuǎn)換為交叉調(diào)試對象CrossTarget以記錄遠程目標機的調(diào)試上下文,維護調(diào)試會話使用的目標機服務(wù)器鏈接等參數(shù);
(3) 擴展交叉調(diào)試器配置實現(xiàn)CrossDebuggerPage。在調(diào)試啟動配置中添加交叉調(diào)試需要的參數(shù)配置界面;
(4) 擴展交叉調(diào)試器啟動代理實現(xiàn)CrossLaunchDelegate。根據(jù)配置鏈接目標機服務(wù)器指定要調(diào)試的目標機,加載待調(diào)試程序到目標機;還有可能需要重定位目標文件、設(shè)置所調(diào)試程序參數(shù);根據(jù)配置啟動交叉調(diào)試器,創(chuàng)建調(diào)試會話,初始化源代碼查找器。
5 結(jié) "語
本文主要研究以開源的Eclipse和CDT 項目為依托,在分析Eclipse、CDT和GDB的功能特性的基礎(chǔ)上,根據(jù)CDT的擴展服務(wù),實現(xiàn)在宿主機上利用交叉調(diào)試GDB,調(diào)試遠程目標機程序的源代碼級交叉調(diào)試功能。該交叉調(diào)試支持通用的調(diào)試操作如設(shè)置刪除斷點、源代碼級或匯編級單步執(zhí)行、連續(xù)執(zhí)行目標程序、查看/修改目標程序變量、寄存器、內(nèi)存和查看表達式等。進一步,在嵌入式軟件開發(fā)階段,開發(fā)者必須要對目標系統(tǒng)運行狀態(tài)具有完全的觀察和控制能力, 例如硬件的各種寄存器、內(nèi)存空間使用情況、CPU利用率, 操作系統(tǒng)的信號量、消息隊列、任務(wù)、堆棧等對象和系統(tǒng)任務(wù)之間的通信情況、任務(wù)的執(zhí)行軌跡,這將是進一步的工作。
參考文獻
[1] Anon. Fortify audit workbench user guide [EB/OL]. [2012?11?17]. http://www. wenku.baidu.com/link?u.
[2] 魏楚元,李陶深,張增芳.Eclipse:基于插件的下一代通用集成開發(fā)環(huán)境[J].計算機應(yīng)用與軟件,2005,22(6):38?40.
[3] 劉芳,臧威.基于Eclipse平臺的嵌入式交叉調(diào)試環(huán)境MRTOS[J].電子科技,2013,26(5):18?21.
[4] Free Software Foundation. GDB user manual [EB/OL] . (2006?12?13) [2007?01?09]. http://sourceware. org /gdb/current/onlinedocs/gdb?toc.html.
[5] Anon. Eclipse IDE C/C++ development user guide [EB/OL]. [2013?11?28]. http://www. www.docin.com...570.html.
[6] 王興杰,李允,江浩,等.基于Linμx的嵌入式交叉開發(fā)技術(shù)[J].計算機應(yīng)用研究,2008(1):206?208,214.