next命令跳过函数调用而非物理下一行,执行完被调函数再停;适用于已知正确函数,遇bug需改用step;依赖-g -o0编译和准确调试信息。

next 命令就是让 GDB 执行到「下一行源代码」的标准方式,但它不进函数——这是最常被误解也最容易出错的地方。
为什么 next 有时跳过了整段逻辑?
因为 next 跳过的是「函数调用的全部执行」,不是物理意义上的下一行。比如当前行是 printf("hello");,next 会等 printf 返回后才停在下一行;如果当前行是 do_something();(而 do_something 是你自己写的函数),next 也会直接执行完它,不会停在该函数第一行。
- 它只适用于你想「略过已知正确函数」的场景
- 若函数内有 bug,用
next就会错过,此时该换step - 遇到内联函数或编译器优化(如 -O2),
next可能行为异常——务必用-g -O0编译
next 和 step 到底怎么选?
看你想调试的粒度:
- 当前行是函数调用,且你**不关心内部实现** → 用
next - 当前行是函数调用,且你**需要逐行看它怎么跑** → 用
step - 当前行是普通赋值/条件语句(无调用)→
next和step效果一样 - 想快速跳出当前函数?别用
next,改用finish
容易被忽略的细节:断点位置影响 next 行为
next 的“下一行”取决于当前 PC 指向的源码行,而这个映射依赖调试信息是否准确:
- 没加
-g编译?next可能乱跳,甚至报Cannot find bounds of current function - 在汇编级断点(比如用
disassemble后手动break *0x401234)上执行next,它会按汇编指令走,不是源码行 - 在循环体里想跳到循环末尾?
next不管用,该用until或设临时断点
真正难的不是记住命令,而是每次敲 n 前,心里得清楚:这一行背后有没有隐藏调用、编译器有没有重排、调试符号还在不在——这些比命令本身更决定你能不能看到“下一行”。











