1.前言
1.在linux下開發,免不了使用gdb調試,但是linux下開發嵌入式,都是跑在ARM板子上的,網上有很多GDB的基礎教程,但是能在ARM開發板用的時候,會有各種問題。
比如:*.cpp: No such file or directory.這是因為用gcc編譯的時候,代碼還是在本地,并沒有在arm平臺上來。
所以說還是有必要出一個arm端使用gdb教程
2.下載,編譯gdb服務端(運行在arm端)
1.下載gdb8.3:下載地址
我也試過其他版本的gdb,比如說gdb7.6,會缺少一些依賴庫termcap,搞起來挺麻煩的,所以還是推薦使用gdb8.3吧。配置編譯安裝一步過。
1.解壓。
tar -xzf gdb-8.3.tar.gz
cd gdb-8.3
2.配置
./configure --prefix="$PWD/_install" --disable-shared --target=aarch64-himix210-linux --host=aarch64-himix210-linux
記住aarch64-himix210-linux換成自己的編譯器
3.編譯
make -j8
make install
最后的結果gcore gdb gdb-add-index gdbserver run
文件在gdb-8.3/install/bin
目錄下,拷貝到arm的rootfs中備用。
3.編譯gdb服務端(運行在arm端)
1.清理gdb工程
make distclean
2.配置,編譯,安裝
./configure --target=aarch64-himix210-linux --prefix="~/.local/bin" –program-prefix=aarch64-himix210-linux
說明:
1.–target=aarch64-himix210-linux 意思是說目標平臺是運行于ARM體系結構的linux內核;
2.–program-prefix=aarch64-himix210-linux 是指生成的可執行文件的前綴,比如aarch64-himix210-linux-gdb(可選參數)
3.–prefix= 是指生成的可執行文件安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動創建(當然,權限足夠的話)
編譯,安裝
make
make install
4.使用
4.1前期準備
將之前生成的 gdbserver 調試程序放在目標板上或者通過 nfs 方式運行也可以.這樣就可以用 gdb 和 gdbserve 遠程調用來調試目標板上的程序了。
一般情況 gdbserver 程序較大,所以建議采用 nfs 的方式掛載在目標板上運行較好,也可以通過 strip 減少 gdbserver 的大小(刪除程序中符號表、調試符號表信息等)
4.2在arm板上運行gdbserver
./gdbserver --remote-debug 192.168.1.100:8005 helloworld
192.168.1.100 為PC開發主機的 IP 地址; 8005 是用來作為 gdb 調試監聽的端口,可自行設置;helloworld是編譯好的目標操作程序
為了更好地使用 gdb 的調試功能,
在編譯目標板程序helloworld時需加入gcc -g 選項,
或者CMakelists.txt中添加
SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
4.3 在PC上運行gdb
1、在宿主機上運行 gdb 程序
./aarch64-himix210-linux helloworld
aarch64-himix210-linux-gdb 是編譯 gdb 生成安裝在 bin 目前錄下的文件,名稱可能因為設置了 –program-prefix 參數有所改變,helloworld是和目標板上的 helloworld一樣的程序文件
2、進入 gdb 調試狀態后,連接目標板
(gdb) target remote 192.168.1.102:8005
192.168.1.102 為ARM板的 IP 地址,8005 則是 gdb 調試監聽的端口
3、連接成功后則開始運行,pc機之后根據 gdb 指令設置斷點、單步調試等功能進行調試
(gdb) r
5 附:GDB常用的調試指令
GDB 調試器提供有大量的調試選項,可滿足大部分場景中調試代碼的需要。如表所示,羅列了幾個最常用的調試指令(包含指令縮寫)及各自的作用:
GDB常用的調試指令
GDB 調試器提供有大量的調試選項,可滿足大部分場景中調試代碼的需要。如表所示,羅列了幾個最常用的調試指令(包含指令縮寫)及各自的作用:
調試指令 | 作 用 |
---|---|
(gdb) break xxx (gdb) b xxx | 在源代碼指定的某一行設置斷點,其中 xxx 用于指定具體打斷點的位置。 |
(gdb) run xxx (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 | 退出。 |