在开发ARM嵌入式端C/C++程序时,一般会在PC上编写代码,在Linux服务器上编译,然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题,在不使用gdb的情况下,经常在代码中添加打印,编译,然后在开发板上再次运行,查看结果。添加打印、编译麻烦费时不谈,想要监视局部变量、断点执行这种方式还不支持。而使用gdb工具时,习惯了使用UI界面的人来说,基本上很难适应。这里将使用VS Code,结合gdb与gdbserver,可视化远程调试arm开发板上的linux C/C++程序。
当然,如果你的应用程序是直接在Linux x86上编译的,且非交叉编译,那么直接在Linux x86上运行即可,无需用gdbserver启动,也无需配置,点击左栏的debug图标即可编译并进入调试模式。
准备工作
交叉编译好的gdbserver与目标程序test。
使用交叉编译工具链编译要调试的程序,需要注意的是去掉编译选项中的"-O2"或"-O1"选项(某些代码被优化了之后,断点无法生效),并加上"-g"选项,在生成的可执行程序中包含调试信息。
开始调试
将编译好的gdbserver与生成的被调试程序test复制到目标主机中,
进入目标主机,运行如下命令。如果程序带有运行参数,直接依次写在test后面。
./gdbserver localhost:6767 test
端口号可以随意指定,后面填写vscode的配置需要用到,记录下目标主机的ip地址,后面填写配置也要用到。
在打开测试程序源代码工程的VS code窗口中,新建一个launch.json配置。如果已经有了launch.json配置,则直接打开,添加gdb调试配置。
在launch.json中修改program字段,填写生成的test文件路径。添加"miDebuggerPath"字段,填写刚刚编译生成的gdb路径。添加"miDebuggerServerAddress"字段,填写目标主机的IP与gdbserver监听的端口号。
![img](https://pic2.zhimg.com/80/v2-a0ec41e73856d7e3bf55dff3771fce49_720w.web
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", //名称
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/xx/test", // 当前目录下编译后的可执行文件
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}", //表示当前目录
"environment": [],
"externalConsole": false, // 在vscode自带的终端中运行,不打开外部终端
"MIMode": "gdb", //用gdb来debug
// "preLaunchTask": "build",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"miDebuggerServerAddress": "10.2.9.108:6767",
"miDebuggerPath": "/xx/aarch64-linux-gnu-gdb"
}
]
}
可以添加preLaunchTask,在启动调试前启动其他前置task,例如完成编译。嵌入式的编译往往是多样的,需要自己定义编译task,vscode的默认编译行为可能无法满足。
在文件中打上断点,监视窗口中添加想要监视的变量值,点击运行按钮,即可开始调试过程。