C++异常处理机制__1.SEH处理的函数栈布局

C++可以有两种异常处理方法

1. SEH exceptions (Structured Exception Handling), 结构化异常处理
它有三个关键字__try, __except, __finally,并通过RaiseException 抛出异常
其中一个__try后只能跟一个__except或一个__finally。
当__try后跟__except时,为异常处理(exception handling)
当__try后跟__finally时,为结束处理(termination handling)
它可以捕获内存非法访问,除0等 CPU 引发的硬件异常,以可以捕获通过RaiseException 抛出的软件异常
但它不支持栈回退,但函数中有类变量时无法编译通过

2. C++ exceptions, 有try 和 catch 两个关键字,通过throw 抛出异常
C++ exceptions更为强大,因为它可以抛出并捕获任意类型的异常,并进行栈回退工作,使得RAII技术能得以实现。

-------------------------------------------------------------------------------------------------------
先看看普通函数的栈状态

测试函数


编译器生成的代码 (VS2005, Release)
void simple_func (int x)
{
00401FD0  push        ebp                   <== 保存上一函数的EBP
00401FD1  mov         ebp,esp               <== 设置EBP 到当前函数栈顶
00401FD3  sub         esp,0Ch               <== 分配函数局部变量空间
    int *p1 = NULL;
00401FD6  mov         dword ptr [p1],0
......
}
0040200B  mov         esp,ebp              
0040200D  pop         ebp 
0040200E  ret             

当前寄存器:
EAX = 003B39A8 EBX = 00000000 ECX = 781C37E4 EDX = 00000000 ESI = 00000001
EDI = 00408590 EIP = 00401FD6 ESP = 0012FF5C EBP = 0012FF68 EFL = 00000216

内存值
0x0012FF50                                                     ...., 4f 1d 13 78
0x0012FF60  c0 ff 12 00, f0 15 40 00, 74 ff 12 00, ca 21 40 00
0x0012FF70  0a 00 00 00, ......

可见一般函数的栈空间很简单:(地址从高到低)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值