我在 GDB 中输入help
,但没有找到任何有关单步进入、单步跳出和单步跳出的信息。我在_start
( )中的汇编程序中放置了一个断点break _start
。然后我打字next
就调试完成了。我猜是因为它完成了_start
但没有步入如我所愿。
答案1
help running
提供了一些提示:
有step
和next
指令(还有nexti
和stepi
)。
(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.
所以我们可以看到step
步骤进入子程序,但next
会单步执行超过子程序。
and step
(stepi
以及next
and nexti
)通过“行”或“指令”增量来区分。
step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly
相关的是finish
:
(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.
更多有用的信息位于https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html
答案2
使用命令“完成”;这有时与“步出”执行相同的操作。它将完成堆栈正在执行的操作(通常是一个函数),然后转到下一行。查看命令以获取更多信息。
答案3
我来这里是因为我有同样的问题。我最终发现,出于我的目的,任何时候我都可以使用循环的“步出”之类的东西,我可以在循环后设置另一个断点,然后让程序continue
完成循环并随后运行到断点。抱歉,如果这对大多数人来说是显而易见的,但对于寻找此问题答案的人来说可能会有所帮助。