windbg-调试技巧(定长、不定长参数thiscall平衡堆栈方式不同)
C++程序的成员函数默认使用的调用约定是thiscall,这种约定是把this指针放到ECX寄存器中.This调用协定也是要求被调用函数负责清理栈,因此不支持可变数时的参数,当我们在C++类中定义了可变数量参数的成员函数时,偏译器会自动改为使用C调用约定,当这种调用时,编译器会将所有参数压入栈中,再将this指针压入栈:
关键两点:1.this时,是被调用函灵敏清理栈 2.如果可变参数,则使用C约定,由调用者来清理
写个小demo测试:
- #include "stdafx.h"
- #include <stdio.h>
- enum MEAL {BREAKFAST, LUNCH, SUPPER};
- class Cat
- {
- public:
- MEAL Fun0(MEAL i)
- {
- return i;
- }
- char* Fun1(MEAL i, ...)
- {
- return 0;
- }
- };
- int main(int argc, char* argv[])
- {
- Cat cat;
- cat.Fun0(BREAKFAST);
- cat.Fun1(BREAKFAST, "meat", "beaf", "rice");
- return 0;
- }
- 0:000> x ThisCall!Cat::*
- 00401060 ThisCall!Cat::Fun0 (MEAL)
- 00401090 ThisCall!Cat::Fun1 (MEAL)
- 0:000> x ThisCall!main
- 00401000 ThisCall!main (int, char **)
- 0:000> bp 00401000
先在main处下断点:
- ThisCall!main:
- 00401000 55 push ebp
- 00401001 8bec mov ebp,esp
- 00401003 83ec44 sub esp,44h
- 00401006 53 push ebx
- 00401007 56 push esi
- 00401008 57 push edi
- 00401009 8d7dbc lea edi,[ebp-44h]
- 0040100c b911000000 mov ecx,11h
- 00401011 b8cccccccc mov eax,0CCCCCCCCh
- 00401016 f3ab rep stos dword ptr es:[edi]
- 00401018 6a00 push 0//入值BREAKFAST
- 0040101a 8d4dfc lea ecx,[ebp-4]//这地方明显ebp-4为Cat cat这个局部变量,也就是把this赋给ECX
- 0040101d e83e000000 call ThisCall!Cat::Fun0 (00401060)//Fun0后调用者不用清栈
- 00401022 68fce04000 push offset ThisCall!`string' (0040e0fc)
- 00401027 68f4e04000 push offset ThisCall!`string' (0040e0f4)
- 0040102c 68ece04000 push offset ThisCall!`string' (0040e0ec)
- 00401031 6a00 push 0
- 00401033 8d45fc lea eax,[ebp-4]
- 00401036 50 push eax
- 00401037 e854000000 call ThisCall!Cat::Fun1 (00401090)
- 0040103c 83c414 add esp,14h//Fun1后调用者需要清栈
这样就看得很清楚了.
windbg-调试技巧(定长、不定长参数thiscall平衡堆栈方式不同)相关推荐
- windbg 调试技巧
技巧一:在加载名卸载的时候下断点 1. 加载某个DLL 的时候下断点的WinDBG 命令: sxe ld:[dll name] 然后按F5,进行刷新,再使用lmf 查看装载的Dll名称. 2. 卸载 ...
- C语言调试技巧:main函数输入参数
带入参的main函数 介绍 带入参的main函数主要用于一些基本调试,main函数的入参在main函数里被解析为字符串,因此根据具体的调试业务可以需要将字符串转为相应的int类型或double类型进行 ...
- 实用调试技巧 Debug Release F10 F11 初始化 越界访问 堆栈 模拟实现库函数
目录 一.什么是bug 二.调试是什么?有多重要? 1.调试 2.调试的基本步骤 三.Debug和Release 四.windows环境调试介绍 1.调试环境的准备 2.学会快捷键 Ctrl+U 改大 ...
- C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程
目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...
- java 不定长参数_简单介绍Java的不定长度参数
本文版权归作者所有,仅供用来网上学习来用,读者可以收藏,请不要下载到本机和重新发布到其它网站 先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: public class VariAr ...
- iOS实现传递不定长的多个参数
我们在使用苹果官方的文档的时候会发现可传不定数的参数例如: // [[UIAlertView alloc]initWithTitle:<#(nullable NSString *)#> m ...
- python3 函数 不定长参数 不定参
第一种不定长参数*args *args 称为不定长参数,只能放在形参的最后位置,返回的是一个元组 def num(a,b,*args):print(a)print(b)print(args)num(1 ...
- 不定长参数的装包与拆包
#转载请联系 def task(a,b,c,*args,**kwargs):print(a)print(b)print(c)print(args)print(kwargs)task(1,2,3,4,5 ...
- python不定长参数怎么相加_python函数不定长参数使用方法解析
这篇文章主要介绍了python函数不定长参数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 pathon中的函数可以使用不定长参数,可以 ...
最新文章
- 【转】持续交付和DevOps的前世今生
- RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
- nginx下gzip配置参数详解
- 又推亲儿子,苹果与国际权威机构推出 Swift 资格认证
- cocoapods安装bug
- 京东成全国首批支持第三方商家接入数字人民币的企业
- 【数据结构算法】二:上三角、下三角中求数组地址--【下标的计算】
- 每日吃三颗红枣,对我们的身体有什么影响?
- linux 查看端口、进程情况及kill进程
- 网页切图div+css命名
- chm 已取消到该网页的导航,打不开!
- 工作窃取算法 work-stealing
- 基于SSM的网上图书商城系统
- win10安装Vmware虚拟机黑屏的解决
- 开启全面屏体验 | 手势导航 (一)
- Hexo+Butterfly主题美化
- 网卡无法再次硬改mac_Intel网卡mac无限硬改工具(IntelMacChanger)
- 苹果X 顶部和底部留白问题
- PS教程-photoshop入门基础应用技术服务支持
- 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。
热门文章
- 互联网创业公司的传统思维
- 计算机内存延迟,CPU性能差距竟然在这里 延迟不止在内存
- mysql yum多实例_mysql———基于yum源实现多实例
- 为什么普通红包自己不能领_我的拼多多不能领红包是怎么回事呢?
- 写作有困扰?不知道用什么词?不知道怎么解释不一致的结果?这个网站来帮你。
- 关于相似性度量与各类距离的意义
- 第49课 大大大(纯小数变整数) 《小学生C++趣味编程》
- 白鹭引擎解决微信小游戏切换背景音乐无法播放的问题。
- STM32H743+CubeMX-ADC(16bit分辨率)+DMA采样三路模拟量,硬件过采样器实现1024倍过采样
- STM32H743+CubeMX-解决FDCAN控制器无法接收远程帧