C 语言 gdb 调试入门
更新时间:2026-08-26。本文是
languages/c/主题高手层文档。
本文要回答的问题
- gdb 怎么启动?
-g为什么是前提? - 断点、单步、看变量,常用命令有哪些?
- 程序崩了,怎么用 core 文件还原现场?
一、准备与启动
调试的前提是带符号编译:gcc -O0 -g(本站默认,理由见 编译优化行为)。
bash
gdb ./prog # 启动
gdb ./prog core # 分析 core 文件
(gdb) run # 运行
(gdb) break main # 在 main 打断点二、核心命令速查
| 操作 | 命令 |
|---|---|
| 打断点 | break 文件名:行号 / break 函数名 |
| 运行/继续 | run / continue |
| 单步进入/跳过 | step(进函数)/ next(不进入) |
| 查看变量 | print 变量名 |
| 查看栈 | backtrace(或 bt) |
| 看内存 | x/16xb 地址(16 字节十六进制) |
| 条件断点 | break f if x > 10 |
三、崩溃现场还原
- 段错误先看
bt:调用栈最上层就是崩溃点。 - 变量被改:
watch变量,看哪一行动了它。 - core 分析:
gdb ./prog core,即使没有-g也能看栈与寄存器(有-g才能看到行号)。完整手法见 core dump 排查 与 gdb 使用指南。
实测:断点 + 查看变量
调试 add(3, 4),断点停在函数入口:
text
$ gdb ./app
(gdb) break add ← 断点
(gdb) run
Breakpoint 1, add (a=3, b=4) at libtest.c:2
(gdb) print a ← 查看参数
$1 = 3
(gdb) next ← 单步
(gdb) backtrace ← 调用栈
#0 add (a=3, b=4) at libtest.c:2
#1 0x... in main () at libmain.c:6核心命令链:break(断点)→ run(跑)→ print(看变量)→ next(单步)→ backtrace(看调用栈),五步定位绝大多数问题。
四、与入门层的衔接
- 断言与防御式编程,见 断言与预定义宏。
- 崩溃信号与 core dump 机制,见 段错误与 core dump。
- 内存类错误用 ASan/Valgrind 更省事,见 ASan 内存检测。
一句话总结
gdb 是 C 的"慢动作回放机":-O0 -g 保现场、break/step/print 看流程、崩了先 bt 再 core——调试三件套:断点、单步、栈回溯。
本文已完成填充:示例代码与实测数据已补齐。