本文以全志 T113-S3平台为例,适用于大部分支持 adb 的 ARM/Linux 开发板,重点讲述如何用 ADB 转发、VSCode 图形化结合 GDB/gdbserver 进行高效源码级调试,彻底告别慢吞吞的串口调试体验!
目录
准备环境
- 开发板: 已烧写 Tina/OpenWrt/Linux,且能通过 USB 连接 adb
- 主机(推荐 Ubuntu 20.04/22.04/24.04):
-
- 安装好 VSCode
- 安装微软官方 C/C++ 插件(
ms-vscode.cpptools) - 安装
gdb-multiarch(支持多架构调试):
sudo apt update
sudo apt install gdb-multiarch adb
- 编译工具链: arm-none-linux-gnueabihf-gcc 或平台自带交叉工具链
交叉编译带符号的可执行文件
调试体验的关键——务必使用 -O0 -g 编译选项!
arm-none-linux-gnueabihf-gcc -O0 -g main.c -o your_app
-O0:不开优化,源码单步最精确-g:包含调试符号,可被 GDB/VSCode 完全识别
切记不要 strip,也不要只用 bin 文件!
开发板推送和启动 gdbserver(或者编译openwrt时勾选gdbserver)
- 推送 gdbserver 和可执行文件:
adb push gdbserver /data/local/tmp/
adb push your_app /data/local/tmp/
- adb shell 启动 gdbserver(也可通过串口终端启动gdbserver)
adb shell
cd /data/local/tmp
chmod +x gdbserver your_app
./gdbserver :1234 /your_app
-
:1234表示监听开发板本地 1234 端口
主机端 adb 端口转发
在主机执行:
adb forward tcp:1234 tcp:1234
- 意思是:主机
localhost:1234<> 通过 adb 通道 <> 开发板1234端口
VSCode 调试配置(launch.json)
在你的工程下新建 .vscode/launch.json,内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "GDB adb端口调试",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/demo_app/lv_port_linux-release-v8.3/Electrical_Muscle_Stimulation",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"miDebuggerPath": "/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "localhost:1234",
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "启用自动反汇编",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
- 路径需按实际项目调整
调试实战体验
- 先 adb shell 到开发板,
./gdbserver :1234 ./your_app - 主机执行
adb forward tcp:1234 tcp:1234 - VSCode F5 启动调试
- 在源码中打断点,单步、变量、堆栈、内存、调用栈,全功能源码级调试
- 体验和本地 Linux 下无差别
常见问题汇总
1. 端口连接失败?
- 没有执行
adb forward,或者 gdbserver 没启动 - 解决:主机执行
adb forward,开发板用 adb shell 正确启动 gdbserver
2. step/next 直接全速运行?
- 编译没加
-O0 -g或 ELF 不对 - 解决:确认 Makefile/编译命令用
-O0 -g,并用 file 命令检查
3. VSCode 无法识别 cppdbg 类型?
- 没装官方 C/C++ 插件
- 解决:扩展市场安装 “C/C++ (ms-vscode.cpptools)”
4. 主机用串口调试体验太差?
- 强烈推荐用 adb,体验比串口高几个量级
总结和经验
- 用 adb + VSCode + gdbserver 调试 ARM/Linux 嵌入式开发板,是目前调试效率最高的方案之一!
- 避免物理串口带来的卡顿和各种协议兼容问题
- 只需 USB 连 adb,端口转发,配合 VSCode 图形化,源码断点、单步、变量、堆栈、内存都可以轻松完成
- 记得 ELF 必须
-O0 -g,主机和板子的 ELF、gdbserver 版本要对应 - 每次重插开发板/重启主机都要重新执行一次
adb forward tcp:xxxx tcp:xxxx
附录:高效调试小技巧
- 可在 VSCode 里快速切换断点、条件断点、变量监视
- 支持多端口转发,调试多个进程(
adb forward tcp:1235 tcp:1235等) - launch.json 里
"stopAtEntry": true可直接在 main 停住
有任何调试环境配置/VSCode疑难杂症,欢迎评论区交流!
如需脚本自动化全流程、适配特殊板卡,也可私信/留言讨论。