在海思晶片上使用GDB遠程調試

1 前言

        使用海思平台上(編譯工具鏈:arm-himix200-linux)交叉編譯 GDB 工具(使用版本8.2,之前用過10.2的版本,在編譯 gdbserver 遇到編譯出錯的問題,因為關聯了其他靜態庫等,嘗試解決,但是遇到了一些其他問題,因為時間問題折騰了一段時間就放棄使用10.2的版本了)。

        通過使用 gdb+gdbserver 遠程調試目標板,之後可以通過 VSCode 配置好後實現和 IDE 集成開發環境一樣的比較直觀方便調試。


2 編譯

2.1 前期準備

        1)下載 gdb(網上很多,搜素就能下載,我選擇的是 gdb-8.2)

        2)解壓縮,輸入指令解壓 tar -vxzf gdb-8.2.tar.gz

        3)進入解壓後的目錄中 cd gdb-8.2

2.2 環境配置

2.2.1 編譯 gdb

1)配置生成 Makefile 文件

./configure --target=arm-himix200-linux --prefix=~/gdbTool

–target=arm-himix200-linux 意思是說目標平台是運行於ARM體系結構的linux內核;

–program-prefix=arm-himix200-linux 是指生成的可執行文件的前綴,比如 arm-himix200-linux-gdb(可選參數)

–prefix= 是指生成的可執行文件安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動創建(當然,許可權足夠的話)

2)編譯、安裝

make & make install

會在–prefix 指定的目錄下生成四個子目錄:bin、include、lib 和 share,我們需要的 arm-himix200-linux-gdb 就在其中的bin目錄下。

2.2.2 編譯 gdbserver

1)進入 gdbserver 目錄下(不同的版本路徑不一樣,比如 gdb-8.2 的路徑為 gdb-8.2/gdb/gdbserver,而 gdb-10.2 的路徑為 gdb-10.2/gdbserver),則指令為cd gdb/gdbserver

2)在 gdbserver 目錄下配置生成 Makefile 文件

./configure --host=arm-himix200-linux --prefix=~/gdbTool

–host=arm-himix200-linux 指定了生成可執行文件運行的平台和系統:運行於ARM平台的Linux系統

–prefix= 是指生成的可執行文件安裝在哪個目錄

3)編譯、安裝(會在–prefix 指定的目錄下生成 bin 目錄,gdbserver 就在 bin 目錄下)

make & make install

3 使用步驟

3.1 前期準備

將之前生成的 gdbserver 調試程式放在目標板上或者通過 nfs 方式運行也可以.這樣就可以用 gdb 和 gdbserve 遠程調用來調試目標板上的程式了。

一般情況 gdbserver 程式較大,所以建議採用 nfs 的方式掛載在目標板上運行較好,也可以通過 strip 減少 gdbserver 的大小(刪除程式中符號表、調試符號表資訊等)

3.2 執行 gdbserver

在目標板上運行需要調試的程式,如

./gdbserver --remote-debug 192.168.1.100:8005 test

192.168.1.100 為宿主機的 IP 地址; 8005 是用來作為 gdb 調試監聽的埠,可自行設置;test 是編譯好的目標板程式

(為了更好的使用 gdb 的調試功能,在編譯目標板程式時需加入 -g 選項)

3.3 執行 gdb

1、在宿主機上運行 gdb 程式

./arm-himix200-linux-gdb test

arm-himix200-linux-gdb 是編譯 gdb 生成安裝在 bin 目錄下的文件,名稱可能因為設置了 –program-prefix 參數有所改變,test 是和目標板上的 test 一樣的程式文件

2、進入 gdb 調試狀態後,連接目標板

(gdb) target remote 192.168.1.102:8005

192.168.1.102 為目標板的 IP 地址,8005 則是 gdb 調試監聽的埠

3、連接成功後則開始運行,宿主機之後根據 gdb 指令設置斷點、單步調試等功能進行調試

(gdb) r

附

GDB常用的調試指令

GDB 調試器提供有大量的調試選項,可滿足大部分場景中調試程式碼的需要。如表所示,羅列了幾個最常用的調試指令(包含指令縮寫)及各自的作用:

調試指令 作 用

(gdb) break xxx 

(gdb) b xxx

在源程式碼指定的某一行設置斷點,其中 xxx 用於指定具體打斷點的位置。

(gdb) run 

(gdb) r

執行被調試的程式,其會自動在第一個斷點處暫停執行。

(gdb) continue 

(gdb) c

當程式在某一斷點處停止運行後,使用該指令可以繼續執行,直至遇到下一個斷點或者程式結束。

(gdb) next 

(gdb) n

令程式一行程式碼一行程式碼的執行。

(gdb) print xxx 

(gdb) p xxx

列印指定變數的值,其中 xxx 指的就是某一變數名。

(gdb) list

(gdb) l

顯示源程式程式碼的內容,包括各行程式碼所在的行號。

(gdb) quit 

(gdb) q

終止調試。

 

 

 

Exit mobile version