- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
A Crash Course on the Depths of Win32 Structured Exception Handling
Matt Pietrek 著
董岩 译
在所有 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(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext
);
这个函数原型来自标准 Win32 头文件 EXCPT.H ,初看上去让人有点眼晕。如果慢慢看的
话,似乎情况还没那么严重。对于初学者来说,大可以忽略返回值的类
型 (EXCEPTION_D
您可能关注的文档
- 1医药行业研究报告-2012.8.9外文电子书籍.ppt
- A Concurrent Model for Linear Logic外文电子书籍.pdf
- A fuzzy hierarchy integral外文电子书籍.pdf
- A Practical Guide to Training RBM外文电子书籍.pdf
- Android用户界面外文电子书籍.pdf
- Crockett(2010)Emotion外文电子书籍.pdf
- Deep unsupervised learning on a desktop PC a primer for connitive scientist外文电子书籍.pdf
- demographic cliff外文电子书籍.pdf
- Design of Fuzzy Logic Controller for Two-wheeled Self-balancing Robot外文电子书籍.pdf
- Discriminative RBM are universal approximators for Discrete Data外文电子书籍.pdf
最近下载
- 作业设计研讨活动记录.doc
- 2025国家电投校园招聘笔试备考题库及答案解析.docx
- 2021-2022学年五年级上学期综合实践活动(劳动教育)第6课巧做糖画教案.docx
- 创业意识与创业技巧:了解企业登记注册流程.pptx
- 山东省淄博市2023年高一上学期《英语》期中试卷与参考答案.pdf
- 大学生职业规划大赛成长赛道 (修订).pptx
- 2018重庆市建设工程混凝土与砂浆配合比表.pdf
- WhyNothingWorks.doc VIP
- 住院医师规范化培训基地标准(2022年版)--皮肤科专业基地细则.docx
- JB∕T 2436.2-2020 导线用铜压接端头 第2部分:10mm2~300mm2导线用铜压接端头.pdf
文档评论(0)