1. 开始之前
长期使用printf、syslog打印的方法在Linux ARM平台下调试C程序,小编深切感受调试效率不高,有时还会忽略删除打印调试的代码,程序需要编译多次向目标机传输,甚至有的问题还不容易定位。为解决调试程序的痛点,引用gdb远程调试方法,它可查看变量值、设置断点等功能,使用起来非常方便。
或许有人会提出疑问,使用gdb需要记很多的命令,一段时间不使用会生疏。说实话,小编也不喜欢记很多命令行,接下来介绍的调试方法是不需要记住任何gdb命令,就是使用VS Code远程调试。
调试前需先对gdb做ARM平台的交叉编译,若已完成交叉编译,可跳过进入下一章节。
1.1 下载gdb文件
推荐在官网下载最新的发布版本,可通过FTP、http、git等方式下载,链接:http://www.gnu.org/software/gdb/download/
小编使用的版本是gdb-8.3.1.tar.xz。
接下来需分别做交叉编译生成arm-linux-gnueabi-gdb和gdbserver可执行文件,编译时间比较长,需耐心等待。
1.2 arm-linux-gnueabi-gdb交叉编译
tar -xvf gdb-8.3.1.tar.xz
cd gdb-8.3.1
./configure --target=arm-linux-gnueabi --prefix=/tmp/gdb
make
make install
在/tmp/gdb目录下能看到编译好的arm-linux-gnueabi-gdb等可执行文件,拷贝arm-linux-gnueabi-gdb拷贝到/usr/bin目录下,此目录已设环境变量。
--target=指定目标机交叉编译器的前缀,表示目标平台是运行在ARM体系结构的Linux内核。
--host=表示目标主机,将运行的平台(在1.3中会用到)。
--prefix=表示编译生成的可执行文件所在目录。
1.3 gdbserver交叉编译
tar -xvf gdb-8.3.1.tar.xz
cd gdb-8.3.1
./configure --host=arm-linux-gnueabi --target=arm-linux-gnueabi --prefix=/tmp/gdbserver
make
make install
和上1步的gdb交叉编译方法类似,在/tmp/gdbserver目录生成编译好的在目标机运行的gdb、gdbserver等可执行文件。
2. 远程调试
2.1 业务流程图
2.2 安装VS Code
VS Code是微软向开发者提供的一款真正意义上的跨平台编辑器,能运行在Windows、Mac OS、Linux系统上,支持多种开发语言,如C、C++、Python等,具有非常丰富的插件,界面简洁友好。安装非常简单,推荐在官网上下载最新发布版本,下载链接。
2.3 安装插件
打开VS Code软件,在插件搜索框分别输入SSH、C/C++,根据关键词自动匹配搜索内容,依次选择安装“Remote-SSH”和“C/C++”这两个插件,如下图所示。
2.4 配置文件
2.4.1 SSH配置
在SSH主界面点击“configure”按钮,选择配置文件输入主机名、用户名及端口号。右击配置的SSH账号可创建连接。
2.4.2 任务配置
点击菜单栏“终端”,在弹出的下拉框选中“配置任务”,主界面出现tasks.json配置文件,如下图所示。
“lable”:任务名称。
“command”: 执行的命令,可将多条命令用“;”分开按照先后顺序执行。
按“ctrl + shift +B”组合快捷键执行运行任务,此快捷键可能会和输入法冲突,使用之前先切换输入法为英文。
2.4.3 gdb配置
点击gdb配置按钮弹出“launch.json”配置文件,仅需对红框里的参数修改。
“program”:表示可执行文件的目录;
“miDebuggerPath”:表示arm-linux-gnueabi-gdb的路径;
“miDebuggerServerAddress”:表示连接目标机gdbserver的网络参数。
2.5 启动gdbserver
编译一个App的可执行文件,如名称app,编译时应带有“-O0 -g”选项参数,将可执行文件di拷贝到目标机下,如/project/app。
将交叉编译的gdbserver拷贝到目标机下,如/project/gdbserver,使用gdbserver启动调试的可执行程序app,执行命令如下。
root@admin:/mnt# ./gdbserver 127.0.0.1:12345 ./app
Process ./di created; pid = 29764
Listening on port 12345
2.6 启动调试
在VS Code菜单栏的“调试(D)”选项选中启动调试,或按下快捷键F5,连接成功的界面如下,可单步运行、设置断点等,和IAR开发软件调试类似,使用起来非常方便。
目标机运行的gdbserver会打印客户端连接信息。
root@admin:/mnt# ./gdbserver 127.0.0.1:12345 ./app
Process ./di created; pid = 29764
Listening on port 12345
Remote debugging from host 192.168.9.155, port 46004