一、GDB介绍
1、什么是GDB
(1)GDB是GNU项目的开源、源代码级命令行调试器,可控制程序的启动、暂停和终止,并在程序暂停时查看内部变量、寄存器、调用栈等运行现场,供开发者定位代码问题。
(2)GDB支持绝大多数主流UNIX、Windows、macOS操作系统;嵌入式开发使用对应架构的交叉版GDB(如ARM Cortex-M系列arm-none-eabi-gdb)。
(3)GDB支持四类调试操作:
①加载/启动目标程序,配置运行参数、环境变量,控制程序执行流程。
②设置代码断点和观察点,满足特定触发条件时自动暂停程序。
③程序主动暂停、断点命中或异常崩溃后,查看寄存器、变量、函数调用栈,还原现场。
④运行时临时修改内存、寄存器变量的值,用于验证问题修复逻辑(修改仅调试期间生效,不改动原始可执行文件或固件)。
(4)GDB支持的编程语言:C/C++、Go、Rust、Fortran、Assembly(汇编语言)等。
2、嵌入式远程调试架构
(1)被调试的目标程序分三类运行场景:
①本地调试:GDB直接控制和调试同一台机器上的进程。
②远程调试:GDB通过串口/TCP连接到远程目标上的GDB Server,调试远程程序。
③嵌入式/模拟器调试:GDB连接到OpenOCD/QEMU等,间接调试裸机固件或模拟器里的系统。
(2)下图所示的是嵌入式远程调试架构。
①Host主机层:
主机层一般是电脑主机;IDE/DDD/GDBGUI是图形调试前端,比如VSCode、CubeIDE、可视化GDB工具;GDB是核心调试客户端,主要用于下发端点、读写内存等调试指令;OpenOCD是GDB远程服务端,适配ST-Link/J-Link等调试器,把GDB指令转为SWD/JTAG硬件时序
②HW probe硬件探针层:
硬件探针层主要是硬件调试转换器,比如ST-Link,USB口连接电脑,SWD/JTAG排线连接单片机,负责电信号转换
③Target目标设备层:
在嵌入式中,被调试的目标是开发板/芯片,图中所示的是两种架构,相应的,有两种完成独立的远程调试链路
右侧链路是Cortex-M单片机主流方案,调试员在PC端图形调试界面操作,界面后端将操作指令转给GDB,GDB通过TCP连接OpenOCD(默认3333端口),向其下发调试命令,然后OpenOCD驱动ST-Link硬件,把指令转换成SWD/JTAG电平时序,通过SWD/JTAG直接与Cortex-M4的调试接口通信,实现读写寄存器、烧 Flash、启停程序
左侧链路是Cortex-A Linux MPU方案,调试员在PC端图形调试界面操作,界面后端将操作指令转给GDB,GDB通过网口TCP远程连接开发板上运行的gdbserver,gdbserver是Linux端轻量代理,接管A7内核上被调试的应用程序