gdb中的nexti和stepi有啥区别?
Posted
技术标签:
【中文标题】gdb中的nexti和stepi有啥区别?【英文标题】:What's the difference between nexti and stepi in gdb?gdb中的nexti和stepi有什么区别? 【发布时间】:2018-08-26 08:29:45 【问题描述】:在使用 gdb 调试可执行文件时,我们可以使用两个命令来逐步执行:
stepi
和
nexti
这两者之间有什么区别?为什么有人会选择其中一个?
在 gdb 中使用帮助说:
stepi:准确的第一步指令。
nexti:第一步指令,但通过子程序调用继续。
因为我们在这里处理指令和机器代码(正在执行的程序的最小部分),所以我无法弄清楚子程序调用是什么。
【问题讨论】:
如果你在函数调用中,stepi
将进入函数的第一条指令并停止。如果您使用nexti
,该函数将被执行,并在调用后的指令处停止。该文档可能有用:sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html。子程序调用是call
指令。
@MichaelPetch 其实是这样,谢谢
只有当call
确实返回时,nexti
才会在 call
之后的下一条指令上停止(如果出现某些错误,或者有意修改/不使用返回地址,@987654330 @ 可能永远不会返回到下一条指令)。
【参考方案1】:
stepi
比nexti
更详细。如果您从 main()
函数调用 sum()
,那么在 sum() 函数中执行 stepi
会到达您,但 nexti
不会。
以下是您在调用 sum() 指令(即=> 0x08048403 <+40>: call 0x8048419 <sum>
)时调用stepi
时的屏幕截图。 stepi
指令引导您进入sum()
。
如果你在 调用 sum() 指令时执行nexti
(即=> 0x08048403 <+40>: call 0x8048419 <sum>
),那么它会使用 sum 方法的返回值并转到 main 的下一条指令方法,截图如下。
结论:如果您想查看处理器中发生的每条机器指令,请使用stepi
。如果您只想查看在main()
处执行的机器指令,请使用nexti
。
【讨论】:
【参考方案2】:区别在于call
的处理方式:
stepi
潜入call
nexti
运行 call
但不会引导您完成其代码
因此,为了更好地记住它,这里有一条语义规则:如果你需要走过
,你要一步【讨论】:
以上是关于gdb中的nexti和stepi有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章