GDB Hacks读书笔记 第二章--调试前的必会知识__必需的栈知识-x86

本文是GDB Hacks第二章的读书笔记,探讨了x86架构下调试必备的栈知识,包括栈的性质、函数调用与栈的关系、参数传递规则及如何在栈上找到返回地址。通过实例详细分析了main函数调用sum_till_MAX函数时栈的变化,并展示了如何利用GDB进行分析。
摘要由CSDN通过智能技术生成
GDB Hacks读书笔记 第二章–调试前的必会知识__必需的栈知识-x86

这部分知识点的理解对于后续调试程序由很大的影响。每个函数自身的栈以及调用者和被调用者之间的栈关系,函数调用时参数传递规则,被调用函数内部变量是如何分配的等。

环境

使用32位虚拟机

ubuntu 14.04 32bit 
gcc 4.8.4

使用的函数

在这里插入图片描述
在这里插入图片描述
使用如下命令编译

gcc -g fun_.c

在调试时,栈是常用的数据结构。栈是一种后进先出的数据结构(LIFO)。向栈内添加数据称为PUSH ,从栈上取出数据称为POP。x86的函数栈是自下而上增长

函数调用和栈的关系

每个函数都有自己的函数栈,当main函数调用子函数时,子函数拥有自己的函数栈,此时的函数栈称为栈帧。栈上依次保存的数据为

  • 函数调用需要的参数
  • 通过call指令调用函数时保存的返回地址
  • 调用函数的栈ebp
  • 供给自己使用的栈空间,这里分配出来的栈空间主要给函数内的变量等使用。

如图,来自DEBUG Hacks 中文版深入调试的技术和工具–图2-12
在这里插入图片描述
如图,当main()函数没有调用sum_till_MAX()函数时,存在栈帧A(图a)
发生main()->sum_till_MAX函数,首先将sum_till_MAX函数需要的参数压入栈,接着调用call指令调用sum_till_MAX函数,相关汇编指令

push 0x0
call sum_till_MAX

接着,在sum_till_MAX函数内࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值