GDB堆栈跟踪与汇编调试

堆栈跟踪

  • 源代码

  • 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器:

  • 在main函数处设置一个断点,再run运行
  • 使用disassemble获取汇编代码
  • 用info registers指令查看各寄存器的值

  • 由上图知此时主函数的栈基址为0xbffff324
  • 用x 0xbffff324指令查看内存地址中的值

  • 使用display /i $pc:在每次执行下一条汇编语句时,都会显示出当前执行的是哪条语句

  • 下面展示每一步时%esp、%ebp和堆栈内容的变化:
  • call指令将下一条指令的地址入栈:

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

  • 先为传参做准备:

  • 实参的计算在%eax中进行:

  • 实参入栈,call指令将下一条指令的地址入栈:

  • 计算short+int:

  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

  • ret指令将栈顶弹给%eip:

  • 函数f修改了%esp,使用leave指令恢复
  • leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:

执行过程中%ebp、%esp、堆栈值的变化

指令 %esp %ebp 堆栈
movl $0x8,(%esp) 0xbffff324 0xbffff328 0x0
call 0x80483c4 0xbffff324 0xbffff328 0x8 0x0
push %ebp 0xbffff320 0xbffff328 0x80483ee 0x8 0x0
mov %esp,%ebp 0xbffff31c 0xbffff328 0xbffff328 0x80483ee 0x8 0x0
mov 0x804a014,%eax 0xbffff318 0xbffff31c 0x8048409 0xbffff328 0x80483ee 0x8 0x0
call 0x80483b4 0xbffff318 0xbffff31c 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
push %ebp 0xbffff314 0xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
mov %esp,%ebp 0xbffff310 0xbffff31c 0xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
Pop %ebp 0xbffff310 0xbffff310 0xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
ret 0xbffff314 0xbffff31c 0x80483da 0xa 0x8048409 0xbffff328 0x80483ee 0x8 0x0
leave 0xbffff318 0xbffff31c 0x8048409 0xbffff328 0x80483ee 0x8 0x0
ret 0xbffff320 0xbffff328 0xbffff328 0x80483ee 0x8 0x0
mov 0x80484d0,%edx 0xbffff324 0xbffff328 0x8 0x0
add $edx,%eax 0xbffff324 0xbffff328 0x0
ret 0xbffff32c 0x0

gdb小使用

使用gdb的bt/frame/up/down指令动态查看调用栈帧的情况

20145302张薇 GDB调试汇编堆栈过程分析的更多相关文章

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

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

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

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

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

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

  4. 赵文豪 GDB调试汇编堆栈过程分析

    GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...

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

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

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

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

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

    GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...

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

    GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...

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

    20145312 GDB调试汇编堆栈过程分析 参考资料 卢肖明同学的博客:<GDB调试汇编堆栈过程分析>: http://www.cnblogs.com/lxm20145215----/p ...

随机推荐

  1. docker入门(1) Centos 7 下docker的安装

    centos 7安装docker 什么是 Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go ...

  2. SAM4E单片机之旅——17、通过UART进行标准IO

    交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...

  3. Linux Shell 06 数学运算

    1.let let "var+=1" let v2= echo $var,$v2 #2,4 a.只支持整数运算 b.基本支持所有运算符(包括++,——,**) c.表达式中使用变量 ...

  4. cocos2d-x之Vector与map

    bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...

  5. Centos Ping不通外网

    安装完成Vm,Centos6.5,设置了网络: 1.VM虚拟网络,采用桥接模式. 2.Centos里各种 设置ifcfg-eth0中的GETWAY,ADDIP等等 vim /etc/sysconfig ...

  6. 续Gulp使用入门三步压缩CSS

    gulp 压缩css 一.安装 gulp-minify-css 模块 提示:你需要使用命令行的 cd 切换到对应目录后进行安装操作. 在命令行输入 npm install gulp-minify-cs ...

  7. JavaScript中点号“.”的多义性

    点号「.」在JavaScript中有两种语义 语义1.表示算术中的小数点(浮点数),如 2.5 语义2.取对象属性.方法,如 [].push(2) 这几乎没有任何难理解的地方,但下面这个问题则很有趣. ...

  8. Astyle编程语言格式化工具的中文说明

    Artistic Style 1.23Maintained by: Jim PatteeOriginal Author: Tal Davidson Usage  :  astyle [options] ...

  9. apache性能测试工具ab使用详解

    下面我们对这些参数,进行相关说明.如下:-n在测试会话中所执行的请求个数.默认时,仅执行一个请求.-c一次产生的请求个数.默认是一次一个.-t测试所进行的最大秒数.其内部隐含值是-n 50000,它可 ...

  10. JVM 类加载过程

    类从加载到虚拟机到卸载,它的整个生命周期包括:加载(Loading),验证(Validation),准备(Preparation),解析(Resolution),初始化(Initialization) ...