gdb汇编调试
GDB调试汇编堆栈分析
代码:
sudo apt-get install libc6-dev-i386命令安装所需库
进入之后先在main函数处设置一个断点,再run一下,使用
disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值:

可见此时主函数的栈基址为0xffffd098,用
x(examine)指令查看内存地址中的值,目前%esp所指为0,%ebp为0下面展示每一步时%esp、%ebp和堆栈内容的变化:
i



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



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



先为传参做准备:



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



实参入栈06


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





计算short+int









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



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



ret指令将栈顶弹给%eip:



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






- 主函数汇编代码,并结束栈帧的调用。
| 指令 | esp | ebp | 堆栈 | ||
| push $0x8 |
|
0xffffd098 | 0x0 | ||
| call 0x80483ef |
|
0xffffd098 | 0x8 0x0 | ||
| push %ebp |
|
0xffffd098 | 0x8048412 0x8 0x0 | ||
| mov %esp,%ebp | 0xffffd08c | 0xffffd098 | 0xffffd098 0x8048412 0x8 0x0 | ||
| mov 0x804a01c,%edx | 0xffffd08c | 0xffffd08c | 0xffffd098 0x8048412 0x8 0x0 | ||
| mov 0x8(%ebp),%eax | 0xffffd08c | 0xffffd08c |
0xffffd098 0x8048412 0x8 0x0 |
||
| add %edx ,%eax | 0xffffd08c | 0xffffd08c | 0xffffd098 0x8048412 0x8 0x0 | ||
| push %eax | 0xffffd08c | 0xffffd08c | 0xffffd098 0x8048412 0x8 0x0 | ||
| call 0x80483db<g> | 0xffffd088 | 0xffffd08c | 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| push %ebp | 0xffffd084 | 0xffffd08c | 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| move %esp %ebp | 0xffffd080 | 0xffffd08c | 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| movzwl | 0xffffd080 | 0xffffd080 | 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| movswl %ax %edx | 0xffffd0080 | 0xffffd080 | 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| mov 0x8(%ebp),%eax | 0xffffd080 | 0xffffd080 | 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 | ||
| add %edx %eax | 0xffffd080 | 0xffffd080 |
|
| pop %ebp | 0xffffd080 | 0xffffd080 | 0xffffd08c 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 |
| ret | 0xffffd084 | 0xffffd08c | 0x8048403 0xa 0xffffd098 0x8048412 0x8 0x0 |
| add $0x4 ,%esp | 0xffffd08 | 0xffffd08c | 0xa 0xffffd098 0x8048412 0x8 0x0 |
| leave | 0xffffd08c | 0xffffd08c | 0xffffd098 0x8048412 0x8 0x0 |
| ret | 0xffffd090 | 0xffffd098 | 0x8048412 0x8 0x0 |
| add $0x4 ,%esp | 0xffffd09 | 0xffffd098 | 0x8 0x0 |
| leave | 0xffffd098 | 0xffffd098 | 0x0 |
| ret | 0xffffd09c | 0x0 |
gdb汇编调试的更多相关文章
- GDB中汇编调试
GDB中汇编调试 1.输入代码 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,时遇到问题使用-m32指令报错,参考卢肖明同学博客知道这是 ...
- GDB堆栈跟踪与汇编调试
GDB堆栈跟踪与汇编调试 堆栈跟踪 源代码: 对预先编写的 stack.c 文件进行编译,并且使用 CGDB 进行调试,对堆栈进行跟踪,了解该代码堆栈是如何变化的. 在 CGDB 中,先设置 main ...
- GDB 单步调试汇编
本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/134 之前在看汇编的时候一直是肉眼看GCC -S的结果,缺点是 ...
- gdb命令调试技巧
gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- Linux gcc和gdb程序调试用法 {转}
gcc一般调试格式: gcc -Wall -o test test.c // -wall 显示程序错误详细信息 gcc -v // 显示gcc的版本 gcc -o{1,2,3} t ...
- ARM平台如何玩转GDB远程调试?
前 言 关于GDB工具 GDB工具是GNU项目调试器,基于命令行使用.和其他的调试器一样,可使用GDB工具单步运行程序.单步执行.跳入/跳出函数.设置断点.查看变量等等,它是UNIX/LINUX操作 ...
- gdb可以调试python的pdb么
1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...
- Window平台Grmon下如何使用gdb进行调试
Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...
随机推荐
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...
- linux下安装安装pcre-8.32
linux下安装安装pcre-8.32 ./configure --prefix=/usr/local/pcre 出现以下错误 configure: error: You need a C++ com ...
- HTTP head 详解 (转)
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内 容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...
- mongodb 对内嵌文档(数组) group分页查询,并设置查询条件
文档示例Account的其中一条记录: // collection: Account { "_id" : ObjectId("5843e38e535f3708f759b2 ...
- [2014.01.27]WFsoft.wfLibrary.wfIniFile 1.5
完全支持.net 2.0编写,对下一代操作系统平稳过渡. 不使用[DllImport("kernel32")]的方式,完全自主的.net 2.0自主解析. 完整支持键 ...
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- STM32固件库3.5+uCOS2.86移植(转自暴走的工程师)
考了很多移植的资料和代码,终于移植好了...应该是完美移植吧~~哈哈哈~~ 编译环境是IAR 工程适用于STM32F10X大容量产品,如果不是,请自行修改启动文件和工程配置 编译器优化等级最高...这 ...
- Angular中的jsonp
1.一般我们使用Angualr中的jsonp值这样使用的:注入$http服务 这样使用jsonp的方式可以支持多数api,但是douban不支持无法使用 module.controller('InTh ...
- MySQL服务 - MySQL变量类型及变量设置
一.MySQL变量类型: MySQL通过变量来定义当前服务器的特性,保存状态信息等.我们可以通过手动更改变量的值来配置MySQL,也可以通过变量获得MySQL的当前状态信息.MySQL的变量类型可以从 ...
- Debugging Maya Plugin(C++) with CodeBlocks in Linux
My system is CentOS7 x64, Maya2015 x64 for Linux. - Make sure that your project is built with flag - ...