引言
之前说了,通过core dump找程序bug,但是有些时候排查问题的还是不够高效,命令行形式gdb还是太简陋了,在IDE debug代码打断点,查堆栈变量那些习以为常的东西,在gdb这里怎么用怎么不习惯,可视化操作不比敲命令行来的香吗?
最近正好研究了下vscode remote ssh + gdbserver 调试。相对来说体验比较像IDE了,基本的单步,直接代码上打断点,条件断点,变量监控,堆栈显示那些已经算凑活了。
环境
我目前的环境主要包括三部分:
- 日常使用的windows
- 从同事那边拷过来的VM Linux虚拟机开发环境,纯做编译。
- 目标嵌入式linux设备
目前基本工作流程是,在windows上通过vscode remote ssh 套件访问虚拟机做代码开发及编译工作,再nfs之类的工具将代码拷到目标嵌入式设备上运行。
工作基本都在windows上,虚拟机开机了就用不管了。
步骤
vscode remote ssh 配置
安装如图插件。
侧边栏会多出一个远程资源管理器。添加你要连接的ssh 地址就好了。
配置文件 里面会加上你添加的地址。
Host 1.1.1.1
HostName 1.1.1.1
User username # 填写登陆远程服务器的用户的名字,这个一行需要手动添加
Linux编译机配置
我这边由于是同事那边考过来的现成环境,所以那些ssh,gdb都已经安装好了,开箱即用。没有的需要自行补上。
设备板端配置
没有gdbserver,先装gdbserver。
通过以下命令,启动gdbserver。
gdbserver localhost:9555 ./your_process_name
端口自己配,程序名字填自己程序的路径名字。
vscode launch设置
上面,板端gdbserver启动了,windows也能连接linux虚拟机,但是虚拟机的gdb还没和gdbserver对应上。这部分的工作也是windows上用vscode launch.json文件来配置。
侧边栏添加配置 。
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "输入程序名称,例如 ${workspaceFolder}/a.out", //改成自己的
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gdb", // 需要自行添加,gdb的路径
"miDebuggerServerAddress": "1.2.3.4:9555", //自行添加 gdbserver 的ip端口
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
需要修改添加的实际上就三个字段
“program”
“miDebuggerPath”
“miDebuggerServerAddress”
调试
vscode 连接 ssh,按F5即可开始调试。
板端可以看到以下提示,说明已经愉快的进行调试了。
Listening on port 9555
Remote debugging from host 1.1.1.1