GDB 调试利器:从入门到精通
GDB (GNU Debugger) 是嵌入式开发,特别是 Linux 和 RTOS 开发中不可或缺的神器。很多初学者习惯于 IDE 的图形化调试,但掌握 GDB 命令行能让你在没有图形界面的服务器或嵌入式设备上游刃有余。
1. 基础命令速查
target remote <ip>:<port>:连接远程 GDB Server (如 J-Link GDB Server)。file <elf-file>:加载符号表。load:将程序下载到目标板 Flash/RAM。c(continue):继续运行。b(break):设置断点。b main:在 main 函数入口停。b file.c:123:在 file.c 的第 123 行停。
n(next):单步跳过(不进入函数)。s(step):单步进入(进入函数内部)。fin(finish):执行完当前函数返回。
2. 进阶调试技巧
2.1 观察点 (Watchpoint)
当你发现某个全局变量莫名其妙被改了,却找不到是谁改的,观察点就是救星。
watch <var>:当 var 的值发生变化时暂停。rwatch <var>:当 var 被读取时暂停。awatch <var>:当 var 被读或写时暂停。
原理:GDB 会利用 CPU 的硬件调试单元(Hardware Breakpoint Unit)来监控内存地址,不占用 CPU 资源。但硬件断点数量有限(通常 ARM Cortex-M 只有 4 个)。
2.2 查看内存与变量
p <var>(print):打印变量值。p/x var:十六进制显示。p/t var:二进制显示。p *ptr@10:打印数组,从 ptr 开始的 10 个元素。
x(examine):查看内存地址的内容。- 格式:
x/<n/f/u> <addr> x/4xw 0x20000000:以十六进制 (x) 打印 Word (w) 宽度的 4 (4) 个单元,从 0x20000000 开始。
- 格式:
2.3 寄存器查看
在 HardFault 发生时,保存现场非常重要。
info registers(或i r):查看通用寄存器 (R0-R15, PSR)。info all-registers:查看所有寄存器。
3. 嵌入式远程调试 (Remote Debugging)
在嵌入式开发中,我们通常使用 Host-Target 模式。
- PC 端:运行 GDB Client (
arm-none-eabi-gdb)。 - 仿真器端:运行 GDB Server (如 OpenOCD, J-Link GDB Server, ST-Link GDB Server)。
常用流程:
1 | # 1. 启动 GDB |
4. 分析 Coredump
如果程序在现场崩溃了,如果有操作系统的支持(如 Linux),可以产生 Coredump 文件。
1 | gdb my_program core_dump_file |
使用 bt (backtrace) 命令可以查看崩溃时的函数调用栈,快速定位死机位置。
总结
GDB 的功能远不止于此,它还支持 Python 脚本自动化调试。熟练掌握 GDB,能让你的 Debug 效率提升一个数量级。
- Title: GDB 调试利器:从入门到精通
- Author: Evek Golden
- Created at : 2025-01-09 00:10:00
- Updated at : 2026-06-12 08:57:02
- Link: https://blog.cocodemo.uno/posts/gdb4j8w/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments