C++程序的成员函数默认使用的调用约定是thiscall,这种约定是把this指针放到ECX寄存器中.This调用协定也是要求被调用函数负责清理栈,因此不支持可变数时的参数,当我们在C++类中定义了可变数量参数的成员函数时,偏译器会自动改为使用C调用约定,当这种调用时,编译器会将所有参数压入栈中,再将this指针压入栈:

关键两点:1.this时,是被调用函灵敏清理栈 2.如果可变参数,则使用C约定,由调用者来清理

写个小demo测试:

[cpp] view plaincopy
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. enum MEAL {BREAKFAST, LUNCH, SUPPER};
  4. class Cat
  5. {
  6. public:
  7. MEAL Fun0(MEAL i)
  8. {
  9. return i;
  10. }
  11. char* Fun1(MEAL i, ...)
  12. {
  13. return 0;
  14. }
  15. };
  16. int main(int argc, char* argv[])
  17. {
  18. Cat cat;
  19. cat.Fun0(BREAKFAST);
  20. cat.Fun1(BREAKFAST, "meat", "beaf", "rice");
  21. return 0;
  22. }
[cpp] view plaincopy
  1. 0:000> x ThisCall!Cat::*
  2. 00401060 ThisCall!Cat::Fun0 (MEAL)
  3. 00401090 ThisCall!Cat::Fun1 (MEAL)
  4. 0:000> x ThisCall!main
  5. 00401000 ThisCall!main (int, char **)
  6. 0:000> bp 00401000

先在main处下断点:

[cpp] view plaincopy
  1. ThisCall!main:
  2. 00401000 55              push    ebp
  3. 00401001 8bec            mov     ebp,esp
  4. 00401003 83ec44          sub     esp,44h
  5. 00401006 53              push    ebx
  6. 00401007 56              push    esi
  7. 00401008 57              push    edi
  8. 00401009 8d7dbc          lea     edi,[ebp-44h]
  9. 0040100c b911000000      mov     ecx,11h
  10. 00401011 b8cccccccc      mov     eax,0CCCCCCCCh
  11. 00401016 f3ab            rep stos dword ptr es:[edi]
  12. 00401018 6a00            push    0//入值BREAKFAST
  13. 0040101a 8d4dfc          lea     ecx,[ebp-4]//这地方明显ebp-4为Cat cat这个局部变量,也就是把this赋给ECX
  14. 0040101d e83e000000      call    ThisCall!Cat::Fun0 (00401060)//Fun0后调用者不用清栈
  15. 00401022 68fce04000      push    offset ThisCall!`string' (0040e0fc)
  16. 00401027 68f4e04000      push    offset ThisCall!`string' (0040e0f4)
  17. 0040102c 68ece04000      push    offset ThisCall!`string' (0040e0ec)
  18. 00401031 6a00            push    0
  19. 00401033 8d45fc          lea     eax,[ebp-4]
  20. 00401036 50              push    eax
  21. 00401037 e854000000      call    ThisCall!Cat::Fun1 (00401090)
  22. 0040103c 83c414          add     esp,14h//Fun1后调用者需要清栈

这样就看得很清楚了.

windbg-调试技巧(定长、不定长参数thiscall平衡堆栈方式不同)相关推荐

  1. windbg 调试技巧

    技巧一:在加载名卸载的时候下断点 1. 加载某个DLL 的时候下断点的WinDBG 命令: sxe ld:[dll name] 然后按F5,进行刷新,再使用lmf 查看装载的Dll名称. 2.  卸载 ...

  2. C语言调试技巧:main函数输入参数

    带入参的main函数 介绍 带入参的main函数主要用于一些基本调试,main函数的入参在main函数里被解析为字符串,因此根据具体的调试业务可以需要将字符串转为相应的int类型或double类型进行 ...

  3. 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数

    目录 一.什么是bug 二.调试是什么?有多重要? 1.调试 2.调试的基本步骤 三.Debug和Release 四.windows环境调试介绍 1.调试环境的准备 2.学会快捷键 Ctrl+U 改大 ...

  4. C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程

    目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...

  5. java 不定长参数_简单介绍Java的不定长度参数

    本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站 先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: public class VariAr ...

  6. iOS实现传递不定长的多个参数

    我们在使用苹果官方的文档的时候会发现可传不定数的参数例如: // [[UIAlertView alloc]initWithTitle:<#(nullable NSString *)#> m ...

  7. python3 函数 不定长参数 不定参

    第一种不定长参数*args *args 称为不定长参数,只能放在形参的最后位置,返回的是一个元组 def num(a,b,*args):print(a)print(b)print(args)num(1 ...

  8. 不定长参数的装包与拆包

    #转载请联系 def task(a,b,c,*args,**kwargs):print(a)print(b)print(c)print(args)print(kwargs)task(1,2,3,4,5 ...

  9. python不定长参数怎么相加_python函数不定长参数使用方法解析

    这篇文章主要介绍了python函数不定长参数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pathon中的函数可以使用不定长参数,可以 ...

最新文章

  1. 【转】持续交付和DevOps的前世今生
  2. RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
  3. nginx下gzip配置参数详解
  4. 又推亲儿子,苹果与国际权威机构推出 Swift 资格认证
  5. cocoapods安装bug
  6. 京东成全国首批支持第三方商家接入数字人民币的企业
  7. 【数据结构算法】二:上三角、下三角中求数组地址--【下标的计算】
  8. 每日吃三颗红枣,对我们的身体有什么影响?
  9. linux 查看端口、进程情况及kill进程
  10. 网页切图div+css命名
  11. chm 已取消到该网页的导航,打不开!
  12. 工作窃取算法 work-stealing
  13. 基于SSM的网上图书商城系统
  14. win10安装Vmware虚拟机黑屏的解决
  15. 开启全面屏体验 | 手势导航 (一)
  16. Hexo+Butterfly主题美化
  17. 网卡无法再次硬改mac_Intel网卡mac无限硬改工具(IntelMacChanger)
  18. 苹果X 顶部和底部留白问题
  19. PS教程-photoshop入门基础应用技术服务支持
  20. 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。

热门文章

  1. 互联网创业公司的传统思维
  2. 计算机内存延迟,CPU性能差距竟然在这里 延迟不止在内存
  3. mysql yum多实例_mysql———基于yum源实现多实例
  4. 为什么普通红包自己不能领_我的拼多多不能领红包是怎么回事呢?
  5. 写作有困扰?不知道用什么词?不知道怎么解释不一致的结果?这个网站来帮你。
  6. 关于相似性度量与各类距离的意义
  7. 第49课 大大大(纯小数变整数) 《小学生C++趣味编程》
  8. 白鹭引擎解决微信小游戏切换背景音乐无法播放的问题。
  9. STM32H743+CubeMX-ADC(16bit分辨率)+DMA采样三路模拟量,硬件过采样器实现1024倍过采样
  10. STM32H743+CubeMX-解决FDCAN控制器无法接收远程帧