欢迎访问金谷下载网 专业电脑手机游戏绿色软件网站

资讯|最近更新

当前位置:首页软件教程软件信息资讯 → visual C++编译异常分析及解决方法

visual C++编译异常分析及解决方法

时间:2013-11-30 18:10:01人气:作者:本站作者我要评论

要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的技术文档多以英文形式发布,否则就会导致VC++编译异常,这大大的影响了程序员的效率。

代码

struct EXCEPTION_REGISTRATION   

{   

EXCEPTION_REGISTRATION* prev;   

DWORD handler;   

int id;   

DWORD ebp;   

};  

VC++编译异常会为绝大部分函数③添加一个EXCEPTION_REGISTRATION类型的局部变量,它的最后一个字段(ebp)与栈桢指针指向的位置重叠。函 数的序言创建这个结构并把它注册给操作系统,尾声则恢复主调函数的EXCEPTION_REGISTRATION。id字段的意义我将在下一节介绍。

VC++编译函数时会为它生成两部分数据 

a)异常回调函数 

b)一个包含函数重要信息的数据结构,这些信息包括catch块、这些块的地址和这些块所关心的异常的类型等等。我把这个结构称为funcinfo,有关它的详细讨论也在下一节。

是考虑了异常处理之后的运行时堆栈。widget的异常回调函数位于由FS:[0]指向的异常处理链的开始位置(这是由widget的序言设置的)。

异常处理

异常处理程序把widget的funcinfo结构的地址交给函数__CxxFrameHandler,__CxxFrameHandler会检查这个结 构看函数中有没有catch块对当前的异常感兴趣。

如果没有的话,它就返回ExceptionContinueSearch给操作系统,于是操作系统会从 异常处理链表中取得下一个结点,并调用它的异常处理程序(也就是调用当前函数的那个函数的异常处理程序)。

这一过程将一直进行下去——直到处理程序找到一个能处理当前异常的catch块为止,这时它就不再返回操作系统了。但是在调用catch块之前(由于有 funcinfo结构,所以知道catch块的入口,参见图3),必须进行堆栈展开,也就是清理掉当前函数的栈桢下面的所有其他的栈桢。这个操作稍微有点 复杂。

因为:异常处理程序必须找到异常发生时生存在这些栈桢上的所有局部对象,VC++编译异常并依次调用它们的析构函数。后面我将对此进行详细介绍。 异常处理程序把这项工作委托给了各个栈桢自己的异常处理程序。从FS:[0]指向的异常处理链的第一个结点开始,它依次调用每个结点的处理程序,告诉它堆 栈正在展开。

与之相呼应,这些处理程序会调用每个局部对象的析构函数,然后返回。此过程一直进行到与异常处理程序自身相对应的那个结点为止。 由于catch块是函数的一部分,所以它使用的也是函数的栈桢。因此,在调用catch块之前,异常处理程序必须激活它所隶属的函数的栈桢。

其次,每个catch块都只接受一个参数,VC++编译异常其类型是它希望捕获的异常的类型。异常处理程序必须把异常对象本身或者是异常对象的引用拷贝到catch块的栈 桢上,编译器在funcinfo中记录了相关信息,处理程序根据这些信息就能知道到哪去拷贝异常对象了。

相关文章

  • 微信一手机号可注册两账号 微信全面支持注册小号

    经过一段时间的小规模测试,微信终于全面支持注册“小号”了!同一个手机号能再次多注册一个辅助账号,这样的新功能能够更好的对微信账户进行管理,但是想要注册小号也是有条件限制..
  • Midjourney使用方法 Midjourney怎么付费

    Midjourney V5测试版本已经推出,目前大家可以直接在这个网站社区进行AI绘画,V5的精美程度堪比真人照片了,不过有很多国内的小伙伴们不知道如何使用,这里小编带来比较详细的操作..

网友评论

推荐文章

关于金谷下载网 | 联系方式 | 发展历程 | 版权声明 | 下载帮助(?) | 广告联系 | 网站地图 | 友情链接

Copyright 2020-2029 JGSC.CC 【金谷下载网】 版权所有 豫ICP备17041013号-5 | 豫公网安备 42033302000245号

声明: 本站所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告