• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于Eclipse的嵌入式軟件交叉調(diào)試

    2015-07-24 08:21李運(yùn)喜麥先根
    現(xiàn)代電子技術(shù) 2015年6期
    關(guān)鍵詞:源代碼斷點(diǎn)插件

    田 丹,李運(yùn)喜,胡 寧,麥先根

    (中航工業(yè) 西安航空計(jì)算技術(shù)研究所 三室,陜西 西安 710068)

    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。

    圖1 交叉調(diào)試結(jié)構(gòu)

    國(guó)外計(jì)算機(jī)業(yè)在嵌入式軟件調(diào)試領(lǐng)域發(fā)展很快,開發(fā)出多款功能強(qiáng)大、支持多種目標(biāo)機(jī)的交叉調(diào)試器。目前國(guó)內(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++Develop?ment Toolkit)插件;支持Java開發(fā)調(diào)試的JDT插件;支持XML開發(fā)的WST插件;支持遠(yuǎn)程系統(tǒng)開發(fā)的RSE(Re?mote 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)存信息、源代碼信息等;

    (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)功能,將嵌入式交叉工具鏈無(wú)縫集成到交叉調(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)試支持。

    圖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.de?bug.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)試器配置頁(yè)擴(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ī)通信接口。

    樣品經(jīng)濕法消化后,導(dǎo)入原子吸收分光光度計(jì)中,經(jīng)火焰原子化后,吸收422.7 nm處的共振線,其吸收量與含量成正比,與標(biāo)準(zhǔn)系列比較定量。

    目標(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)表管理類 Symbol?Manager。

    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)CrossCommandFacto?ry。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)CrossLaunch?Delegate。根據(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é) 語(yǔ)

    本文主要研究以開源的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)一步的工作。

    [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/on?linedocs/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.

    猜你喜歡
    源代碼斷點(diǎn)插件
    人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
    基于TXL的源代碼插樁技術(shù)研究
    自編插件完善App Inventor與樂高機(jī)器人通信
    一類無(wú)限可能問題的解法
    軟件源代碼非公知性司法鑒定方法探析
    主導(dǎo)電回路發(fā)生斷點(diǎn)故障判斷方法探討
    基于jQUerY的自定義插件開發(fā)
    揭秘龍湖產(chǎn)品“源代碼”
    MapWindowGIS插件機(jī)制及應(yīng)用
    基于Revit MEP的插件制作探討
    亳州市| 德钦县| 灵丘县| 方城县| 唐山市| 彰武县| 于都县| 荣昌县| 巴青县| 盐池县| 会泽县| 宜兰市| 鸡泽县| 财经| 正宁县| 南开区| 太谷县| 城步| 大荔县| 温宿县| 镇康县| 富民县| 松潘县| 天门市| 普兰店市| 阿克陶县| 大方县| 汶上县| 潞城市| 彭山县| 宁明县| 桃江县| 习水县| 泰和县| 南和县| 白山市| 平安县| 庄浪县| 平潭县| 蓬安县| 黄大仙区|