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 调试可执行文件时,我们可以使用两个命令来逐步执行:

stepinexti

这两者之间有什么区别?为什么有人会选择其中一个?

在 gdb 中使用帮助说:

stepi:准确的第一步指令。

nexti:第一步指令,但通过子程序调用继续。

因为我们在这里处理指令和机器代码(正在执行的程序的最小部分),所以我无法弄清楚子程序调用是什么。

【问题讨论】:

如果你在函数调用中,stepi 将进入函数的第一条指令并停止。如果您使用nexti,该函数将被执行,并在调用后的指令处停止。该文档可能有用:sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html。子程序调用是call 指令。 @MichaelPetch 其实是这样,谢谢 只有当call 确实返回时,nexti 才会在 call 之后的下一条指令上停止(如果出现某些错误,或者有意修改/不使用返回地址,@987654330 @ 可能永远不会返回到下一条指令)。 【参考方案1】:

stepinexti 更详细。如果您从 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有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

GDB反向调试(Reverse Debugging)命令 ?

gdb.execute阻止python脚本中的所有线程

Makefile 中的 := 和 = 有啥区别?

CSS 中的 * 和 *|* 有啥区别?

TypeScript 中的“扩展”和“实现”有啥区别

SQL中的Join和UNION有啥区别