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 |
終止除錯。 |