天天看點

在VSCODE 中使用GDB+序列槽進行調試嵌入式程式

對于嵌入工Linux類的應用程式,由于裝置的硬體資源有限,沒有像單片機類調試接口也無法在其上面安裝完整的開發環境,是以無法直接像本地電腦一樣調試應用程式。當需要排查裝置問題時,最常用的方法是抓取裝置LOG進行分析,效率比較低下,這時候可以使用遠端GDB調試,它可以實作對程式的實時監控和調試,并幫我們快速定位問題。

遠端GDB調試有兩種方式,第一種方式是通過SSH連接配接調試,需要網絡支援,另外一種就是本文介紹的通過序列槽調試,主要分以下幾步進行。

  1. 編譯GDB Server
  2. 應用程式配置
  3. vscode配置
  4. 啟動應用及調試

編譯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 殺掉重新來。