GDB调试汇编栈堆过程的学习
2024-10-16 13:32:35
前期调试
我的程序代码是:
- 首先,用
gcc g gdb.c -o gdb -m32
产生32位汇编。
- 输入gdb gdb进入gdb调试器
- 在main函数处设置一个断点:
b main
- 用
disassemble
指令获取汇编代码
- 输入
i r
查看个寄存器的值
- 输入
display /i $pc
,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句。下面展示每一步时%esp、%ebp和堆栈内容的变化
用si、i r、x/na %esp指令对每一步进行分析
输入si执行一步
调用f函数
输入i r看寄存器的值
用x/2a %esp查看栈堆里的值。因为执行了push $0x8,将0x8推入栈中。esp的值减4。
再输入si执行一步,并输入i r,x/na %esp
call指令会将下一条指令的地址入栈。因此,栈堆又增加了一个值,esp的值也相应的减4
重复上述三步
因为mov指令不会使栈堆发生变换,所以栈堆中的值不变,esp的值也不变
执行push指令,将0x8入栈,esp值减4。调用g函数
执行call指令,下一条指令的地址入栈,esp减4
push ebp 将%ebp的值入栈,esp减4
mov和add没有出栈入栈操作。栈堆不发生变化
pop、ret指令进行弹栈操作,栈顶的先出栈。完成一次出栈操作,esp的值加4
add $0x4,%esp 将esp的值加4,指针上移,相当于从栈堆弹出一个值
退出f函数。栈顶的值完成出栈操作
程序结束,栈堆中所有值都完成出栈,栈堆中为空
汇总表:
问题解决
第一次输入gcc g gdb.c -o gdb -m32
报错。
解决方法:sudo apt-get install libc6-dev-i386
安装一个库即可
最新文章
- 2015微软MVP全球峰会见闻
- Android二维码识别 开源项目ZXing的编译
- XML的解析方式(DOM、SAX、StAX)
- Windows下Sublime Text 默认打开方式问题解决办法
- HTML5的Web SQL Database
- hdoj 2032 杨辉三角
- AndroidStaggeredGrid
- 回某位朋友问题备受phpcgi.exe煎熬现在cpu跑满(解决方案)
- android与PC互传文件 adb push
- SVN强制填写日志
- A Game of Thrones(13) - Tyrion
- Java依据Url下载图片
- 在nltk中调用stanfordparser处理中文
- Linux系统常见调用及其分类
- mysql 定期删除表中无用数据
- 附加题(一)——interesting的抄袭现象
- 01 while 循环输入1 2 3 4 5 6 8 9 10
- 字符串切分 String.Split 和 Regex.Split(小技巧)
- Rot13加密算法
- CSU 1968 Permutation Descent Counts
热门文章
- leveldb源码分析—Recover和Repair
- ASP.NET操作Cookie
- 基于WF4.0的公文管理系统
- 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境
- proxool详细配置
- linux: 获取监听指定端口的进程PID
- Hive get table rows count batch
- Linux的交叉编译 及configure配置
- 【Ext.Net学习笔记】06:Ext.Net GridPanel的用法(GridPanel 折叠/展开行、GridPanel Selection、 可编辑的GridPanel)
- UVA 10405 Longest Common Subsequence --经典DP