GDB调试汇编堆栈
GDB调试汇编堆栈
分析过程
- C语言源代码
int g(int x)
{
return x+6;
}
int f(int x)
{
return g(x+1);
}
int main(void)
{
return f(5)+1;
}
使用
gcc -g exp1.c -o exp1 -m32指令在64位机器上产生32位汇编。

进入gdb调试器。

在main函数处设置一个断点。

使用run指令开始运行程序,返回main函数运行的结果。

使用
disassemble指令获取汇编代码。

使用
info registers命令查看各寄存器的值。

由上图可以看出,帧指针%ebp在0xbffff2e8,栈指针%esp在0xbffff2e4。
用
x+地址来查看%esp和%ebp的值,此时都为0。

display,设置程序中断后欲显示的数据及其格式。例如,如果希望每次程序中断后可以看到即将被执行的下一条汇编指令,可以使用命令
display /i $pc
将5压入栈中,传递参数


- call指令将返回地址压入栈中。


f函数汇编代码。

将栈指针的值压入栈中。

帧指针指向栈指针所在位置,以此为基址。

在%eax中计算

将g函数返回值放入%esp所指地址中

将6压入栈中,传递参数

调用g函数,调用call指令将f函数的返回地址压入栈中


g函数汇编代码

将栈指针的值压入栈中。

在%eax中计算

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


- ret将栈顶给%eip


- leave使栈做好返回的准备,等价于
movl %ebp,%esp //将%ebp的值给%esp
popl %ebp //将栈顶弹到%ebp中
ret指令,返回主函数

主函数汇编代码

执行leave后,各寄存器值

| 序号 | 指令 | %eip | %ebp | %esp | %eax | 栈顶->栈底 |
|---|---|---|---|---|---|---|
| 001 | movl $0x5,(%esp) | 0x80483e2 | 0xbffff2e8 | 0xbffff2e4 | 0x1 | 0x5 0x0 |
| 002 | call 0x80483bf | 0x80483bf | 0xbffff2e8 | 0xbffff2e0 | 0x1 | 0x80483e7 0x5 0x0 |
| 003 | push %ebp | 0x80483c0 | 0xbffff2e8 | 0xbffff2dc | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 004 | mov %esp,%ebp | 0x80483c2 | 0xbffff2dc | 0xbffff2dc | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 005 | sub $0x4,%esp | 0x80483c5 | 0xbffff2dc | 0xbffff2d8 | 0x1 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 006 | mov 0x8(%ebp),%eax | 0x80483c8 | 0xbffff2dc | 0xbffff2d8 | 0x5 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 007 | add $0x1,%eax | 0x80483cb | 0xbffff2dc | 0xbffff2d8 | 0x6 | 0xbffff2e8 0x80483e7 0x5 0x0 |
| 008 | mov %eax,(%esp) | 0x80483ce | 0xbffff2dc | 0xbffff2d8 | 0x6 | 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 009 | Call 0x80483b4 | 0x80483b4 | 0xbffff2dc | 0xbffff2d4 | 0x6 | 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 010 | push %ebp | 0x80483b5 | 0xbffff2dc | 0xbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 011 | Mov %esp,%ebp | 0x80483b7 | 0xbffff2d0 | Oxbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 012 | mov 0x8(%ebp),%eax | 0x80483ba | 0xbffff2d0 | 0xbffff2d0 | 0x6 | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 013 | add $0x6,%eax | 0x80483bd | 0xbffff2d0 | 0xbffff2d0 | 0xc | 0xbffff2dc 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 014 | Pop %ebp | 0x80483be | 0xbffff2dc | 0xbffff2d4 | 0xc | 0x80483d3 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 015 | Ret | 0x80483d3 | 0xbffff2dc | 0xbffff2d8 | 0xc | 0x6 0xbffff2e8 0x80483e7 0x5 0x0 |
| 016 | leave | 0x80483d4 | 0xbffff2e8 | 0xbffff2e0 | 0xc | 0x80483e7 0x5 0x0 |
| 017 | Ret | 0x80483e7 | 0xbffff2e8 | 0xbffff2e4 | 0xc | 0x5 0x0 |
| 018 | add $0x1,%eax | 0x80483ea | 0xbffff2e8 | 0xbffff2e4 | 0xd | 0x5 0x0 |
| 019 | leave | 0x80483eb | 0x0 | 0xbffff2ec | 0xd | 0x0 |
| 020 | ret | 0xb7e3a533 | 0x0 | 0xbffff2f0 | 0xd |
GDB调试汇编堆栈的更多相关文章
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...
- 赵文豪 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调 ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145208 GDB调试汇编堆栈过程分析
20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- 20145218 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 虚拟机中分析过程 输入gcc - g example.c -o example -m32指令在64位机器上产生32位汇编,但出现以下错误: 这时需要使用sudo apt-g ...
- 20145236 GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 首先需要输入sudo apt-get install libc6-dev-i386安装一个库才能产生汇编代码,然后输入gcc - g example.c -o exampl ...
随机推荐
- Geoserver+Tomcat+GeoWebCache搭建地图服务
依赖TomcatGeoserverGeoWebCache环境部署JDKTomcat服务器Geoserver配置GeoWebCache配置环境启动使用使用geowebcache进行切片 依赖 Tomca ...
- web.xml添加编码过滤器
解决前后台交互汉字乱码 在项目中的web.xml中添加如下代码: <filter> <filter-name>CharacterEncodingFilter</filte ...
- ArrayList和HashSet的Contains()方法(转)
来源: ArrayList和HashSet的Contains()方法 笔试题: package com.champion.test.exam; import java.util.ArrayList; ...
- Ajax深入解析
AJAX:Asynchronous JavaScript And Xml(异步的JS和XML) 同步:客户端发起请求>服务端的处理和响应>客户端重新载入页面(循环) 异步:客户端实时请求& ...
- UEFI模式下Win10和Linux双系统
一.准备 用Win自带的磁盘管理或者进PE分出一块空间来. 你必须要有一个U盘,然后使用软碟通或者ImageWriter把iso系统镜像文件烧录进去,这是比较传统的方法,但既然我们UEFI启动,那就根 ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- 本周psp个人作业
计划--用一天的时间来做这个项目 需求分析--作为一个观众,我想要知道每局的比分,以便我更了解比赛情况. 生成设计文档--用类图来进行说明. 设计复审---无 代码规范--3H 具体设计--建立数据库 ...
- 更改WAS Profiles的概要文件的server1的SDK版本
WebSphere只能使用IBM JDK 哦,不能使用sun的JDK哦.不过如果只是改jdk的版本的话可以参考如下步骤:(以集群为例,假设具有管理节点Dmgr01,应用概要AppSrv01) 1. 确 ...
- Delphi XE 10 DataSnap TCP 与 HTTP 比较
在网络程序开发过程中,面临TCP HTTP 的选择上往往让人陷入犹豫不决中,http的灵活和较强的穿透能力是TCP无法与之相提并论的,然而在响应速度和处理能力上却能看出后者比前者足够强大的地方.因此 ...
- 如何下架app
因赶数日工期成,偷得浮生半日闲.遂登录iTunes Connect,发现之前做过的小程序,想将其下架,故而有此篇随想.(温馨提示:项目被下架后再次上架该版本,不需要再次经过审核)下面是详情步骤: 1. ...