20145302张薇 GDB调试汇编堆栈过程分析

GDB堆栈跟踪与汇编调试

堆栈跟踪

  • 源代码
    884662-20161204214328224-978318914.png

  • 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器:
    884662-20161204214344474-2061430321.png

  • 在main函数处设置一个断点,再run运行
  • 使用disassemble获取汇编代码
  • info registers指令查看各寄存器的值

884662-20161204214358256-1717925295.png

884662-20161204214449787-991530141.png

  • 由上图知此时主函数的栈基址为0xbffff324
  • x 0xbffff324指令查看内存地址中的值
    884662-20161204214501896-1884018262.png

  • 使用display /i $pc:在每次执行下一条汇编语句时,都会显示出当前执行的是哪条语句

884662-20161204214512818-89165669.png

  • 下面展示每一步时%esp、%ebp和堆栈内容的变化:
  • call指令将下一条指令的地址入栈:

884662-20161204214526240-1267234431.png

884662-20161204214537427-978214422.png

  • 将上一个函数的基址入栈,从当前%esp开始作为新基址:
    884662-20161204214548974-1352101659.png

884662-20161204214558568-1046012393.png

  • 先为传参做准备:
    884662-20161204214608818-1698316786.png

  • 实参的计算在%eax中进行:
    884662-20161204214617849-754765582.png

884662-20161204214629240-676427767.png

  • 实参入栈,call指令将下一条指令的地址入栈:
    884662-20161204214640771-252334176.png

884662-20161204214651115-480320302.png

884662-20161204214702006-251656030.png

  • 计算short+int:
    884662-20161204214713974-1256127807.png

884662-20161204214725287-1519336114.png

884662-20161204214737881-2124571501.png

  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:
    884662-20161204214747287-1320860619.png

  • ret指令将栈顶弹给%eip:
    884662-20161204214800006-1285348197.png

  • 函数f修改了%esp,使用leave指令恢复
  • leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:

884662-20161204214813756-1530222263.png

884662-20161204214824037-1777497739.png

884662-20161204214833552-1499029594.png

884662-20161204214842334-510825003.png

884662-20161204214851146-1194478215.png

884662-20161204214901177-227348017.png

884662-20161204214911881-991520870.png

执行过程中%ebp、%esp、堆栈值的变化

指令%esp%ebp堆栈
movl $0x8,(%esp)0xbffff3240xbffff3280x0
call 0x80483c40xbffff3240xbffff3280x8 0x0
push %ebp0xbffff3200xbffff3280x80483ee 0x8 0x0
mov %esp,%ebp0xbffff31c0xbffff3280xbffff328 0x80483ee 0x8 0x0
mov 0x804a014,%eax0xbffff3180xbffff31c0x8048409 0xbffff328 0x80483ee 0x8 0x0
call 0x80483b40xbffff3180xbffff31c0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
push %ebp0xbffff3140xbffff31c0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
mov %esp,%ebp0xbffff3100xbffff31c0xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
Pop %ebp0xbffff3100xbffff3100xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
ret0xbffff3140xbffff31c0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
leave0xbffff3180xbffff31c0x8048409 0xbffff328 0x80483ee 0x8 0x0
ret0xbffff3200xbffff3280xbffff328 0x80483ee 0x8 0x0
mov 0x80484d0,%edx0xbffff3240xbffff3280x8 0x0
add $edx,%eax0xbffff3240xbffff3280x0
ret0xbffff32c0x0

gdb小使用

使用gdb的bt/frame/up/down指令动态查看调用栈帧的情况
884662-20161204214934349-1514422144.png

884662-20161204214945037-1632667803.png

转载于:https://www.cnblogs.com/5302v/p/6132055.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值