- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
!C异常的实现_ZH
/htm_data/87/0407/72938.html
how a c++ compiler implements exception handling
有人应该知道有这么一个同名的文章介绍vc 6怎么实现c++异常的文章.....在这里小弟不才.借用下这个名字,介绍 2003怎么实现这个技术. 先说这些代码的由来,首先呢,你得写一个c++得程序,然后选择静态链接,然后用ida 反汇编就ok,用 vc 本身作调试器就ok,softice这种家伙,也没有用得必要了. 当然你也许能发现eh.obj这样的文件,其实代码就在那几个obj里面. 要想继续看下去,你得了解windows得seh技术,得熟练掌握32位汇编,因为这里并没有什么源代码给你看,全部是反汇编得结果...自然对c++异常的语法,以及c++异常规范,你必须要有足够的了解才行. 因为我ida反汇编以后加上注释的那几个idb文件已经不见了,只是剩下了自己用汇编写的代码,所以这里出现的代码都是nasm格式的汇编代码,同时搭配使用c32.mac这个文件,这个文件我有修改增加其宏的功能,名字都很简单明了,希望那些宏不会对大家的阅读产生障碍. 然后呢,要说说一些基本的概念. 你应该要知道__stdcall,__cdecl,__thiscall这些的调用与被调用规则,应该要知道在一个c函数里面哪些寄存器的值是要保护的,哪些寄存器是不用保护的.应该要明白mov fs:[0],eax是在干什么,你要明白windows的seh是怎么完成的.有了足够的准备以后往下看吧.. seh是windows平台上的一种异常处理方式,通过预先安装一个处理函数,到发生异常的时候跳转到处理函数里面的方式完成异常处理,这里不要把__try,__except等同到seh,他们只是一种简单的处理模型,并不代表了seh本身,seh本身只是在异常发生的时候跳转到一个函数而已. 当我们写下throw 0;这样的语句的时候,编译器会为我们产生下面的这些代码 mov [ebp-10],0 lea eax,[ebp-10] push __TI1H push eax call __CxxThrowException@8 上面这些代码调用了一个叫__CxxThrowException@8的函数 看它的名字就知道它应该是一个使用stdcall调用法则,有两个参数的函数.它的原型 void __stdcall _CxxThrowException(void *pObject,_s_ThrowInfo const* pThrowInfo) 第一个参数就是throw 后面的那个object的地址,第二个参数是一个叫throwInfo的结构,它的定义如下(能在vc的watch窗口里面看到,你输入(_s_ThrowInfo*)0就能看到它的成员定义了) ; throw info struc _s_ThrowInfo .attributes : resd 1 ; properites .pmfnUnwind : resd 1 ; destructor for thrown object .pForwardCompat : resd 1 ; compat handler address .pCatchableTypeArray : resd 1 ; catchable type array endstruc 这个结构定义是使用nasm的语法,resd表示它是dword大小的,后面的1表示一个dword. 上面看到的那个__TI1H就是这个结构. 关于它的几个成员.我后面都有注释,唯一要说的就是最后一个成员,它表示这个throw出来的object它能转换成哪些其他的object以便被catch语句捕获,你应该要知道catch语句捕获的原则. _CxxThrowException函数是一个外部的函数,它应该由c++的lib提供,它在设置好一些工作以后应该调用os提供的RaiseException的函数,然后os取得控制权,交到应用程序安装的seh handler上面, 那么vc为我们安装的那个函数是什么呢? 它会是一个诸如__ehhandler$_main:这样的函数 它简单的mov eax,__TI1H+48h 然后jmp到一个叫___CxxFrameHandler的函数 这个函数原型如下 int __CxxFrameHandler(struct EHExceptionRecord * pExcept,struct EHRegistrationNode * pRN, ; struct _CONTEXT * pContext,void * pDC)
文档评论(0)