next命令执行当前行并跳过函数调用(不进入内部),但因无调试信息、函数内联、多线程并发等原因可能看似失效;其与step区别在于是否进入函数,可控策略是合理设断点、禁用无关断点、用finish跳出、锁定线程调度。

next 命令就是干这个的——它执行当前行,如果该行调用了函数,就直接运行完那个函数,停在下一行,不进入函数内部。
为什么 next 有时看起来没跳过函数?
常见错误现象:明明用了 next,却还是进了 printf 或 std::thread 构造函数。
- 源码未带调试信息:编译时没加
-g,GDB 看不到行号,next会退化为按汇编指令步进,行为不可预测 - 函数内联了:编译器把函数展开了,
next实际上是在执行展开后的多行代码,看起来像“没跳过” - 多线程场景下误判:
std::thread t{business_1}是一行源码,next执行完这行,新线程已启动并并发运行——这不是next失效,而是线程本身已脱离控制流
next 和 step 的关键区别在哪?
二者都单步,但触发条件不同:
-
next:按源码“行”推进,遇到函数调用整段跳过(前提是能识别函数边界) -
step:也按行,但遇到函数调用就钻进去,哪怕是个空函数或库函数 - 若当前行没有函数调用,
next和step行为一致 - 若函数被优化掉(如
inline或-O2),next可能跨过逻辑上的“调用”,但不会跨过实际执行的指令
跳过某个特定函数(比如 business_1)的实用策略
别指望 next 能绕开你不想看的业务函数——它只管“是否调用”,不管“你想不想进”。真正可控的是断点和线程调度:
- 不给
business_1设断点;只在你关心的共享点(如mutex.lock()、counter.add())设断点 - 如果已设了断点,调试中用
disable <em>num</em>临时禁用(info breakpoints查编号) - 万一卡在
business_1开头,直接敲finish跳出整个函数 - 对多线程,用
set scheduler-locking on冻住其他线程,再next就只影响当前线程,避免干扰
最常被忽略的一点:所谓“跳过函数”,在多线程里根本不存在——std::thread 构造完成那一刻,那个函数就在另一个线程里跑了,你只能控制自己看不看、停不停、切不切换上下文。编译加 -g -O0,断点只打在临界区,比纠结 next 有效得多。











