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. Spring-2-J Goblin Wars(SPOJ AMR11J)解题报告及测试数据

    Goblin Wars Time Limit:432MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Th ...

  2. 为什么Erlang比C慢那么多倍?

    Erlang 一直以慢“著称”,本文就来看看 Erlang 慢在什么地方,为什么比实现同样功能的 C 语言程序慢那么多倍.Erlang 作为一种虚拟机解释的语言,慢是当然的.不过本文从细节上分析为什么 ...

  3. Dell PowerVault TL4000 磁带机卡带问题

    最近一段时间Dell PowerVault TL4000 磁带机故障频繁,昨天我在管理系统里面看到Library Status告警:HE: sled blocked, error during sle ...

  4. zobrist hashing

    Zobrist 哈希是一种专门针对棋类游戏而提出来的编码方式,以其发明者 Albert L.Zobrist 的名字命名.Zobrist 哈希通过一种特殊的置换表,也就是对棋盘上每一位置的各个可能状态赋 ...

  5. JS 日期对象在浏览器间的若干差异

    JS中 ,通过 new Date() 可以获取当前时间 也可以通过 new Date("2013/12/12 8:00:00")的方式,创建某个指定时间对象 在Chrome和FF下 ...

  6. OSX下VirtualBox安装CentOS

    1.OSX上下载安装VirtualBox 2.新建虚拟机(所有选项默认即可) 3.启动虚拟机,选择CentOS安装镜像 CentOS-6.7-x86_64-minimal.iso 此处下载的是最小镜像 ...

  7. PHP笔记(PHP高级篇)

    高级篇中将涉及数据库的使用以及Cookie和Session会话,提高PHP的开发效率和运行效率 PHP程序员需要掌握的MySQL操作 为项目设计表 使用SQL语句 MySQL的目录结构 data目录中 ...

  8. Java API 快速速查宝典

    Java API 快速速查宝典 作者:明日科技,陈丹丹,李银龙,王国辉 著 出版社:人民邮电出版社 出版时间:2012年5月 Java编程的最基本要素是方法.属性和事件,掌握这些要素,就掌握了解决实际 ...

  9. C语言杂谈(一)scanf()、scanf_s()与错误 C4996

    错误 C4996 初学C语言时,第一个接触到的I/O函数便是scanf()了.但在高版本的 Visual Studio (包括但不限于2015.2013.2012)编译代码时,却会出现意想不到的错误. ...

  10. C#连接MySql数据库的方法

    1.要连接MySql数据库必须首先下载MySql的连接.net的文件, 文件下载地址为http://download.csdn.net/detail/xiaoliu123586/91455792.解压 ...