GDB 调试利器:从入门到精通

Evek Golden Lv4

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 模式。

  1. PC 端:运行 GDB Client (arm-none-eabi-gdb)。
  2. 仿真器端:运行 GDB Server (如 OpenOCD, J-Link GDB Server, ST-Link GDB Server)。

常用流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 启动 GDB
arm-none-eabi-gdb my_firmware.elf

# 2. 在 GDB 内部连接 Server
(gdb) target remote localhost:2331

# 3. 复位并暂停
(gdb) monitor reset halt

# 4. 下载代码
(gdb) load

# 5. 设置断点并运行
(gdb) b main
(gdb) c

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