摘 "要: 在嵌入式軟件開發(fā)過程中調(diào)試占據(jù)很重要的位置。在詳細(xì)分析Eclipse,CDT和GDB的特征后,擴(kuò)展CDT的調(diào)試服務(wù)框架及其擴(kuò)展點(diǎn),實(shí)現(xiàn)在宿主機(jī)/目標(biāo)機(jī)的開發(fā)模式中使用交叉GDB進(jìn)行嵌入式軟件的源代碼級(jí)交叉調(diào)試軟件。該交叉調(diào)試軟件使用Eclipse作為集成開發(fā)環(huán)境,集成并擴(kuò)展CDT插件,在宿主機(jī)端解析、加載帶調(diào)試信息的目標(biāo)文件,啟動(dòng)交叉GDB處理用戶的調(diào)試操作,通過目標(biāo)機(jī)服務(wù)器把經(jīng)過封裝的調(diào)試命令發(fā)給目標(biāo)機(jī)執(zhí)行,完成調(diào)試功能。該交叉調(diào)試方式支持通用的調(diào)試操作如設(shè)置/刪除斷點(diǎn)、源代碼級(jí)或匯編級(jí)單步執(zhí)行、連續(xù)執(zhí)行目標(biāo)程序、查看/修改目標(biāo)程序變量、寄存器、內(nèi)存和查看表達(dá)式等,以全軟件的方式解決了嵌入式軟件開發(fā)調(diào)試比較困難的、代價(jià)高的問題,加快了嵌入式軟件開發(fā)周期。
關(guān)鍵詞: 交叉調(diào)試; Eclipse; CDT; GDB; 嵌入式軟件
中圖分類號(hào): TN911?34 " " " " " " " " " 文獻(xiàn)標(biāo)識(shí)碼: A " " " " " " " " " " " " " "文章編號(hào): 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ā)任何一個(gè)軟件都不可避免地存在各種錯(cuò)誤,通常程序員利用調(diào)試器來跟蹤程序執(zhí)行情況,定位錯(cuò)誤產(chǎn)生的位置,找到引起錯(cuò)誤的原因,最終改正錯(cuò)誤。一般來說,調(diào)試器的主要功能是控制目標(biāo)程序執(zhí)行過程,查看、修改目標(biāo)程序?qū)ο?,包括在目?biāo)程序中設(shè)置刪除斷點(diǎn);源代碼級(jí)或匯編級(jí)單步執(zhí)行、連續(xù)執(zhí)行目標(biāo)程序;查看、修改目標(biāo)程序變量、寄存器和內(nèi)存等。嵌入式軟件調(diào)試通常采用宿主機(jī)/目標(biāo)機(jī)模式,借助通用計(jì)算機(jī)作為宿主機(jī),在宿主機(jī)上編輯源代碼,使用交叉編譯器編譯生成目標(biāo)機(jī)的可執(zhí)行代碼,通過通信介質(zhì)將目標(biāo)代碼下載到目標(biāo)機(jī)上運(yùn)行,使用交叉調(diào)試器進(jìn)行跟蹤調(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)
國外計(jì)算機(jī)業(yè)在嵌入式軟件調(diào)試領(lǐng)域發(fā)展很快,開發(fā)出多款功能強(qiáng)大、支持多種目標(biāo)機(jī)的交叉調(diào)試器。目前國內(nèi)的嵌入式系統(tǒng)發(fā)展迅速,對(duì)嵌入式軟件的開發(fā)環(huán)境也提出了新的要求,因此在此著手進(jìn)行嵌入式軟件的源代碼級(jí)交叉調(diào)試器的設(shè)計(jì)與實(shí)現(xiàn)。
1 "Eclipse、CDT和GDB
Eclipse項(xiàng)目是由IBM、Borland、Rational等多家軟件工具開發(fā)公司參與研究和推廣的新一代通用集成開發(fā)環(huán)境,核心是動(dòng)態(tài)發(fā)現(xiàn)插件(Plug?in)的體系結(jié)構(gòu)[1]。微內(nèi)核形式的平臺(tái)核心負(fù)責(zé)處理基本環(huán)境的后臺(tái)工作,基于功能的單個(gè)插件專注于執(zhí)行特定的任務(wù)。通過集成來自不同供貨商的插件,Eclipse可以不斷擴(kuò)展,實(shí)現(xiàn)各種不同的功能:支持C/C++開發(fā)的CDT(C/C++ Development Toolkit)插件;支持Java開發(fā)調(diào)試的JDT插件;支持XML開發(fā)的WST插件;支持遠(yuǎn)程系統(tǒng)開發(fā)的RSE(Remote System Explorer)插件;支持版本管理的CVS插件;支持模型驅(qū)動(dòng)開發(fā)的GEF、EMF插件等。Eclipse當(dāng)前已經(jīng)成為主流的嵌入式軟件集成開發(fā)環(huán)境基礎(chǔ)平臺(tái)[2],其中集成有嵌入式軟件開發(fā)調(diào)試過程中的各種工具,如目標(biāo)機(jī)應(yīng)用程序項(xiàng)目管理、源代碼編輯、項(xiàng)目構(gòu)建、交叉運(yùn)行、交叉調(diào)試、交叉測(cè)試、固化、遠(yuǎn)程系統(tǒng)查詢?yōu)g覽等[3]。
GDB是GNU提供的開放源代碼的源代碼級(jí)調(diào)試工具,可以用于C/C++等程序的跟蹤調(diào)試[4]。在嵌人式系統(tǒng)開發(fā)軟件中, 開發(fā)人員能夠使用GDB以遠(yuǎn)程調(diào)試的方式單步執(zhí)行目標(biāo)平臺(tái)上的程序代碼、設(shè)置斷點(diǎn)、查看內(nèi)存, 和目標(biāo)平臺(tái)交換信息。GDB同目標(biāo)機(jī)交換信息的能力相當(dāng)強(qiáng)大, 勝過絕大多數(shù)的商業(yè)調(diào)試工具, 甚至可以與某些低端仿真器媲美。同樣, 與打印輸出等傳統(tǒng)的軟件調(diào)試手段相比, GDB遠(yuǎn)程調(diào)試的動(dòng)態(tài)、實(shí)時(shí)、方便等方面的優(yōu)勢(shì)非常明顯。
CDT是在Eclipse平臺(tái)上支持C/C++開發(fā)的工具插件,支持創(chuàng)建、編輯、資源管理、編譯、運(yùn)行和調(diào)試本地C/C++程序[5]。CDT由一組相關(guān)聯(lián)插件組成,每個(gè)插件都作為一個(gè)獨(dú)立自主的項(xiàng)目運(yùn)行。
CDT的本地調(diào)試大致分為3步:
(1) 初始化運(yùn)行環(huán)境。CDT需要初始化運(yùn)行環(huán)境、設(shè)置被調(diào)試的目標(biāo)文件、設(shè)置調(diào)試入口、確定源代碼位置和查找規(guī)則、設(shè)置和GDB調(diào)試器的通信鏈接參數(shù)等。啟動(dòng)調(diào)試會(huì)話后, CDT創(chuàng)建并初始化調(diào)試對(duì)象、線程信息、斷點(diǎn)信息、寄存器信息、內(nèi)存信息、源代碼信息等;
(2) 啟動(dòng)GDB調(diào)試器。CDT以圖形化的方式提供調(diào)試功能, 但底層仍然采用傳統(tǒng)調(diào)試器GDB。CDT 使用MI接口啟動(dòng)GDB,每一條發(fā)給GDB的調(diào)試命令都會(huì)有返回信息。CDT啟動(dòng)GDB輸出流監(jiān)聽線程,該線程負(fù)責(zé)通過MI協(xié)議與GDB通信并完成事件觸發(fā)任務(wù)。CDT中圖形界面的變化是通過接收并解析這些信息而產(chǎn)生的;
(3) 開始調(diào)試。用戶發(fā)出調(diào)試命令后,CDT首先檢測(cè)被調(diào)試對(duì)象的狀態(tài), 如此時(shí)對(duì)象已經(jīng)運(yùn)行則拋出異常(如被掛起), 并向GDB發(fā)出continue命令;如被終止或沒有運(yùn)行, 則向GDB發(fā)出run命令,運(yùn)行調(diào)試對(duì)象, 直到觸發(fā)事件。當(dāng)有事件被觸發(fā), CDT將收集事件發(fā)生時(shí)的目標(biāo)機(jī)現(xiàn)場(chǎng),根據(jù)該現(xiàn)場(chǎng)決定被調(diào)試的線程、斷點(diǎn)位置、源代碼位置以及目標(biāo)機(jī)對(duì)象信息, 并反饋給用戶,用戶可執(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)試啟動(dòng)等插件,通過擴(kuò)展上述插件,可啟動(dòng)交叉調(diào)試器GDB,實(shí)現(xiàn)對(duì)遠(yuǎn)程目標(biāo)機(jī)程序的源代碼級(jí)交叉調(diào)試功能。
根據(jù)Eclipse、CDT以及GDB的以上功能特性,以Eclipse為交叉調(diào)試環(huán)境基礎(chǔ)平臺(tái),調(diào)用CDT調(diào)試服務(wù)框架,擴(kuò)展調(diào)試相關(guān)功能,將嵌入式交叉工具鏈無縫集成到交叉調(diào)試環(huán)境基礎(chǔ)平臺(tái)中。
2 交叉調(diào)試組成結(jié)構(gòu)
交叉調(diào)試由CDT交叉調(diào)試支持、目標(biāo)機(jī)服務(wù)器通信支持和交叉GDB,如圖2所示。CDT交叉調(diào)試擴(kuò)展CDT的調(diào)試擴(kuò)展服務(wù),調(diào)用交叉GDB,提供遠(yuǎn)程交叉調(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)試啟動(dòng)、調(diào)試視圖、斷點(diǎn)視圖、表達(dá)式視圖、變量視圖、反匯編視圖、內(nèi)存視圖和源碼編輯器等。調(diào)試啟動(dòng)管理調(diào)試啟動(dòng)配置。調(diào)試視圖管理調(diào)試會(huì)話,顯示調(diào)試棧幀,提供調(diào)試操作。斷點(diǎn)視圖提供調(diào)試斷點(diǎn)管理功能,包括設(shè)置、刪除、關(guān)閉和打開斷點(diǎn)等操作。變量視圖提供局部變量和全局變量操作功能。寄存器視圖提供寄存器操作功能,在多核條件下,支持查看不同核上的寄存器。內(nèi)存視圖提供內(nèi)存操作。表達(dá)式視圖提供表達(dá)式求值功能。反匯編視圖支持反匯編調(diào)試。源碼編輯器提供源代碼級(jí)調(diào)試。
交叉調(diào)試擴(kuò)展CDT,實(shí)現(xiàn)兩個(gè)新的插件:cross.debug.core和cross.debug.ui。cross.debug.core需要擴(kuò)展命令工廠擴(kuò)展點(diǎn),實(shí)現(xiàn)交叉調(diào)試命令集;擴(kuò)展調(diào)試器擴(kuò)展點(diǎn),啟動(dòng)交叉調(diào)試GDB;實(shí)現(xiàn)符號(hào)表管理器,提供脫離GDB的符號(hào)表查詢接口,在GDB沒有啟動(dòng)的情況下(如加載時(shí))查詢符號(hào)地址;擴(kuò)展調(diào)試啟動(dòng)器擴(kuò)展點(diǎn),鏈接目標(biāo)機(jī)服務(wù)器,根據(jù)調(diào)試類型加載目標(biāo)文件。cross.debug.ui插件擴(kuò)展調(diào)試運(yùn)行類型擴(kuò)展點(diǎn), 為支持的嵌入式操作系統(tǒng)添加專有的調(diào)試運(yùn)行類型組,與該嵌入式操作系統(tǒng)相關(guān)的調(diào)試啟動(dòng)歸屬于這個(gè)組;擴(kuò)展調(diào)試器配置頁擴(kuò)展點(diǎn),配置調(diào)試參數(shù)如選擇目標(biāo)機(jī)服務(wù)器、調(diào)試初始入口和加載配置等。
2.2 目標(biāo)機(jī)服務(wù)器通信支持
目標(biāo)機(jī)服務(wù)器用于管理宿主機(jī)與目標(biāo)機(jī)之間的通信鏈接,是嵌入式軟件集成開發(fā)環(huán)境與目標(biāo)機(jī)的通信中心。目標(biāo)機(jī)服務(wù)器可以管理多個(gè)目標(biāo)機(jī),同時(shí)向多個(gè)目標(biāo)機(jī)發(fā)送數(shù)據(jù),可以同時(shí)接收多個(gè)目標(biāo)機(jī)的數(shù)據(jù)。目標(biāo)機(jī)服務(wù)器將開發(fā)環(huán)境中所有和目標(biāo)機(jī)通信相關(guān)統(tǒng)一管理,并為開發(fā)工 具提供目標(biāo)機(jī)通信接口。
目標(biāo)機(jī)服務(wù)器提供目標(biāo)機(jī)管理、數(shù)據(jù)傳輸、目標(biāo)機(jī)通信、目標(biāo)機(jī)通信連接檢查、命令管理、目標(biāo)機(jī)事件管理、RSP數(shù)據(jù)處理、符號(hào)表管理、日志記錄等功能。
2.3 交叉GDB
交叉GDB提供不同體系結(jié)構(gòu)目標(biāo)機(jī)系統(tǒng)的遠(yuǎn)程調(diào)試支持,在調(diào)試啟動(dòng)配置中可以選擇不同版本的交叉GDB。GDB和目標(biāo)機(jī)服務(wù)器之間接口是MI協(xié)議。目標(biāo)機(jī)服務(wù)器把MI協(xié)議命令轉(zhuǎn)化為RSP協(xié)議,發(fā)給目標(biāo)機(jī)代理處理。
3 交叉調(diào)試工作流程
交叉調(diào)試設(shè)計(jì)為遠(yuǎn)程調(diào)試模式,與CDT本地調(diào)試有所不同,交叉調(diào)試需要與待目標(biāo)機(jī)的體系結(jié)構(gòu)相符的交叉調(diào)試GDB;交叉調(diào)試需要和遠(yuǎn)程目標(biāo)機(jī)通信,這由目標(biāo)機(jī)服務(wù)器負(fù)責(zé);調(diào)試命令由GDB發(fā)給目標(biāo)機(jī)服務(wù)器,返回信息由目標(biāo)機(jī)服務(wù)器傳給GDB,再由CDT界面顯示。
交叉調(diào)試基本步驟為:
(1) 初始化目標(biāo)機(jī)系統(tǒng),建立宿主機(jī)與待調(diào)試目標(biāo)機(jī)之間的通信通道,加載運(yùn)行被調(diào)試的目標(biāo)文件到目標(biāo)機(jī)中;
(2) 啟動(dòng)交叉調(diào)試器。確定宿主機(jī)中和目標(biāo)機(jī)上所運(yùn)行程序?qū)?yīng)的包含調(diào)試信息的目標(biāo)文件,然后啟動(dòng)宿主機(jī)上和目標(biāo)機(jī)體系結(jié)構(gòu)匹配的交叉調(diào)試器GDB,建立該交叉調(diào)試器和目標(biāo)機(jī)服務(wù)器的通信鏈接,以后的調(diào)試命令通過該通信鏈接向目標(biāo)機(jī)發(fā)送命令并接收目標(biāo)機(jī)返回的信息;
(3) 初始化交叉調(diào)試運(yùn)行環(huán)境,建立交叉調(diào)試會(huì)話。啟動(dòng)交叉調(diào)試會(huì)話后,CDT創(chuàng)建并初始化調(diào)試對(duì)象、 遠(yuǎn)程目標(biāo)機(jī)中的線程信息、斷點(diǎn)信息、寄存器信息、內(nèi)存信息、源代碼信息等;
(4) 開始交叉調(diào)試。該過程與CDT的本地調(diào)試步驟(3)類似,GDB收到MI調(diào)試命令后,轉(zhuǎn)換為遠(yuǎn)程串行協(xié)議(Remote Serial Protocol,RSP)命令,發(fā)給目標(biāo)機(jī)服務(wù)器;目標(biāo)機(jī)服務(wù)器將RSP命令發(fā)送給目標(biāo)機(jī)執(zhí)行,并接收目標(biāo)機(jī)返回的執(zhí)行結(jié)果信息和目標(biāo)機(jī)程序執(zhí)行中觸發(fā)事件,送給GDB處理;GDB收到目標(biāo)機(jī)報(bào)告的數(shù)據(jù),轉(zhuǎn)換為MI命令回復(fù)交給CDT;CDT根據(jù)MI命令回復(fù)確定該調(diào)試命令的執(zhí)行結(jié)果。
4 關(guān)鍵技術(shù)
4.1 符號(hào)表管理技術(shù)
符號(hào)表是源碼級(jí)調(diào)試的必要功能。在本地調(diào)試過程中,由GDB管理符號(hào)表并提供查詢接口。交叉調(diào)試時(shí),可能GDB尚未啟動(dòng),或者不具備查詢狀態(tài),不能從GDB獲得符號(hào)信息,需要調(diào)用脫離GCC工具鏈和GDB的符號(hào)表解析程序。解析程序包含4部分:Symbol類、Section類、ElfHeaher類、Elf類和符號(hào)表管理類SymbolManager。
Symbol類描述符號(hào)相關(guān)信息,包括符號(hào)名字、符號(hào)地址、符號(hào)類型以及符號(hào)所屬段等數(shù)據(jù)。
Section類描述段相關(guān)信息,包括段名字、段類型、段屬性、裝入地址和段偏移及大小等數(shù)據(jù)。
ElfHeaher類描述Elf文件頭信息,包括文件類型、目標(biāo)體系類型、處理器標(biāo)識(shí)、文件入口地址、Elf頭偏移及大小、段表信息等數(shù)據(jù)。
Elf類解析帶有調(diào)試信息的目標(biāo)文件信息,創(chuàng)建相關(guān)信息對(duì)象:一個(gè)ElfHeader對(duì)象、一組Section對(duì)象和一組Symbol對(duì)象。
SymbolManager類提供設(shè)置符號(hào)文件、根據(jù)源代碼行號(hào)查地址、根據(jù)地址查源代碼行號(hào)、根據(jù)地址查符號(hào)、根據(jù)符號(hào)查地址以及獲得指定段等接口。
4.2 CDT調(diào)試擴(kuò)展技術(shù)
交叉調(diào)試對(duì)CDT調(diào)試的擴(kuò)展主要是在建立和目標(biāo)機(jī)服務(wù)器的通信鏈接,啟動(dòng)并初始化支持交叉調(diào)試的GDB方面,主要包括以下方面:
(1) 擴(kuò)展交叉調(diào)試命令集實(shí)現(xiàn)CrossCommandFactory。CDT默認(rèn)的調(diào)試命令集包含GDB的MI命令和部分CLI命令,需要加入新的命令如增加符號(hào)文件、根據(jù)源代碼行號(hào)查地址命令、根據(jù)地址查符號(hào)以及根據(jù)符號(hào)查地址等命令;
(2) 擴(kuò)展交叉調(diào)試器實(shí)現(xiàn)CrossDebugger。啟動(dòng)交叉調(diào)試器需要找到符合目標(biāo)機(jī)體系結(jié)構(gòu)的GDB,添加符號(hào)表文件,把CDT建立的本地調(diào)試對(duì)象Target轉(zhuǎn)換為交叉調(diào)試對(duì)象CrossTarget以記錄遠(yuǎn)程目標(biāo)機(jī)的調(diào)試上下文,維護(hù)調(diào)試會(huì)話使用的目標(biāo)機(jī)服務(wù)器鏈接等參數(shù);
(3) 擴(kuò)展交叉調(diào)試器配置實(shí)現(xiàn)CrossDebuggerPage。在調(diào)試啟動(dòng)配置中添加交叉調(diào)試需要的參數(shù)配置界面;
(4) 擴(kuò)展交叉調(diào)試器啟動(dòng)代理實(shí)現(xiàn)CrossLaunchDelegate。根據(jù)配置鏈接目標(biāo)機(jī)服務(wù)器指定要調(diào)試的目標(biāo)機(jī),加載待調(diào)試程序到目標(biāo)機(jī);還有可能需要重定位目標(biāo)文件、設(shè)置所調(diào)試程序參數(shù);根據(jù)配置啟動(dòng)交叉調(diào)試器,創(chuàng)建調(diào)試會(huì)話,初始化源代碼查找器。
5 結(jié) "語
本文主要研究以開源的Eclipse和CDT 項(xiàng)目為依托,在分析Eclipse、CDT和GDB的功能特性的基礎(chǔ)上,根據(jù)CDT的擴(kuò)展服務(wù),實(shí)現(xiàn)在宿主機(jī)上利用交叉調(diào)試GDB,調(diào)試遠(yuǎn)程目標(biāo)機(jī)程序的源代碼級(jí)交叉調(diào)試功能。該交叉調(diào)試支持通用的調(diào)試操作如設(shè)置刪除斷點(diǎn)、源代碼級(jí)或匯編級(jí)單步執(zhí)行、連續(xù)執(zhí)行目標(biāo)程序、查看/修改目標(biāo)程序變量、寄存器、內(nèi)存和查看表達(dá)式等。進(jìn)一步,在嵌入式軟件開發(fā)階段,開發(fā)者必須要對(duì)目標(biāo)系統(tǒng)運(yùn)行狀態(tài)具有完全的觀察和控制能力, 例如硬件的各種寄存器、內(nèi)存空間使用情況、CPU利用率, 操作系統(tǒng)的信號(hào)量、消息隊(duì)列、任務(wù)、堆棧等對(duì)象和系統(tǒng)任務(wù)之間的通信情況、任務(wù)的執(zhí)行軌跡,這將是進(jìn)一步的工作。
參考文獻(xiàn)
[1] Anon. Fortify audit workbench user guide [EB/OL]. [2012?11?17]. http://www. wenku.baidu.com/link?u.
[2] 魏楚元,李陶深,張?jiān)龇?Eclipse:基于插件的下一代通用集成開發(fā)環(huán)境[J].計(jì)算機(jī)應(yīng)用與軟件,2005,22(6):38?40.
[3] 劉芳,臧威.基于Eclipse平臺(tái)的嵌入式交叉調(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].計(jì)算機(jī)應(yīng)用研究,2008(1):206?208,214.