- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入研究_Win32_结构化异常处理.pdf
深入研究 Win32 结构化异常处理
本文关键字:SEH, Windows, VisualC
摘要
就像人们常说的那样,Win32 结构化异常处理 (SEH)是一个操作系统提供的服务。你能找到的所有关
于 SEH 的文档讲的都是针对某个特定编译器的、建立在操作系统层之上的封装库。我将从 SEH 的最
基本概念讲起。
Matt Pietrek 著
董岩 译
Victor 转载自 Xfocus 并整理
在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理
(structured exception handling,SEH )了。一提到结构化异常处理,可能就会令人想起 _try 、_finally 和
_except 之类的词儿。在任何一本不错的 Win32 书中都会有对 SEH 详细的介绍。甚至连 Win32 SDK 里
都对使用 _try 、_finally 和 _except 进行结构化异常处理作了完整的介绍。既然有这么多地放都提到了
SEH,那我为什么还要说它是未公开的呢?本质上讲,Win32 结构化异常处理是操作系统提供的一种服
务。编译器的运行时库对这种服务操作系统实现进行了封装,而所有能找到的介绍 SEH 的文档讲的都是
针对某一特定编译器的运行时库。关键字 _try 、_finally 和 _except 并没有什么神秘的。微软的 OS 和
编译器定义了这些关键字以及它们的行为。其它的 C++ 编译器厂商也只需要尊从它们定好的语义就行
了。在编译器的 SEH 层减少了直接使用纯操作系统的 SEH 所带来的危害的同时,也将纯操作系统的
SEH 从大家的面前隐藏了起来。
我收到过大量的电子邮件说他们都需要实现编译器级的 SEH 但却找不到公开的文档。本来,我可以指着
Visual C++ 和 Borlang C++ 的运行时库的源代码说看一下它们就行了。但是,不知道是什么原因,编译
器级的 SEH 仍是个天大的秘密。微软和 Borland 都没有提供 SEH 最内层的源代码。
在本文中,我会从最基本的概念上讲解结构化异常处理。在讲解的时候,我会将操作系统所提供的与编
译器代码生成和运行时库支持的分离开来。当深入关键性操作系统程序的代码时,我基于的都是 Intel 版
的 Windows NT 4.0 。然而。我所讲的大部分内容同样适用于其它的处理器。
我会避免提及实际的 C++ 的异常处理,C++ 下用的是 catch() 而不是 _except 。其实,真正的 C++ 异
常处理的实现方式和我所讲的方式也是极为相似的。但是,真正 C++ 异常处理特有的复杂性会影响到我
这里所讲的概念。对于深挖那些晦涩的 .H 和 .INC 文件并拼凑出 Win32 SEH 的相关代码,最好的一个
信息来源就是 IBM OS/2 的头文件 (特别是 BSEXCPT.H )。这对有相关经验的人并没什么可希奇的,
这里讲的 SEH 机制在微软开发 OS/2 时就定义了。因此,Win32 的 SEH 与 OS/2 的极为相似。
SEH in the Buff
若将 SEH 的细节都放到一起讨论,任务实在艰巨,因此,我会从简单的开始,一层一层往深里讲。如果
之前从未使用过结构化异常处理,则正好心无杂念。若是用过,那就要努力将 _try 、GetExceptionCode 和
EXCEPTION_EXECUTE_HANDLER 从脑子中扫出,假装这是一个全新的概念。Are you ready ?Good。
当线程发生异常时,操作系统会将这个异常通知给用户使用户能够得知它的发生。更特别的是,当线程
发生异常时,操作系统会调用用户定义的回调函数。这个回调函数想做什么就能做什么。例如,它可以
修正引起异常的程序,也可以播放一段 .WAV 文件。无论回调函数干什么,函数最后的动作都是返回一
个值告诉系统下面该干些什么 (这样说并不严格,但目前可以认为是这样)。既然在用户代码引起异常
后,操作系统会回调用户的代码,那这个回调函数又是什么样的呢?换句话说,关于异常都需要知道哪
些信息呢?其实无所谓,因为 Win32 已经定义好了。异常的回调函数的样子如下:
EXCEPTION_DISPOSITION
__cdecl _except_handler(
文档评论(0)