使用 gdb 跳转到下一个“指令”

Posted

技术标签:

【中文标题】使用 gdb 跳转到下一个“指令”【英文标题】:Jumping to the next "instruction" using gdb 【发布时间】:2011-12-04 04:49:43 【问题描述】:

我正在尝试计算金丝雀值设置和检查机制。

#包括 诠释主要(无效) 返回 printf("嗨!\n");

反汇编时,我得到了

(gdb) disa main 0x080483f4 : lea 0x4(%esp),%ecx 0x080483f8 : 和 $0xfffffff0,%esp 0x080483fb : pushl -0x4(%ecx) 0x080483fe : 推送 %ebp 0x080483ff : 移动 %esp,%ebp 0x08048401 : 推送 %ecx 0x08048402 : 低于 $0x14,%esp 0x08048405 : 移动 %gs:0x14,%eax 0x0804840b : 移动 %eax,-0x8(%ebp) 0x0804840e : xor %eax,%eax 0x08048410 : 移动 $0x8048500,(%esp) 0x08048417 : 调用 0x8048320 0x0804841c : 移动 -0x8(%ebp),%edx 0x0804841f : 异或 %gs:0x14,%edx 0x08048426 : 0x804842d 0x08048428 : 调用 0x8048330 0x0804842d : 添加 $0x14,%esp 0x08048430 : 弹出 %ecx 0x08048431 : 弹出 %ebp 0x08048432 : lea -0x4(%ecx),%esp 0x08048435 : 回复

我在 0x0804840e 处设置了一个断点

b *0x0804840e

程序流在此断点处停止后,我希望gdb 转到下一个指令,而不是下一个c 代码行。我认为我不能为此使用next。那么除了在每条指令处设置断点,我还有什么其他选择呢?

【问题讨论】:

GDB 确实有相当不错的在线帮助 - help 会给你一个主题列表,其中正在运行; help running 列出了“stepi -- 准确的第一步指令”,help stepi 给出了更详细的描述。 【参考方案1】:

你想使用stepi,又名si。它按一条机器指令执行。 (或ni 跳过call 指令。)

查看 GDB 手册中关于继续和步进的部分,其中有 an entry for it。 或者在 GDB 内部,help/help running 会告诉你si 存在,help stepi 会告诉你更多关于它的信息。

【讨论】:

我倾向于使用较短的 sini 别名。

以上是关于使用 gdb 跳转到下一个“指令”的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 上使用 UINavigationController 跳转到下一个控制器

如何在详细视图中跳转到下一行

VIM,增量搜索:如何跳转到下一个结果并使其突出显示?

如何搜索“到下一行所述的无效地址”错误

.nextLine() 直接跳转到下一个输出

jQuery ScrollTop:每个动画都需要在跳转到下一个之前完成