1. 程式人生 > >SylixOS中AARCH64的GDB除錯實現

SylixOS中AARCH64的GDB除錯實現

1. GDB功能實現的框架

1.1 GDB的簡介

GDB是GNU開源組織釋出的一個強大的UNIX下程式除錯工具。SylixOS中除Lite版本外,都可以實現GDB除錯功能。 GDB可以對C和C++程式進行除錯,它使使用者能在程式執行時觀察程式的內部結構和記憶體的使用情況。以下是GDB所提供的一些功能:

  1. 能監視程式中變數的值;
  2. 能設定斷點以使程式在指定的程式碼行上停止執行;
  3. 能逐行執行程式碼。

1.2 GDB的組成框架

GDB由gdb-server和gdb-host組成。 目標板使用gdb-server來啟動已經編譯好的程式碼,執行斷點、單步等除錯動作,同時通過網路、串列埠等反饋除錯需要的資訊給gdb-host。 宿主機上執行gdb-host,解析gdb-server傳來的資訊,同時,傳送斷點、單步等動作給目標板。

2. SylixOS中GDB的實現

2.1 Base中已經實現的內容

在SylixOS中,gdb-server的主要通訊流程和網路通訊框架,已經在Base中實現,程式碼位置如下圖所示。 gdb-server的實現 這部分程式碼邏輯中,已經完成和gdb-host的通訊邏輯。當在RealEvo-IDE中的Debug介面,進行單步,執行到指定行,全速執行等操作時,gdb-host實際通過對應架構的xxxx-sylixos-elf-gdb.exe工具與板卡內的gdb-server進行通訊。

2.2 ARCH需要實現的內容

在每個具體架構中,都存在dbg目錄,該目錄下對應有xxxDbg.c和xxxGdb.c檔案,以及xxx_gdb.h檔案,如下圖所示。 ARCH中GDB的實現

2.2.1 xxx_gdb.h的實現

xxx_gdb.h中主要實現與GDB相關的結構體變數定義和函式宣告。 比如,在AARCH64中,xxx_gdb.h 中對 GDB 相關結構體的定義如下程式清單所示:

/***************************************************************************
  最大暫存器數
***************************************************************************/
#define GDB_MAX_REG_CNT     34
/***************************************************************************
  暫存器集合結構
***************************************************************************/
typedef struct {
    INT         GDBR_iRegCnt;                          /* 暫存器數量                 */
    struct {
        ULONG   GDBRA_ulValue;                         /* 暫存器值                   */
    } regArr[GDB_MAX_REG_CNT];                        /* 暫存器陣列                  */
} GDB_REG_SET;

在該結構體中需要定義gdb-server監控和傳輸的暫存器數量,以及為每個暫存器分配儲存的空間。監控和傳輸的暫存器數量,由GNU官方定義。比如在GNU提供的AARCH64 gdb說明中,其對org.gnu.gdb.aarch64.core的定義如下: org.gnu.gdb.aarch64.core的定義

2.2.2 xxxGdb.c的實現

xxxGdb.c 中必須實現如下圖所示的介面。 xxxGdb.c 需要實現的介面 在xxxGdb.c中定義了兩個描述 xml 結構的全域性變數,分別為CoreXml和TargetXml的描述,這兩個描述型別都可以從GNU查詢到。 CoreXml的定義 TargetXml的定義 需要實現介面中的archGdbCoreXml和archGdbTargetXml就是分別返回這兩個結構的函式實現。 archGdbRegsGet和archGdbRegsSet分別用於返回暫存器結構的狀態,以及對暫存器結構中的狀態值進行設定,通過這兩個函式,就可以在IDE中監測和設定對應的暫存器值。 archGdbRegSetPc、archGdbRegGetPc和archGdbGetNextPc 是對PC指標的獲取和設定,其中archGdbRegSetPc和archGdbRegGetPc就是單獨對暫存器結構中的PC值進行設定和獲取。 archGdbGetNextPc是單步除錯重點需要實現的邏輯。此段程式碼邏輯中,需要針對異常分支、直接設定PC、函式返回等多種情況下,Next PC的邏輯進行考慮和實現。

2.2.3 xxxDbg.c的實現

xxxDbg.c 中必須實現如下圖所示的介面。 xxxDbg.c 的實現 archDbgAbInsert用於實現斷點插入的邏輯。斷點插入的實現思路是,在需要產生斷點的位置,替換一條斷點指令。這樣當程式執行到斷點處時,就會進入斷點異常,在斷點異常的處理流程中,向gdb-host傳送暫存器狀態。 archDbgBpRemove 、archDbgBpPrefetch 和 archDbgBpAdjust 都是對斷點的通用處理,基本上各個架構實現的方式都類同。

3. RealEvo-IDE配置中需要修改的地方

此外,在RealEvo-IDE的安裝目錄“RealEvo\ide\tools\gdb”內需要根據具體的架構,預先建立一個gdbinit.txt文件。 否則,在IDE中啟動gdb程式時,會出現異常。