目錄
前言
實現
? ? ? ? 1、內核配置
? ? ? ? 2、GDB移植
? ? ? ? 3、準備調試程序
? ? ? ? 4、開始調試
前言
? ? ? ? gdb調試器是基于命令行的GNU項目調試器,通過gdb工具我們可以實現許多調試手段,同時gdb支持多種語言,兼容性很強。?
????????在桌面 Linux 系統(如 Ubuntu、CentOS 等)上,我們通常可以直接運行 gdb 來調試程序。然而,在嵌入式系統中,由于芯片性能較弱,直接運行 gdb 不太現實(除非是性能較強的嵌入式芯片)。因此,我們通常在 PC 端運行 gdb 工具,源碼也在 PC 端,而對應的可執行文件則放在開發板上運行。為了實現這一點,我們需要在開發板上運行gdbserver,通過網絡與 PC 端的 gdb 進行通信。因此,要在 PC 上通過 gdb 調試嵌入式程序,需要兩個工具:gdb 和 gdbserver,其中 gdb 在 PC 上運行,gdbserver 則需要移植到開發板上運行。
? ? ? ? 一般的交叉編譯器已經自帶了GDB工具,主要為:gdb與gdbserver。在交叉編譯器安裝目錄的bin目錄內就有這兩個工具。需要注意的是,不同的交叉編譯工具鏈編譯的可執行文件是不一樣的,要注意開發平臺上的文件系統編譯使用的是什么交叉編譯工具鏈,不然在執行gdbserver的時候會一直報錯說找不到文件以及“During startup program exited with code 127”的報錯信息。
實現
平臺:T113
服務器:Ubuntu 16.04
交叉編譯器:gcc-arm-linux-gnueabi
? ? ? ? ?1、內核配置
Kernel hacking --->[*] Kernel debugging[*] KGDB: kernel debugger[*] Compile the kernel with debug info[*] KGDB: use kgdb over the serial console
? ? ? ? 2、GDB移植
? ? ? ? 進入交叉編譯器安裝目錄的bin目錄內,可以看到里面自帶了gdbserver工具,將其放置到開發平臺的根文件系統的/usr/bin目錄即可。
? ? ? ? 3、準備調試程序
? ? ? ? 簡單編寫一個應用程序,使用交叉編譯器編譯成可執行文件,記得要加上“-g”,表示編譯的時候加上調試信息,編譯后使用scp傳輸到開發平臺上。
#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{unsigned int times = 0;for (int i=0; i<5; i++) {printf("runing times:%d\r\n", times);times++;sleep(1);}
}
????????????????????????
? ? ? ? 4、在開發平臺輸入命令開啟gdbserver等待PC端連接
gdbserver 192.168.31.54:2001 gdbtest
·gdbserver 工具
·192.168.31.54 PC端IP
·2001 端口 隨便整一個
·gdbtest 應用程序
????????
????????如果輸入后報錯說找不到文件或者報錯“During startup program exited with code 127”那就可能是交叉編譯器不對,編譯出來的文件不可執行,這是本人遇到的情況。
? ? ? ? 5、PC端運行gdb工具進行調試,運行后就會如下圖等待我們輸入命令。
./arm-linux-gnueabi-gdb /<具體路徑>/gdbtest
? ? ? ? 6、連接到開發平臺,輸入命令連接
//連接到開發板上
target remote 192.168.31.28:2001
·192.168.31.28 開發板IP
·2001 端口
? ? ? ? 看看開發板的情況,可以看到已經連接上了,接下來就可以進行調試了。
??????????
? ?4、開始調試
? ? ? ? 在調試前先了解一下gdb的命令
命令 | 作用 |
? ? ? ? l | 列出所有程序源碼 |
????????b | 設置斷點 |
????????c | 運行到斷點處 |
????????s | 單步運行(會運行到函數里面) |
????????n | 單步運行(不會進函數里) |
????????p | 打印某個變量值 |
????????q | 退出gdb調試界面,運行后開發板上的gdbserver也會停止 |
????????1)列出程序源碼
????????
? ? ? ? 2)設置斷點到main函數
???????????????????????
? ? ? ? 3)運行程序,遇到斷點會停下,可以看到停在了main起始位置
????????
? ? ? ? 4)單步運行(進函數內),運行四次
???????????????
? ? ? ? 5)打印變量值,可以看到已經=1了,因為我們運行過一次完整的循環了
?????????????????? ??
? ? ? ? 6)自動執行程序,輸入命令c,可以看到運行結束了,同時開發板也會打印出調試信息。
???????????????????????
???????????????? ???????
? ? ? ? 7)PC端退出gdb調試
???????????????????????????????????????????????????????????????????????????????????