如何用GDB进行单步进入、单步跨步和单步退出?

如何用GDB进行单步进入、单步跨步和单步退出?

我在 GDB 中输入help,但没有找到任何有关单步进入、单步跳出和单步跳出的信息。我在_start( )中的汇编程序中放置了一个断点break _start。然后我打字next就调试完成了。我猜是因为它完成了_start但没有步入如我所愿。

答案1

help running提供了一些提示:

stepnext指令(还有nextistepi)。

(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 stepstepi以及nextand 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完成循环并随后运行到断点。抱歉,如果这对大多数人来说是显而易见的,但对于寻找此问题答案的人来说可能会有所帮助。

相关内容