對于嵌入工Linux類的應用程式,由于裝置的硬體資源有限,沒有像單片機類調試接口也無法在其上面安裝完整的開發環境,是以無法直接像本地電腦一樣調試應用程式。當需要排查裝置問題時,最常用的方法是抓取裝置LOG進行分析,效率比較低下,這時候可以使用遠端GDB調試,它可以實作對程式的實時監控和調試,并幫我們快速定位問題。
遠端GDB調試有兩種方式,第一種方式是通過SSH連接配接調試,需要網絡支援,另外一種就是本文介紹的通過序列槽調試,主要分以下幾步進行。
- 編譯GDB Server
- 應用程式配置
- vscode配置
- 啟動應用及調試
編譯GDB Server
GDB Server需要在目标機上運作,這需要交叉編譯器編譯出來,如果不知道怎麼編譯的可以自行百度,不過交叉編譯器的目錄中一般都會帶有,直接複制到目标闆即可,所在的目錄如下:
{編譯目器目錄}/arm-linux-gnu/libc/usr/lib/bin/gdbserver
一種簡單方法是直接編譯器目錄搜尋出來
應用程式配置
應用程式配置包含編譯選項,在makefile中添加-g選項,優化選項最好選擇為o0
CFLAGS += -O0
CFLAGS += -g
vscode配置
在.vscode目錄下建立launch.json檔案,記得先安裝c/c++插件
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "set root",
"text": "set sysroot ../buildroot/buildroot/output/host/mipsel-buildroot-linux-gnu/sysroot",
"ignoreFailures": true,
},
],
"miDebuggerPath":"../arm-linux-gcc/bin/mips-linux-gnu-gdb",
"miDebuggerArgs": "-b 460800 ${workspaceFolder}/app",
"miDebuggerServerAddress": "/dev/ttyCH341USB0",
}
]
}
其中以下幾項需要特别注意:
指定APP程式路徑
"program": "${workspaceFolder}/app":調試的APP名稱
"cwd": "${workspaceFolder}":工作目錄
指定本地符号庫
調試程式過程中,GDB需要加載APP用到的動态庫到本地,這些動态庫都放到了闆子上usr/lib下,由于使用的是序列槽通信,波特率慢,加載過程會非常久。為了解決這個問題,可以通過發送set sysroot指令給GDB指定加載本地編譯好的庫,如果你使用的是buildroot建構的程式,庫的路徑存放在..-buildroot-linux-gnu/sysroot中,如下所示在setupCommands表中添加一個指令,這可以在啟動GDB前執行。
{
"description": "set root",
"text": "set sysroot ../buildroot/buildroot/output/host/arm-buildroot-linux-gnu/sysroot",
"ignoreFailures": true,
},
指定GDB的路徑
直接使用交叉編譯的GDB即可
"miDebuggerPath":"../arm-linux-gcc/bin/mips-linux-gnu-gdb",
指定伺服器位址
如果使用的是SSH進行調試,則位址寫IP和端口,如果使用的是序列槽,則寫的是連接配接到主機端的序列槽号(序列槽接入LINUX後記得加777權限)。
"miDebuggerServerAddress": "/dev/ttyCH341USB0",
指定啟動參數
GDB啟動參數通常寫的是APP名稱,不過對于序列槽來說還需要指定通信波特率,如下所示,指定了460800波特率,這個越高越好,除此之外,闆子上也得設定一樣的波特率
miDebuggerArgs": "-b 460800 ${workspaceFolder}/app
到這裡為止,VSCODE的配置基本算完畢了。
啟動應用調試
下一步就是啟動程式跟調試了,需要先将GDB Server跟APP都複制到闆子上,并運作起來。
目标序列槽配置
啟動應用前,需要先前闆子上的序列槽波特率配置跟主機一樣,如下所示通過stty指令更改波特率,這裡我使用的是序列槽5進行調試的。
stty -F /dev/ttyS5 speed 460800 \r\n
啟動應用
接着使用GDB Server啟動應用程式,通常指令如下:
gdbserver --remote-debug /dev/ttyS5 app &
/dev/ttySx:用于DEBUG的序列槽号,非闆子終端列印的用的序列槽,這意味差需要兩個序列槽才行
app:待調試的應用程式
啟動調試
完成上面所有操作之後,就可以開始調試的,點選VSCODE左側邊欄的三角符号按鈕(Run and Debug),下拉選擇C/c++調試,此時闆子終端上會列印一系列的消息出來表示已經通信上了,可以點選運作,打斷點之類的操作,不過由于使用序列槽的原因,操作起來比較慢。
常見問題
1.暫停之後複位應用程式無響應,解決辦法在本地将gdbserver --remote-debug /dev/ttyS5 殺掉重新來。