使用 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
会告诉你更多关于它的信息。
【讨论】:
我倾向于使用较短的si
或 ni
别名。以上是关于使用 gdb 跳转到下一个“指令”的主要内容,如果未能解决你的问题,请参考以下文章