引言

工作中最难以解决的BUG莫过于偶现,复现周期长,难以定位的,而有时core也是缺少调试信息的。这种情况下就需要通过堆栈还原工作现场来分析问题。尽管现在诸多解释性语言蓬勃发展,但语言的根本汇编我们还是需要掌握,无论对于解bug还是分析语言本质都有着奇效。掌握事物的本质才是真正的理解。

测试代码        

测试代码如下所示,很简单的例子。我们编译后使用gdb来分析函数调用前后栈的内存使用变化。测试的平台是i386架构,注意不同架构传参会有不一样的行为。

分析

对main函数反汇编并去除不影响分析代码如下所示。栈是往低地址方向增长的,同时参数为从右往左入栈。可以看到开始是将count = sizeof(readbuff)放入栈。接下来计算得到readbuff的地址放入栈,还有一个就是c++的默认传参this。将参数都放入栈中后call 指令跳转。call指令跳转前会将返回地址入栈。结果得到如下栈的内存分布。

接下来是跳转进入CStreamClient::read执行。首先会对上一栈帧的ebp入栈保存,然后将当前的栈指针esp拷贝给ebp,这样就可以使用ebp对传入参数以及局部变量进行访问,如下所示。接下来是将栈指针减去0X10,为局部变量申请空间。相信眼尖的你也注意到了,有12字节未使用;这是因为栈对齐的原因。

当CStreamServer::read函数执行完时,使用eax寄存器返回返回值。执行leave指令相当于先mov %ebp, %esp,也就是释放局部变量空间;然后pop $ebp将上一栈帧的ebp恢复。

执行到最后就是ret指令,ret就是执行pop %eip,将返回地址赋给eip,即从返回地址处继续执行。

深入理解c++函数调用的参数传递与局部变量申请相关推荐

  1. ARM函数调用时参数传递规则

    之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器 R0传递第一个参数, R1传递到第二个.. 一直到R3传递第四个参数. 但是 实际上有时可能传递的参数非常多,超过8个,或是 ...

  2. js 基础 -- 循环、函数调用 、全局和局部变量、异常捕获、事件

    一:循环 for  for in <!DOCTYPE html> <html> <head><meta charset="utf-8" / ...

  3. 入门系列:gdb学习——函数调用时参数传递

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  4. Matlab的函数调用和参数传递

    函数调用 在Matlab中,调用函数的形式如下: [输出参数 1,输出参数 2,-] = 函数名字(输入参数 1,输入参数 2,输入参数 3,-) 注意事项: 函数调用的时候,参数顺序应该与定义的时候 ...

  5. C/C++函数调用时参数传递过程、调用约定与可变参函数的实现

    目录 1.参数传递过程 2.参数压栈顺序从右至左的影响 3.调用约定 3.1.__cdecl C/C++ 缺省调用约定 3.2. __stdcall调用约定 3.3. __fastcall (快速调用 ...

  6. 从寄存器看I386和x64位中函数调用中参数传递

    x86_64基本使用寄存器存储函数参数,寄存器不够才入栈: 而i386将所有参数保存在栈上,通过gcc的扩展功能__attribute__((regparm()))即可实现部分参数的寄存器传递. 调试 ...

  7. MATLAB学习笔记1——函数调用、参数传递、全局变量使用

    Matlab学习笔记 最近笔者学习MATLAB用来处理机器人轨迹规划,在仿真实现中为了避免代码过于冗长,会进行分开任务区写代码,这就需要各任务区进行数据的交换. 笔者用两个办法 一个是设置变量为全局变 ...

  8. matlab 带参数函数调用,matlab的函数调用和参数传递

    函数调用 在一个m文件中,可以定义多个函数,但是文件名一定要与第一个函数(主函数)一致, 该文件中其他函数则为本文件的私有函数,外部不可访问(可以通过参数调用的方法访问,下面会描述). 例如在一个程序 ...

  9. 参数在c语言中,C语言函数调用和参数传递

    C语言函数被定义以后可以被多次调用,调用的时候可以向它传递参数. C语言函数调用 函数的调用指的就是函数的使用方法. 在程序中使用已经定义的函数,可以使用函数调用表达式,其一般格式如下: 函数名(实参 ...

最新文章

  1. ActiveMQ的多节点集群
  2. 淘宝特价版给拼多多送芒果,网友:这是什么操作?
  3. 想学python从哪里入手-想要学习python,如何入手学习?
  4. Javascript刷新全集
  5. xxx while the managed IDbConnection interface was being used: Login failed for user xxx
  6. 常见开发需求之前端利器webstorm中的git和快捷键
  7. 消息队列:RabbitMQ和Kafka的比较
  8. 直播电商源码,无加密
  9. rar压缩包密码解密
  10. mysql alert on delete cascade_mysql-我的“ ON DELETE CASCADE”不起作用
  11. obsidian如何修改主题
  12. Windows Mobile 6.x 下改Tahoma字体+微软雅黑说明
  13. 关于karabiner的设置
  14. Supervised Contrastive Learning For Recommendation
  15. 图文讲解三极管3种工作状态
  16. 准备编译环境,安装gcc,工具make
  17. PhotoshopCS6
  18. 根据传入日期 往前或者往后 顺延月份
  19. 图像采集卡的种类和区别
  20. HTML+Css 简易淘宝界面

热门文章

  1. mysql事务隔离级别详解_MySQL的事务隔离级别详解
  2. 将本地的jar包放入maven仓库
  3. 区块链技术与应用行业分析报告
  4. win10系统安装与双系统ubuntu深度学习环境配置
  5. Real-Time Rendering Fourth Edition读书笔记1
  6. 小巧好用的真无线耳机,音质还挺好,SOUNDPEATS泥炭Air3体验
  7. 灵魂拷问!Mysql和Redis数据同步该怎么做?请查收
  8. 股票自动交易python下单接口_千股千评_个股最近30天专家点评_散户大家庭
  9. 顶点计划换位思考汇总
  10. ElasticSearch学习(十)—— 增加身份认证