对于嵌入工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 杀掉重新来。