gdb调试汇编堆栈分析
代码(src/05/gdb.c)
int g(int x)
{
return x + 4;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 4;
}
gcc编译
使用gcc -g src/05/gdb.c -o gdb -m32命令在64位的机器上产生32位汇编代码
gdb调试可执行文件
使用gdb gdbdemo指令打开gdb调试器
使用break main指令在main函数处设置断点,使用r指令运行代码,可以看到运行时在main函数位置停了下来

使用disassemble指令获取汇编代码

用i r指令查看各寄存器的值

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

使用display /i $pc指令进行设置,在每次执行下一条汇编语句时,都会显示出当前执行的语句。

依次如下指令调试汇编代码,并查看%esp、%ebp和堆栈内容:
1、使用si指令单步跟踪一条机器指令
2、使用i r指令查看各寄存器的值
3、使用x/na %esp对应的值指令查看堆栈变化%esp、%ebp和堆栈内容变化

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

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

为传参做准备:

实参入栈:

call指令将下一条指令的地址入栈:

分配栈空间

pushl 0x8(%ebp)将%esp中的8存入栈中

将 %eax 与立即数4相加

pop %ebp在g结束前弹栈

ret返回g中call的调用位置,结束g函数

将 %esp 与立即数相加

leave返回准备栈

ret返回f中call的调用位置,结束f函数

进入main函数,将 %esp 与立即数相加

将 %eax 与立即数4相加

leave返回准备栈

ret结束main函数

分析

参考
gdb调试汇编堆栈分析的更多相关文章
- 20145318 GDB调试汇编堆栈分析
20145318 GDB调试汇编堆栈分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const sta ...
- 20145219 gdb调试汇编堆栈分析
20145219 gdb调试汇编堆栈分析 代码gdbdemo.c int g(int x) { return x+19; } int f(int x) { return g(x); } int mai ...
- 20145310 GDB调试汇编堆栈分析
GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...
- GDB调试汇编堆栈
GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...
- 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调 ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
随机推荐
- Windows Server 2008 R2安装WAMPSERVER无法启动的解决方法
其实根本不算什么解决方法,会者不难的事.Windows Server 2008 R2(也包括其他版本的Windows)默认状态下安装WAMPSERVER经常是无法顺利启动WAMPSERVER的,尤其是 ...
- cocos2d-x之使用plist文件初试
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } FileUtils *fu=FileUtils::getInstan ...
- web.xml文件报错:cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'.
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- Ubuntu进阶学习,指令迅速查询,Bug迅速查询(Ctrl+F)
There is some notes while I am learning Ubuntu Operate System! (Ask Ubuntu) 1-- Hard link : ln comma ...
- phpcmsv9 标题颜色显示问题
在解决标题颜色问题之前首先要注意到 标题字段为title,副标题为fu_title. 如果一个文章想在首页推荐,又想在栏目首页推荐,并且这两个推荐位置的标题长度不一样,那只能用副标题区别,这样就可以在 ...
- struts2 基本用法
Struts2必需库: commons-fileupload.jar.commons-io-1.3.2.jar.freemarker-2.3.16.jar.javassist-3.7.ga.jar.o ...
- Hadoop 2.0中单点故障解决方案总结
Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题, ...
- hihocoder 1388 &&2016 ACM/ICPC Asia Regional Beijing Online Periodic Signal
#1388 : Periodic Signal 时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal proce ...
- python中range函数和xrange函数有什么异同?
http://ciniao.me/article.php?id=17 简单来说,range生成的是一个列表,而xrange生成的是一个生成器,而生成器在数组很大的时候能够比range更节省空间
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...