在使用gdb调试可执行文件时,我们可以使用两个命令来单步执行:
stepi
nexti
这两者之间的区别是什么?为什么有人会选择其中一个?using help in gdb说道:stepi:一步一个指令。nexti:执行一条指令,但继续执行子例程调用。由于我们在这里处理的是指令和机器码(执行中的程序的最小部分),我无法弄清楚子例程调用是什么。
wztqucjr1#
stepi比nexti更详细。如果你从main()函数调用sum(),那么执行stepi会到达sum()函数内部,但nexti不会。下面是当您在**call sum()**指令(即=> 0x08048403 <+40>: call 0x8048419 <sum>)时调用stepi时的屏幕截图。stepi示例将您路由到sum()内部。
main()
sum()
=> 0x08048403 <+40>: call 0x8048419 <sum>
的数据如果你在**调用sum()**指令时执行nexti(即=> 0x08048403 <+40>: call 0x8048419 <sum>),那么它将使用sum方法的返回值并转到main方法的下一条指令,屏幕截图如下。
的
结论:如果你想查看在你的处理器中执行的所有机器指令,使用stepi。如果你想只查看在main()上执行的机器指令,使用nexti。
von4xj4u2#
区别在于call的处理方式:
call
因此,这里有一个语义规则来更好地记住它:如果你需要 * 走过去 *,你就应该 * 走过去 。另一个可能是“ 走进去 *",因此“下一步”无论如何都没有意义。;)
2条答案
按热度按时间wztqucjr1#
stepi
比nexti
更详细。如果你从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
。von4xj4u2#
区别在于
call
的处理方式:stepi
潜入call
nexti
运行call
,但不会引导您遍历其代码因此,这里有一个语义规则来更好地记住它:如果你需要 * 走过去 *,你就应该 * 走过去 。另一个可能是“ 走进去 *",因此“下一步”无论如何都没有意义。;)