记一次linux下的c++ arm程序调试
前言
windows下,我习惯用IDE来开发和调试,比如用vc或者qt,但是现在碰到了需要在linux下开发调试c++的任务,当然用qt也行。不过这次的新任务,是开发一个基于ARM架构的AI识别程序,大家都懂的,不能调试,碰到BUG就很痛苦,因此在完成任务后,特地记录一下这个过程,给自己一个备忘,也给需要的朋友一个参考,有不足之处还请多多指教。
调试环境准备
我选用了vscode作为代码编辑器,因为目的是开发一个后端服务,没有界面;安装了C++开发必备的一些插件,这里首推微软的C/C++ Extension Pack,还有一些其他的,这里就不写了,大家可以网上搜搜好用的,我这里主要是简洁起见;调试器选用的gdb。
好了,基本环境就这些,下面说一下整个结构:
- 在vmware里运行的ubuntu 18.04虚拟机
- 虚拟机安装了从AI盒子厂家下载的docker镜像(此镜像提供了编译AI程序必备的环境,例如交叉编译器以及挂载了瑞芯微的头文件和库文件的目录)
- 源代码(源代码放在docker镜像映射的本地目录下)
- AI盒子
- AI盒子里安装了gdb server
- 虚拟机里安装了gdb-multiarch
开始调试
- 编译DEBUG版程序
注意,一定要编译DEBUG版程序,否则没有调试符号是无法正常调试的。编译好后,将程序发布到AI盒子上 - 配置VSCODE C++调试文件
主要是要配置launch.json
{
// 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}/build/main",
"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 Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"miDebuggerPath": "gdb-multiarch",
"miDebuggerServerAddress": "192.168.20.217:2000",
"sourceFileMap": {
"/opt/Desktop/workspace/yolov5_detect_C_demo": "${workspaceFolder}" // 映射容器内的路径到主机路径
},
}
]
}
重点配置说明
program:指向你的程序
cwd:程序运行路径
MIMode:使用 GDB 的 MI 模式
miDebuggerPath:调试器,可以使用绝对路径(由于是在本机安装的,所以直接用程序名也行)
miDebuggerServerAddress:gdb server 配置
**sourceFileMap**: (重点)源文件映射路径
关于sourceFileMap需要特别说一下,由于我的源码,是在docker的环境下编译的,因此调试信息里带的,是容器内的路径,所以需要映射一下,否则调试的时候,就只能找到主文件,而找不到其他路径下的源代码文件
准备好后,就可以开始调试了,首先启动gdb server(在AI盒子里运行)
gdbserver IP:PORT /your/app/path
解释
IP:PORT:让gdb server 在指定的IP和端口上监听
/your/app/path:指向你的应用程序
然后在VSCODE里启动DEBUG,控制台的输出窗口里会输出一些日志,需要等一会儿,因为一些调试信息是从AI盒子远程加载的,并且还与你的电脑性能有关,等一会儿后,在VSCODE里打上断点,即可开始你的调试了