C语言 gdb中的nexti和stepi有什么区别?

pdsfdshx  于 2024-01-06  发布在  其他
关注(0)|答案(2)|浏览(103)

在使用gdb调试可执行文件时,我们可以使用两个命令来单步执行:

  • stepi
  • nexti

这两者之间的区别是什么?为什么有人会选择其中一个?
using help in gdb说道:
stepi:一步一个指令。
nexti:执行一条指令,但继续执行子例程调用。
由于我们在这里处理的是指令和机器码(执行中的程序的最小部分),我无法弄清楚子例程调用是什么。

wztqucjr

wztqucjr1#

stepinexti更详细。如果你从main()函数调用sum(),那么执行stepi会到达sum()函数内部,但nexti不会。
下面是当您在**call sum()**指令(即=> 0x08048403 <+40>: call 0x8048419 <sum>)时调用stepi时的屏幕截图。stepi示例将您路由到sum()内部。


的数据
如果你在**调用sum()**指令时执行nexti(即=> 0x08048403 <+40>: call 0x8048419 <sum>),那么它将使用sum方法的返回值并转到main方法的下一条指令,屏幕截图如下。


结论:如果你想查看在你的处理器中执行的所有机器指令,使用stepi。如果你想只查看在main()上执行的机器指令,使用nexti

von4xj4u

von4xj4u2#

区别在于call的处理方式:

  • stepi潜入call
  • nexti运行call,但不会引导您遍历其代码

因此,这里有一个语义规则来更好地记住它:如果你需要 * 走过去 *,你就应该 * 走过去 。另一个可能是“ 走进去 *",因此“下一步”无论如何都没有意义。;)

相关问题