gdb 单步调试就是让程序一行一行地跑,走到哪儿、变量变成什么样,当场就能看见,专门用来查逻辑跑偏、死循环、变量莫名被改这类问题。前提是编译时带上 -g,并且关掉优化,再用 gdb 载入程序、下好断点,然后交替使用 next 和 step,一行行往下走。
最短流程:加 -g -O0 重新编译 → gdb 载入 → b main 下断点 → run 跑起来 → n 逐行前进、s 进入函数、p 查看变量。
// demo.c:一个能看清调用过程的极简程序
#include <stdio.h>
int add(int a, int b) { return a + b; }
int main(void) {
int x = 3, y = 4;
int s = add(x, y); // 单步走到这里可以进函数看参数
printf("%d\n", s);
return 0;
}
gcc -g -O0 demo.c -o demo # 保留调试信息,关闭优化
gdb ./demo
(gdb) b main # 在 main 处下断点
(gdb) run # 运行到断点停下
(gdb) n # 逐行执行,不进入函数
(gdb) s # 遇到 add 调用时钻进函数内部
(gdb) p a # 打印当前变量 a 的值
(gdb) bt # 看当前调用栈,确认走的是哪条路
(gdb) q # 退出
踩坑一:编译没加 -g,或者开了优化,单步会乱跳行,变量还可能提示找不到或已被优化掉,先老老实实重编一次再调试。踩坑二:n 和 s 混着用,s 一头钻进库函数出不来,进错了直接敲 finish 把当前函数跑完再返回。