1.开始之前
常年使用printf、syslog复印的方式在LinuxARM平台下调试C程序linux系统教程,小编真切体会调试效率不高,有时都会忽视删掉复印调试的代码,程序须要编译多次向目标机传输,甚至有的问题还不容易定位。为解决调试程序的痛点,引用gdb远程调试方式windows下调试linux程序,它可查看变量值、设置断点等功能,使用上去十分便捷。
似乎有人会提出疑惑,使用gdb须要记好多的命令,一段时间不使用会生疏。说实话,小编也不喜欢记好多命令行,接出来介绍的调试方式是不须要记住任何gdb命令,就是使用VSCode远程调试。
调试前需先对gdb做ARM平台的交叉编译,若已完成交叉编译,可跳过步入下一章节。
1.1下载gdb文件
推荐在官网下载最新的发布版本,可通过FTP、http、git等形式下载,链接:/software/gdb/download/
小编使用的版本是gdb-8.3.1.tar.xz。
接出来需分别做交叉编译生成arm-linux-gnueabi-gdb和gdbserver可执行文件,编译时间比较长,需耐心等待。
1.2arm-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.3gdbserver交叉编译
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-1VSCode远程gdb调试业务流程图
2.2安装VSCode
VSCode是谷歌向开发者提供的一款真正意义上的跨平台编辑器,能运行在Windows、MacOS、Linux系统上,支持多种开发语言,如C、C++、Python等,具有极其丰富的插件,界面简约友好。安装特别简单,推荐在官网上下载最新发布版本,下载链接。
2.3安装插件
打开VSCode软件,在插件搜索框分别输入SSH、C/C++,依照关键词手动匹配搜索内容,依次选择安装“Remote-SSH”和“C/C++”这两个插件,如右图所示。
图2-2SSH插件界面
图2-3C/C++插件界面
2.4配置文件
2.4.1SSH配置
在SSH主界面点击“configure”按钮,选择配置文件输入主机名、用户名及端标语。右击配置的SSH帐号可创建联接。
2.4.2任务配置
点击菜单栏“终端”,在弹出的下拉框选中“配置任务”,主界面出现tasks.json配置文件,如右图所示。
图2-4运行任务配置界面
“lable”:任务名称。
“command”:执行的命令,可将多条命令用“;”分开根据先后次序执行。
按“ctrl+shift+B”组合快捷键执行运行任务,此快捷键可能会和输入法冲突linux系统安装,使用之前先切换输入法为中文。
2.4.3gdb配置
点击gdb配置按键弹出“launch.json”配置文件windows下调试linux程序,仅需对红框里的参数更改。
“program”:表示可执行文件的目录;
“miDebuggerPath”:表示arm-linux-gnueabi-gdb的路径;
“miDebuggerServerAddress”:表示联接目标机gdbserver的网路参数。
图2-5gdb配置界面
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启动调试
在VSCode菜单栏的“调试(D)”选项选中启动调试,或按下快捷键F5,联接成功的界面如下,可单步运行、设置断点等,和IAR开发软件调试类似,使用上去十分便捷。
图2-6gdb调试界面
目标机运行的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