20145233 GDB调试汇编分析

GDB调试汇编分析

代码

#include<stdio.h>
short addend1 = 1;
static int addend2 = 2;
const static long addend3 = 3;

static int g(int x)
{
    return x + addend1;
}  

static const int f(int x)
{
    return g(x + addend2);
}

int main(void)
{
    return f(8) + addend3;
}
  • 这次代码因为是参照的卢肖明同学的博客学习的,所以使用的是一个代码。

    GCC编译

  • 使用gcc -g gdbdemo.c -o gdbdemo -m32命令在64位的机器上产生32位汇编代码
  • 在产生32位汇编代码时可能会出现如下错误:
    887941-20161130210341631-1249539406.png

  • 解决如下:
  • 终端输入如下命令:sudo apt-get install libc6-dev-i386,安装一个库
  • 安装成功后再次执行gcc -g gdbdemo.c -o gdbdemo -m32命令就可以顺利进行下一步了

分析过程

  • 使用break main指令在main函数处设置断点(可以使用l指令在屏幕上打印代码),然后,使用r指令运行代码,可以看到运行时在main函数位置停了下来
    887941-20161130210438631-875248942.png

  • 使用disassemble指令获取汇编代码(因为之前执行的命令中有-m32,所以此处显示的是32位汇编代码)
  • 使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置
    887941-20161130210418177-237886307.png

  • main函数汇编代码
    887941-20161130210553881-337106483.png

  • 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0
  • 用i r指令查看各寄存器的值
  • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
    • 1、使用si指令单步跟踪一条机器指令
    • 2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
    • 3、使用x/na %esp对应的值指令查看堆栈变化
  • 下面是我多次执行的一部分截图(因为一直再重复上面的步骤,所以我在下面做了记录)
  • 每一步都对应自己的函数调入执行

    887941-20161130210609662-1789880959.png

    887941-20161130210619209-1293278027.png

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

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

    887941-20161130210638365-451479668.png

    887941-20161130210644709-781417152.png

    887941-20161130210734334-1346841634.png

  • 先为传参做准备:
    887941-20161130210740537-1204341185.png

    887941-20161130210747115-1126885745.png

    887941-20161130210754318-1778558808.png

    887941-20161130210804193-269503989.png

    887941-20161130210812271-1006043051.png

    887941-20161130210818943-893210464.png

  • 将栈中的数据push
    887941-20161130210825959-614180761.png

    887941-20161130210831787-1852684128.png

    887941-20161130210838818-282806353.png

    887941-20161130210844740-18541273.png

    887941-20161130210852302-189551685.png

  • leave返回准备栈
    887941-20161130210230209-1997397340.png

  • ret结束main函数
    887941-20161130210220631-529036610.png

总结反思

  • 这次学习让我对于gdb有了更加深刻地认识,并设置断点来查看运行状态,并且利用gdb一步步来查看结果,使得我对于汇编的堆栈有了更深的理解,不再像以前那样模糊。
  • 从这次学习看出我的学习方法还是不够好,需要老师的督促,这还是需要改进,争取像小明同学那样可以自主学习。

gdb调试分析汇总表

887941-20161130210156912-1961586282.png
887941-20161130210210849-1254194881.png

转载于:https://www.cnblogs.com/hanhaochen/p/6119695.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值