先掌握启动(run)、断点(break)、单步(next)、查看(print)四个核心操作,务必用 -g 编译,否则 gdb 无法显示源码和变量;验证用 file 命令,cmake 项目需设 debug 模式。

第一次用 gdb,别急着记所有命令,先掌握 4 个真正能“动起来”的核心操作:启动、断点、单步、查看。其余命令都是在这基础上延伸出来的,硬背反而容易卡壳。
必须先加 -g 编译,否则 gdb 看不见源码和变量
这是新手踩坑最多的地方——gcc main.c -o main 编出来的程序,gdb ./main 能进,但 list 显示空、print x 报错“No symbol”,因为没调试信息。
- 正确编译:用
gcc -g main.c -o main(-g是唯一强制要求) - 验证是否成功:运行
file main,输出里要有with debug_info - 如果项目用 CMake,确保
set(CMAKE_BUILD_TYPE Debug)或加-DCMAKE_BUILD_TYPE=Debug
从 run → break → next → print 这条链开始练
这四个命令构成最简调试闭环:启动程序 → 在关键位置暂停 → 一行行走 → 看变量值。其他命令(比如 step、finish)可以之后再补。
-
run:启动程序;若带参数,用gdb --args ./main arg1 arg2启动后直接run -
break main:在main函数开头打断点,比记行号更稳 -
next(或n):逐行执行,遇到函数不进去,适合快速过逻辑 -
print x(或p x):在断点停住后立刻试,确认变量名拼写和作用域(局部变量在函数外不可见)
list 和 info breakpoints 是你定位和确认的“眼睛”
光会跑命令不行,得知道代码在哪、断点设对没。这两个命令不参与执行,但每次调试前都该下意识敲一遍。
-
list(或l):默认显示当前行附近 10 行源码;list 20显示第 20 行附近;list func_name显示函数体 -
info breakpoints(或i b):确认断点是否生效、状态是否为y(enabled)、地址是否合理;如果显示pending,说明文件名/函数名打错了 - 常见误操作:
break 10却没在源码第 10 行停住——可能是没list确认过当前文件,或编译时没-g
quit 退出前,记得 check 一下是否真退出了
quit(或 q)看着简单,但实际中常有人以为退出了,结果还在 (gdb) 提示符下,一按回车又 run 一次,导致重复触发 bug 或污染状态。
- 退出时看终端是否回到 shell 提示符(如
$或#),而不是(gdb) - 如果卡在
(gdb)且不想继续调试,quit后若提示 “Quit anyway? (y or n)”,一定要输y确认 - 临时想中断正在运行的程序?按
Ctrl+C,它会把控制权交回(gdb),此时再quit
真正难的不是命令本身,而是每次 run 前没检查 info breakpoints,每次 print 前没 list 确认上下文——这些动作不费时间,但跳过它们,调试就变成碰运气。











