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调试分析汇总表



20145233 GDB调试汇编分析的更多相关文章

  1. GDB调试汇编分析

    GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...

  2. 20145318 GDB调试汇编堆栈分析

    20145318 GDB调试汇编堆栈分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const sta ...

  3. 20145219 gdb调试汇编堆栈分析

    20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...

  4. gdb调试汇编堆栈分析

    代码(src/05/gdb.c) int g(int x) { return x + 4; } int f(int x) { return g(x); } int main(void) { retur ...

  5. 20145310 GDB调试汇编堆栈分析

    GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...

  6. GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...

  7. 20145212——GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...

  8. gdb调试汇编堆栈过程的学习

    gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...

  9. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

随机推荐

  1. Senna.js – 速度极快的单页应用程序引擎

    Senna.js 是一个速度超快的单页应用程序引擎,提供了几个低级别的 API,可以帮助你打造现代化的基于 Web 的应用程序.更重要的是,搜索引擎蜘蛛应该能够索引相同的内容. 通过使用 HTML5 ...

  2. if语句,case语句

    1.句式:if...then.判断赋值 例: if RadioButton1.Checked then sex:='男' else if RadioButton2.Checked then sex:= ...

  3. inline-block 空白间距问题

    一. 问题 元素是inline-block属性时,会有空白间隙 二. 解决方案 1. html方式 1)将元素之间的空隙去除 <div class="space"> & ...

  4. Javascript中构造函数与new命令

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  5. 3D banner(CSS3+HTML5)

    1.这是一篇 3Dbanner制作的简易流程,支持高版本的chrome和firefox浏览器,俩浏览器显示可能会有些差异 2.没有兼容性代码,因为仅仅只是熟悉流程,希望小伙伴们自己改善哈(>﹏& ...

  6. 1-1 node 基础

    1.什么是nodejs?   简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js ...

  7. 安卓学习----使用okHttp(get方式)---下载图片

    一首先下载Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依赖 compile 'com.squareup.okhttp3:o ...

  8. python-list tuple dict set

    1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...

  9. sql 日期格式汇总

    SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式 SQL Server中文版的默认的日期字段datetime格式 ...

  10. MongoDB学习笔记~Update方法更新集合属性后的怪问题

    回到目录 在对MongoDB进行封装后,对于Update更新对象里的集合属性时出现了一个现象,让人感到很恶心,人家更新前是个美丽的Array,但是更新之后集合对象变成了键值对,键是集合的类型名称,值是 ...