<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于ELF的嵌入式軟件源碼級交叉調試技術(shù)

基于ELF的嵌入式軟件源碼級交叉調試技術(shù)

作者: 時(shí)間:2012-03-20 來(lái)源:網(wǎng)絡(luò ) 收藏

2、程序頭表與段

程序頭表中有多個(gè)表項,每個(gè)表項是一個(gè)程序段的信息,固定長(cháng)度為32個(gè)字節,包含8個(gè)值,包括段在文件中的位置,段在內存中的起始虛擬地址,段的長(cháng)度及其它屬性等。調試器根據程序頭表中的信息來(lái)確定需要下載到目標機上的目標文件內容(指令與數據)及其在目標機中的內存地址。

3、節頭表與節

節頭表中也有多個(gè)表項,每個(gè)表項是一個(gè)節的信息,固定長(cháng)度為40個(gè)字節,包含10個(gè)值,包括節名、節的類(lèi)型、該節在文件中的位置、該節在內存中的起始地址(如果該節出現在內存映象中)、節的長(cháng)度等信息。某些節是程序段的組成部分,如包含程序二進(jìn)制指令代碼的正文節.text和數據節.rodata,.hash等,某些節不作為段的組成部分,只提供其它的額外信息。為源碼調試服務(wù)的有 .debug,.line,.symtab,.debug_ pubname,.debug_range等節,其中.debug, .line節包含了源碼調試信息的基本內容。

debug節中有多種類(lèi)型的記錄,可分為幾大類(lèi):

編譯模塊信息:包含組成該文件的各個(gè)模塊的源文件名,路徑,及該模塊的代碼地址范圍等。

子程序信息:包含程序名,程序類(lèi)型,起始終止地址,程序返回結果存放地址等。

變量信息:包含變量名、變量類(lèi)型、變量存放地址信息等,變量有多種類(lèi)型,簡(jiǎn)單變量、結構變量等類(lèi)型的變量其信息內容各有不同。

將.debug節中各項內容的結構關(guān)系抽象為家族關(guān)系。以節的起始為根,首先是一個(gè)編譯單元的信息,它給出下一個(gè)編譯單元(兄弟關(guān)系)在文件中的相對位置。緊跟著(zhù)編譯單元的是該編譯單元中的子程序與公共變量信息(父子關(guān)系),同樣的,編譯單元中頭一個(gè)函數記錄或變量記錄將給出它的兄弟的位置信息。緊隨該函數記錄的是該函數內部的子程序與局部變量信息。相鄰層次成員是父子關(guān)系,同一層次上的成員是兄弟關(guān)系,如圖4所示:

.line節中包含目標代碼地址與源代碼行號之間的對應關(guān)系。對每個(gè)編譯單元給出其行記錄信息的長(cháng)度和目標碼的起始基地址,以及該編譯單元中所有的行記錄,每條記錄以固定的格式表示:“該行目標碼相對于基地址的偏移,列號(保留,暫未使用),行號”。

綜合上述程序段和節的內容,即可確定源碼與目標碼的映射關(guān)系。如給定一個(gè)文件名及行號,確定其目標代碼的信息。首先根據文件名確定其在.debug 節中的編譯模塊信息,從中可得該文件模塊的起始終止地址;再由其起始地址找到該編譯模塊的行記錄信息在.line節中的位置,根據行號找到行記錄,得到該行目標碼的地址范圍;由這些地址信息,可直接從目標機內存中取得目標代碼,也可結合程序段信息從目標文件的程序段中取得該行所對應的目標代碼指令內容。調試器利用地址與指令信息就可以查看、修改、執行相應目標代碼,供用戶(hù)進(jìn)行調試。

4 源碼級交叉調試器實(shí)現的技術(shù)要點(diǎn)

在設計交叉調試器JDBG時(shí),首先完成與目標文件無(wú)關(guān)的部分:連接目標機,查看修改目標機寄存器和內存;然后實(shí)現與目標文件有關(guān)的部分:下載目標文件到目標機,源碼級調試功能,包括斷點(diǎn)控制、執行控制、變量觀(guān)察等,以下重點(diǎn)討論各項功能的設計與實(shí)現。

1、下載目標文件

目標文件中包含多種類(lèi)型的內容,目標程序在目標機上運行時(shí)只需要程序的二進(jìn)制指令代碼與相關(guān)數據,這些內容包含在文件中的可執行程序段中。下載目標文件時(shí)在宿主機上提取目標文件中的代碼與數據段,根據其地址映射關(guān)系利用remote協(xié)議中寫(xiě)內存的功能在目標機上建立程序的遠程映像。

2、斷點(diǎn)

斷點(diǎn)是調試器控制程序執行的基本手段。各種機器有其特殊的斷點(diǎn)指令(如X86的int3指令),設置斷點(diǎn)就是將機器斷點(diǎn)指令替換所指定程序單元中的指令,使得程序運行到斷點(diǎn)指令處時(shí),產(chǎn)生“斷點(diǎn)異?!?,用戶(hù)程序不再繼續執行下去,目標機向宿主機返回斷點(diǎn)停止信號,由宿主機調試器接管對用戶(hù)程序的控制。

斷點(diǎn)分為邏輯斷點(diǎn)與物理斷點(diǎn),兩者是多對一的關(guān)系。邏輯斷點(diǎn)與源代碼對應,提供源級斷點(diǎn)信息(源文件名+行號或物理地址等);物理斷點(diǎn)與目標碼對應,提供斷點(diǎn)的目標碼地址及斷點(diǎn)處的指令內容。插入一個(gè)斷點(diǎn)即根據邏輯斷點(diǎn)信息確定物理斷點(diǎn)地址,將該地址對應指令用機器斷點(diǎn)指令替代;刪除斷點(diǎn)即恢復斷點(diǎn)指令處預先保存的原指令,使得程序可繼續執行。

檢查點(diǎn)是一種條件斷點(diǎn),使程序在條件滿(mǎn)足時(shí)停止執行。通常條件都涉及表達式的值變化,利用寫(xiě)內存保護來(lái)檢查表達式的值是最常用的方法,但這種方法不適用于不具備MMU功能的處理器。某些處理器(如i386)提供了專(zhuān)門(mén)的調試控制寄存器,通過(guò)在調試控制寄存器中設置相應線(xiàn)性地址及中止條件(讀或寫(xiě))即可中止程序的運行。通過(guò)查詢(xún)方式檢查表達式的值也是一種可行的方法,其效率相對較低。當檢查點(diǎn)的條件滿(mǎn)足時(shí),檢查點(diǎn)的操作與普通斷點(diǎn)類(lèi)似。

對一個(gè)斷點(diǎn)應具有基本的插入、刪除、使能、使不能等基本操作功能。在設計中采用雙向鏈表結構作為斷點(diǎn)的數據結構,使得斷點(diǎn)控制更加方便高效。

3、啟動(dòng)程序運行

啟動(dòng)程序運行首先從目標文件的ELF頭中得到應用程序的入口,將目標機的PC寄存器置為該入口地址,從入口處開(kāi)始執行程序指令。如果程序中沒(méi)有設置任何斷點(diǎn)或檢查點(diǎn),則程序一直運行到結束;如果程序中有斷點(diǎn),則程序運行到第一個(gè)斷點(diǎn)處停止并返回其停止位置。

4、源碼級單步調試

源碼級單步以行為單位,一行源代碼對應多條機器指令,因此一個(gè)源語(yǔ)句的單步執行需要多個(gè)機器指令的單步執行。最簡(jiǎn)單的實(shí)現方法就是從源語(yǔ)句對應目標代碼的起始地址開(kāi)始逐條單步執行機器指令。顯然這種方法效率很低,尤其調試嵌入式軟件需要大量宿主機/目標機間的通訊,而且有的處理器自身并不提供機器單步執行指令。因此,更有效的方法是用“內部臨時(shí)斷點(diǎn)+連續執行”的方式來(lái)實(shí)現。



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>