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 example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器

注:这里在我第一次做的时候出现使用-m32指令报错的现象,使用sudo apt-get install libc6-dev-i386命令安装所需库即可。

分析代码过程

首先进入gbd之后先在main函数处设置一个断点,再run一下,可以看到运行时在main函数位置停了下来

使用disassemble指令获取汇编代码

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

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

1、使用si指令单步跟踪一条机器指令

2、使用i r(info registers)指令查看各寄存器的值(在这里要看%eip、%eax、%esp和%ebp)

3、使用x/na %esp对应的值指令查看堆栈变化

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

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

先为传参做准备:

将栈中的数据push

leave返回准备栈

ret结束main函数

问题总结

在一开始忽略了一个步骤:使用display /i $pc(结合display命令和寄存器/pc内部变量)指令进行设置,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。

由于没有设置这个步骤,每一次都要手工输入x/I $pc,非常麻烦,好在后来改正了。

这次的小实验让我对gdb有了深刻的理解,结合小明同学的博客,学习了gdb调试程序,设置断点等方法。其实感觉gdb在很多方面比图形调试界面还要好用,这可能就是命令行的魅力吧。

这三周被学校结核体检折磨的够呛,总是要去医院,还要被隔离,耽误了很多很多课。如果下周二体检通过没事情了的话,课程方面落下了好多,还要很努力的去追赶吧。

GDB调试分析汇总表

指令 %eip %ebp %esp %eax 堆栈
push $0x13 0x80483f9 0xffffd058 0xffffd058 0xf7fbadbc 0x00000000
call 0x80483e6 0x80483fb 0xffffd058 0xffffd054 0xf7fbadbc 0x13 0x0
push %ebp 0x80483e6 0xffffd058 0xffffd050 0xf7fbadbc 0x8048400 0x13 0x0
mov %esp,%ebp 0x80483e7 0xffffd058 0xffffd04c 0xf7fbadbc 0xffffd058 0x8048400 0x13 0x0
pushl 0x8(%ebp) 0x80483e9 0xffffd04c 0xffffd04c 0xf7fbadbc 0xffffd058 0x8048400 0x13 0x0
call 0x80483db 0x80483ec 0xffffd04c 0xffffd048 0xf7fbadbc 0x13 0xffffd058 0x8048400 0x13 0x0
push %ebp 0x80483db 0xffffd04c 0xffffd044 0xf7fbadbc 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
mov %esp,%ebp 0x80483dc 0xffffd04c 0xffffd040 0xf7fbadbc 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
mov 0x8(%ebp),%eax 0x80483de 0xffffd040 0xffffd040 0xf7fbadbc 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
add $0x13,%eax 0x80483e1 0xffffd040 0xffffd040 0x13 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
pop %ebp 0x80483e4 0xffffd040 0xffffd040 0x26 0xffffd04c 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0
ret 0x80483e5 0xffffd04c 0xffffd044 0x26 0x80483f1 0x13 0xffffd058 0x8048400 0x13 0x0

20145310 GDB调试汇编堆栈分析的更多相关文章

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

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

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

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

  3. gdb调试汇编堆栈分析

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

  4. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 微信开发 获取用户openId 与路由控制

    w实践,满足当前需求. www.w.com www.w.com/w1.php $wxurl='https://open.weixin.qq.com/connect/oauth2/authorize?a ...

  2. Poloniex API 文档

    Examples PHP wrapper by compcentral: http://pastebin.com/iuezwGRZ Python wrapper by oipminer: http:/ ...

  3. 剑指Offer——和为S的连续正数序列

    题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久, ...

  4. Linux(5)- MariaDB、mysql主从复制、初识redis

    一.MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...

  5. Python之OS模块函数

    函数列表: 1 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os. ...

  6. 18.解决合并androidmanfest错误

    这个是minsdk和tartgetsdk的版本不一致的问题

  7. 怎么解决tomcat占用8080端口问题图文教程

     怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) required ...

  8. MySQL整理(三)

     一.简单单表操作   (1)简单CRUD 插入查询结果 insert into table1(id,name,age) select id,name,age from table2 where id ...

  9. linux rm指定的文件

    如何删除一个目录下的除了想要的文件之外的所有文件 rm `ls | grep -v "aa"` Linux下 报错“命令参数列表过长”,在用mv命令一次移动3万多个文件时失败了,原 ...

  10. docker——三大核心概念

    镜像.容器.仓库是docker的三大核心概念. docker镜像类似于虚拟机镜像,你可以将其理解为一个只读模板. docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.容器是从 ...