在海思晶片上使用GDB遠端偵錯

2022-06-16 18:01:01

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

終止偵錯。