gdb调试汇编堆栈分析

代码(src/05/gdb.c)

int g(int x)
{
  return x + 4;
}

int f(int x)
{
  return g(x);
}

int main(void)
{
  return f(8) + 4;
}

gcc编译

使用gcc -g src/05/gdb.c -o gdb -m32命令在64位的机器上产生32位汇编代码

gdb调试可执行文件

  • 使用gdb gdbdemo指令打开gdb调试器

  • 使用break main指令在main函数处设置断点,使用r指令运行代码,可以看到运行时在main函数位置停了下来
    884676-20161130192535302-1980194816.png

  • 使用disassemble指令获取汇编代码
    884676-20161130192610490-2064504299.png

  • 用i r指令查看各寄存器的值
    884676-20161130192635552-1795797958.png

  • 此时主函数的栈基址为0xffffcf68,用x 0xffffcf68指令查看内存地址中的值,目前%esp所指堆栈内容为0,%ebp所指内容也为0
    884676-20161130192925146-1243509744.png

  • 使用display /i $pc指令进行设置,在每次执行下一条汇编语句时,都会显示出当前执行的语句。
    884676-20161130193147646-1795603721.png

  • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
    1、使用si指令单步跟踪一条机器指令
    2、使用i r指令查看各寄存器的值
    3、使用x/na %esp对应的值指令查看堆栈变化

  • %esp、%ebp和堆栈内容变化
    884676-20161130194051021-1730583746.png

  • call指令将下一条指令的地址入栈,此时%esp,%ebp和堆栈的值为:
    884676-20161130194501271-137282638.png

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

  • 为传参做准备:
    884676-20161130194802084-347878646.png

  • 实参入栈:
    884676-20161130195356271-2009054345.png

  • call指令将下一条指令的地址入栈:
    884676-20161130195649912-1693411792.png

  • 分配栈空间
    884676-20161130195658927-567198546.png

  • pushl 0x8(%ebp)将%esp中的8存入栈中
    884676-20161130200008834-558335957.png

  • 将 %eax 与立即数4相加
    884676-20161130200548959-1468838758.png

  • pop %ebp在g结束前弹栈
    884676-20161130200734037-624243253.png

  • ret返回g中call的调用位置,结束g函数
    884676-20161130200920677-48575205.png

  • 将 %esp 与立即数相加
    884676-20161130201249396-1002557892.png

  • leave返回准备栈
    884676-20161130201614068-828839097.png

  • ret返回f中call的调用位置,结束f函数
    884676-20161130201635271-2045606252.png

  • 进入main函数,将 %esp 与立即数相加
    884676-20161130201928459-126894126.png

  • 将 %eax 与立即数4相加
    884676-20161130202057537-2130174385.png

  • leave返回准备栈
    884676-20161130202249506-257719406.png

  • ret结束main函数
    884676-20161130202308677-1302893381.png

  • 分析
    884676-20161201202544193-1959517693.jpg

参考

-GDB调试汇编堆栈过程分析

转载于:https://www.cnblogs.com/20145327gc/p/6119463.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值