0. 背景
海思sdk编译出文件系统中的gdb不支持回删,非常难用。想用一个比较靠谱且方便的调试方式,找了一些资料,发现vscode
+ gdbserver
是不错的选择。使用这种方式,可以暂停程序运行,直接在代码上打断点,直观的看到当前的堆栈信息,查看每个变量的当前值和内存地址等等,目前所支持的功能还未发掘完毕,应该还有其他妙用。。。
1. 准备gdbserver
-
先找一下当前宿主主机的交叉编译(++目前项目使用的交叉编译器是
aarch64-himix100-linux-g++
++)环境中是否自带gdbserver,如果没有就需要自己 去交叉编译。可喜的是,当前交叉编译环境是存在gdbserver的,目录为
/opt/hisi-linux/x86-arm/aarch64-himix100-linux/host_bin/gdbserver
,这个文件可以直接拷贝到板子中使用,不过这个文件稍微有点大。可以先调用aarch64-himix100-linux-strip gdbserver
瘦瘦身,这个不强求。 -
但是如果没有现成gdbserver的话,必须得自己编译一个了。
- 下载gdb源码
$$ 下载链接
因为gdb源码中的几个函数和交叉编译环境中的几个头文件定义有冲突,所以需要修改源码,建议用我改好的。
- 配置并编译
cd gdb/gdbserver/; ./configure --host=aarch64-himix100-linux --prefix=/your dircetory/
(建议选择个人用户目录,不要污染系统)
修改Makefile配置,编译选项加上 -static,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传img-TNtvqi3O-1570688443866
https://i.imgur.com/2O5aUhQ.png
$$make && make install
- 下载gdb源码
2. 准备vscode
下载vscode,并安装
离线安装插件如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhZdcCRr-1570707921852)(https://i.imgur.com/zIJ3ATX.png)]
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtPwu57W-1570707857150)(https://i.imgur.com/zIJ3ATX.png)]
3. 配置vscode和嵌入式设备
-
配置vscode 插件进行远程ssh开发
参考: https://www.jianshu.com/p/0f2fb935a9a1 -
vscode配置launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "process_name",
"type": "cppdbg",
"request": "launch",
"program": "process_name",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++ build active file",
"miDebuggerPath": "/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gdb",
"miDebuggerServerAddress": "192.168.11.124:1234"
}
]
}
主要修改项:
- name: 调试的项目名
- program: 应用程序路径,这个最好放在共享目录,和板子用同一个文件
- cwd: 程序源代码路径,这个千万不要搞错了,要不调试的时候找不到源代码文件
- miDebuggerPath: 交叉编译工具中的gdb
- miDebuggerServerAddress: 远程gdbserver服务,根据自己设备对应修改
4. 运行
- 嵌入式设备端
在共享目录中,gdbserver打开目标文件
# gdbserver :1234 ./process_name
这个端口号和launch.json中的端口号保持一致
- vscode端
通过之前配置好的远程方式登录开发主机,打开项目对应的文件夹。按f5可以开始调试。如果发现报错直接继续调试,不必理会。如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传img-M4uzIMuL-1570688443876
https://i.imgur.com/WCSLTFg.png
可以看到,程序在运行中:
- 可以直接暂停程序运行
- 可以在将代码直接加在断点上
- 可以看到当前函数中的所有变量,内存地址等
- 可以看到当前所在的线程和堆栈信息