zoukankan      html  css  js  c++  java
  • 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位汇编代码时可能会出现如下错误:

    • 解决如下:

    • 终端输入如下命令:sudo apt-get install libc6-dev-i386,安装一个库

    • 安装成功后再次执行gcc -g gdbdemo.c -o gdbdemo -m32命令就可以顺利进行下一步了

    分析过程

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

    • 使用disassemble指令获取汇编代码(因为之前执行的命令中有-m32,所以此处显示的是32位汇编代码)

    • 使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置

    • main函数汇编代码

    • 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0

    • 用i r指令查看各寄存器的值

    • 依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:

      • 1、使用si指令单步跟踪一条机器指令
      • 2、使用i r指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)
      • 3、使用x/na %esp对应的值指令查看堆栈变化
    • 下面是我多次执行的一部分截图(因为一直再重复上面的步骤,所以我在下面做了记录)

    • 每一步都对应自己的函数调入执行

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

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

    • 先为传参做准备:

    • 将栈中的数据push

    • leave返回准备栈

    • ret结束main函数

    总结反思

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

    gdb调试分析汇总表


  • 相关阅读:
    Atitit.安全性方案规划设计4gm  v1 q928
    Atitit ati licenseService    设计原理
    Atitit.js图表控件总结
    Atitit. null错误的设计 使用Optional来处理null
    System.Web.Mvc 命名空间
    provider: SQL Network Interfaces, error: 26 Error Locating Server/Instance Specified
    Visual Studio 2010 实用功能总结
    My First J2ME
    Java开发利器ideaIU最新版本10.5的keygen
    Happy New Year for 2012
  • 原文地址:https://www.cnblogs.com/hanhaochen/p/6119695.html
Copyright © 2011-2022 走看看