嵌入式 程序调试之gdb+gdbserver+vscode可视化调试
一、简述
记--使用过visual studio的都知道,它的单步调试真的好用,可以直接在源码下断点,实时查看内存变量、寄存器等相关信息。嵌入式linux开发多用的是gdb, 都是命令行执行的,毕竟嵌入式设备跑的系统都是定制裁剪,不像桌面操作系统那样有UI操作界面,而且嵌入式设备程序还会操作实际硬件,所以想要在PC端模拟仿真可不容易。gdb+gdbserver+vscode使得可视化调试成为可能,
其中调试嵌入式程序:gdb是交叉编译工具链的gdb,如arm-linux-gnueabihf-gdb;gdbserver是跑在嵌入式设备上的,用于启动调试嵌入式程序,但调试指令由远程的gdb来实际发出,配置vscode进行操作gdb,然后gdb操控gdbserver以实现可视化调试。
相关程序打包:外链:https://wwm.lanzouv.com/b0cb5qtla 密码:bnws
二、VSCode安装GDB debug插件
下载地址:https://marketplace.visualstudio.com/items?itemName=DamianKoper.gdb-debug
安装插件:(例子中是在ubuntu16.04安装的)
三、配置vscode
配置被调试程序:"program": "${workspaceFolder}/test1"
配置gdb:"miDebuggerPath": "arm-linux-gnueabihf-gdb",
配置gdbserver的IP端口:"miDebuggerServerAddress": "192.168.20.1:12345" (其中192.168.10.1是嵌入式设备的IP)
launch.json文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gdb-arm",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/test1",
"args":[],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"internalConsoleOptions": "neverOpen",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "arm-linux-gnueabihf-gdb",
"miDebuggerServerAddress": "192.168.20.1:12345",//remote gdb with gdbserver
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text":"-enable-pretty-printing",
"ignoreFailures": false
}
],
//"preLaunchTask": "Compile"
}
]
}
四、启动调试
4.1 启动gdbserver
4.2 启动gdb
下断点
启动调试:
五、工作环境搭建
实际工作环境中有两台电脑, 由于保密关系,linux电脑是实际开发电脑,源码所在,外部USB、串口都被禁用了,且跟windows是两个网段(两个主机都不能上外网),但为了跟windows通信,网络管理部门将这两个IP连通了,也就是这两个IP可以通信。
linux电脑IP是:172.16.18.100
windows电脑是:172.16.20.200
但只有windows能连接嵌入式设备,但是由于是嵌入式linux,只能在linux系统进行调试嵌入式程序。解决办法:让windows跟嵌入式设备进行组网,使其能通信(如windows跟嵌入式设备处于同一个局域网,比如windows和嵌入式设备同连接一个热点),然后windows进行端口转发或进行软路由。
本案例中使用端口转发,案例中嵌入式设备有wifi热点,也就是windows连接上嵌入式设备即可组网。
比如嵌入式设备的热点网关是192.168.20.1, windows连接上之后会处于同一个网段。
在嵌入式linux设备执行ifconfig命令即可查看(或在windwos上执行ipconfig即可找到嵌入式设备的网关)
配置端口转发:将windows(172.16.20.200)的12345端口转发给嵌入式设备(192.168.20.1)的12345端口,可以简单理解为172.16.20.200:12345就是192.168.20.1:12345
配置转发
netsh interface portproxy add v4tov4 listenaddress=172.16.20.200 listenport=12345 connectaddress=192.168.20.1 connectport=12345
查看当前转发的配置
netsh interface portproxy show all
删除转发规则
netsh interface portproxy delete v4tov4 listenaddress=172.16.20.200 listenport=12345