20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析
测试代码
#include <stdio.h>
short val = 1;
int vv = 2;
int g(int xxx)
{
return xxx + vv;
}
static const int f(int xx)
{
return g(xx);
}
int main(void)
{
return f(9)+ val;
}
分析过程
通过
gcc - g gdb.c -o gdb -m32指令在64位的机器上产生32位汇编进入gdb调试,先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码
main函数汇编代码:

g函数汇编代码:

f函数汇编代码:

通过
info registers列出使用的寄存器.

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

结合
display命令和寄存器或pc内部变量,做如下设置:display /i $pc,其中$pc代表当前汇编指令,/i表示以十六进行显示。这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。

使用
si执行下一条指令、%esp、%ebpinfo registers和堆栈内容的变化x/na %esp
1.call将下一条指令的所在地址(即当时程序计数器PC的内容)入栈

2.将上一个函数的基址入栈,将当前%esp作为新基址

3.准备传参

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

6.执行g函数,g初始化栈指针

7.计算short+int

8.pop %ebp指令将栈顶弹到%ebp中

9.ret返回g中call的调用位置

10.leave返回准备栈

11.ret结束main函数

12.%esp加立即数4

| 指令 | %eip | %esp | %ebp | %eax | 堆栈 |
|---|---|---|---|---|---|
| push $0x9 | 0x8048400 | 0xffffd024 | 0xffffd028 | 0xf7fb7dbc | 0x0 |
| call 0x80483eb | 0x8048400 | 0xffffd020 | 0xffffd028 | 0xf7fb7dbc | 0x9 0x0 |
| push %ebp | 0x80483eb | 0xffffd020 | 0xffffd028 | 0xf7fb7dbc | 0x8048405 0x9 0x0 |
| mov %esp,%ebp | 0x80483ec | 0xffffd01c | 0xffffd028 | 0xf7fb7dbc | 0xffffd028 0x8048405 0x9 0x0 |
| pushl 0x8(%ebp) | 0x80483ee | 0xffffd01c | 0xffffd01c | 0xf7fb8dbc | 0xffffd028 0x8048405 0x9 0x0 |
| call 0x80483db | 0x80483f1 | 0xffffd018 | 0xffffd01c | 0xf7fb8dbc | 0x9 0xffffd028 0x8048405 0x9 0x0 |
| push %ebp | 0x80483db | 0xffffd014 | 0xffffd01c | 0xf7fb8dbc | 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| mov %esp,%ebp | 0x80483dc | 0xffffd010 | 0xffffd01c | 0xf7fb8dbc | 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| mov 0x804a01c,%edx | 0x80483de | 0xffffd010 | 0xffffd010 | 0xf7fb7dbc | 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| mov 0x8(%ebp),%eax | 0x80483e4 | 0xffffd010 | 0xffffd010 | 0xf7fb7dbc | 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| add %edx,%eax | 0x80483e7 | 0xffffd010 | 0xffffd010 | 0x9 | 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| pop %ebp | 0x80483e9 | 0xffffd010 | 0xffffd010 | 0xb | 0xffffd01c 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| ret | 0x80483ea | 0xffffd014 | 0xffffd01c | 0xb | 0x80483f6 0x9 0xffffd028 0x8048405 0x9 0x0 |
| add $0x4,%esp | 0x80483f6 | 0xffffd018 | 0xffffd01c | 0xb | 0x9 0xffffd028 0x8048405 0x9 0x0 |
| leave | 0x80483f9 | 0xffffd01c | 0xffffd01c | 0xb | 0xffffd028 0x8048405 0x9 0x0 |
| ret | 0x80483fa | 0xffffd020 | 0xffffd028 | 0xb | 0x8048405 0x9 0x0 |
| add $0x4,%esp | 0x8048405 | 0xffffd024 | 0xffffd028 | 0xb | 0x9 0x0 |
| mov %eax,%edx | 0x8048405 | 0xffffd028 | 0xffffd028 | 0xb | 0x0 |
20145212——GDB调试汇编堆栈过程分析的更多相关文章
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用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 ...
- 20145312 GDB调试汇编堆栈过程分析
20145312 GDB调试汇编堆栈过程分析 参考资料 卢肖明同学的博客:<GDB调试汇编堆栈过程分析>: http://www.cnblogs.com/lxm20145215----/p ...
- 20145240 GDB调试汇编堆栈过程分析
20145240 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
随机推荐
- iOS开发常用快捷键
二. Xcode基本快捷键 新建项目 Shift + CMD + N 项目中新建文件 CMD + N 运行 CMD + R 编译 CMD + B 停止运行 CMD + . 清除缓存 Shift + C ...
- 基于ARM处理器的反汇编器软件简单设计及实现
写在前面 2012年写的毕业设计,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性 ...
- lucky 的 时光助理
2017年的lucky小姐,厌倦了现在的工作,她觉得这些的工作对于她而言不具备挑战性,她在迷茫春节过后该如何选择, 这里是距她走出校门整整一年的时光. lucky小姐从开发走向了实施,目的是想周游这个 ...
- SQL Server 2012 新特性:服务角色管理
数据库角色管理,已经可以使用alter role,create role和drop role. 2012增加了几个ddl语句,可以操作服务级别的角色管理, CREATE SERVER ROLE 用 ...
- CentOS yum 源的配置与使用
一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...
- 【Linux】虚拟机安装Archlinux
参考:https://wiki.archlinux.org/index.php/Installation_guide_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 安装 ...
- String构造器中originalValue.length>size 发生的情况
最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- NYOJ----776删除元素
删除元素 时间限制:1000 ms | 内存限制:65535 KB 描述 题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值 输入 多组测 ...
- THINKPHP源码学习--------验证码类
TP3.2验证码类的理解 今天在学习中用到了THINKPHP验证码,为了了解究竟,就开始阅读TP验证码的源码. 源码位置:./ThinkPHP/Library/Think/Verify.class.p ...