<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2012-03-20 來源:網(wǎng)絡 收藏

          2、程序頭表與段

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

          3、節(jié)頭表與節(jié)

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

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

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

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

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

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

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

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

          4 源碼級交叉調試器實現(xiàn)的技術要點

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

          1、下載目標文件

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

          2、斷點

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

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

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

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

          3、啟動程序運行

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

          4、源碼級單步調試

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



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();