next跳过函数调用,step进入函数内部;二者均高亮显示下一条待执行源码行,但实际执行位置需结合info registers和disassemble确认。

gdb 中 next 和 step 都会显示下一条要执行的语句,但行为不同
next(缩写 n)和 step(缩写 s)执行后,gdb 默认会在控制台高亮显示「即将执行的下一行源码」——也就是你问的“下一条要执行的语句”。这不是额外命令的结果,而是它们执行过程中的自然反馈。
-
next会跳过函数调用,把整个函数当做一个原子操作执行完,然后停在调用点的下一行 -
step遇到函数调用就会进入函数内部,停在被调函数的第一行可执行语句上 - 两者都要求程序已暂停(比如在断点处),且源码可用(编译时带
-g)
如果没看到高亮行,常见原因有:
- 当前没有加载源码(
l命令报错或只显示空行) - 程序运行到了汇编层(比如优化后的代码、系统库、无调试信息的函数)
- 正在执行的是内联函数或宏展开体,gdb 无法映射回源码行
用 list 主动查看当前上下文
list(缩写 l)不执行任何代码,只展示当前执行点附近的源码,默认显示 10 行,其中箭头 => 指向的就是「下一条将被执行的语句」。
- 直接输
l:从上次list位置继续往后列 -
l 25:从第 25 行开始列 -
l main:列出main函数定义处的源码 -
l在函数内执行时,会自动聚焦到该函数体;在函数外(如库调用中)可能返回 “No symbol table is loaded.”
注意:list 显示的箭头行不一定等于下一步真正执行的行——比如当前在 for 循环末尾,list 显示的是 },但下一步其实是跳回条件判断行。所以它反映的是「当前栈帧中逻辑上的下一条源码行」,不是绝对执行流。
确认执行位置最可靠的方式是结合 info registers 和 disassemble
当源码不可见或行为异常时,仅靠 list 或 next 的提示容易误判。此时应:
- 运行
info registers查看rip(x86_64)或pc(ARM)寄存器值,确认 CPU 下一条取指地址 - 执行
disassemble(或disas)看该地址附近对应的汇编指令 - 若需映射回源码,用
info line *0xADDR反查地址所属源文件与行号
这一步常被跳过,但它是区分「gdb 认为的下一行」和「CPU 实际要取的下一条指令」的关键。尤其在开启编译优化(-O2)、内联、尾调用等场景下,二者偏差可能很大。
为什么有时候按回车就继续执行了,却不显示下一行?
gdb 允许按回车重复上一条命令。如果你刚执行过 next,再按回车,它会再次执行 next,而不是重新显示当前行。此时屏幕可能只刷新一次光标,看起来像“没反应”。
- 解决方法:先输
l刷新源码视图,再决定用n还是s - 另一个干扰项:
set pagination off关闭分页后,list输出可能滚屏太快,误以为没显示——建议保持默认分页,或用Ctrl+x, Ctrl+n在 list 模式下翻页
真正的“下一条要执行的语句”,始终由当前 rip 地址 + 调试符号映射决定,而不是某条命令的视觉反馈。











