next跳过函数调用,step进入函数内部;finish跳出当前函数;until跳至指定行;所有命令需程序已暂停。

用 next 和 step 区分“跳过”和“进入”
真正控制单步执行节奏的,就两个命令:next(缩写 n)和 step(缩写 s)。它们的区别不在“快慢”,而在是否钻进函数内部。
遇到函数调用时:
-
next把整行当做一个原子操作——比如printf("x=%d", x);会直接执行完,停在下一行,不看printf内部怎么实现 -
step会进入该函数第一行(前提是源码可用、有调试信息),适合你怀疑问题出在函数逻辑里 - 如果当前行没函数调用,两者行为一致,都走到下一行
注意:step 进入的是你**能看见源码**的函数。标准库函数(如 malloc、strlen)通常没有附带源码,step 会卡在汇编层,这时按 next 更实际。
finish 是快速跳出当前函数的快捷键
你在某个函数里单步进得太深,想立刻回到它的调用点?不用连按 next 或设新断点,finish(缩写 fin)直接运行到当前函数 return 后暂停。
典型场景:
- 进了别人写的 helper 函数,确认它逻辑没问题,只想快点回去看主流程
- 函数里有大循环或递归,手动单步太耗时
- 刚用
step进入,发现走错了,想原路“弹”出来
限制:它只对当前栈帧有效。如果函数里又调了别的函数,finish 不会中途停在那些中间函数里。
until 用来跳过循环或指定位置
想一口气跑到某一行,但又不想设断点再 c?until(缩写 u)就是干这个的。它会执行到指定行号(或当前文件内下一个匹配行),途中自动跨过循环体。
比如你在循环开头,想看循环结束后变量状态:
-
until 25—— 直接跑到第 25 行,不管中间循环跑多少次 -
until单独回车 —— 跑到当前函数下一次出现的同一行(常用于重复执行某段逻辑)
注意:until 只作用于当前文件。如果目标行在别的源文件里,它会报错“Line number X out of range”。此时得用 b 文件名:行号 + c。
别忘了先让程序动起来
所有单步命令的前提是程序已启动并暂停——要么在断点处停住,要么用 start 命令停在 main 入口。
常见疏漏:
- 直接输
n却提示 “The program is not being run.”——说明还没run或start - 输
run后程序一闪而过没停——大概率没设断点,也没触发崩溃;改用start更稳妥 - 用
step进入函数后,list看不到源码——编译时漏了-g,或者函数来自无调试信息的静态库
最简验证流程:gdb ./a.out → start → n → s → fin。只要这四步能串起来,单步执行的骨架就立住了。


















