如何捕获access violation异常

时间:2014-01-21 21:14:38   收藏:0   阅读:553

文章目录

  1. access violation的由来
  2. Win32 exception
  3. SEH异常与C++标准异常
  4. 捕获方法

 

1.access violation的由来

access violation,字面意思就是试图访问不可访问的内存。比如给一个标记为NULL的指针赋值。

通常这个异常在C++中会引起程序崩溃,并提示“异常代码:c0000005”。这个异常属于Windows操作系统定义的硬件异常,

参见MSDN关于硬件异常的说明:http://msdn.microsoft.com/zh-cn/Library/w49wew4f.aspx。

2.Win32 exception

说到win32 exception,就要了解Windows提供的SEH(Structured Exception Handling)服务。

简单的说,SEH服务是Windows作为操作系统,为了适配各种CPU和其他底层软件,向上层应用程序

提供的一种统一的异常服务。

SEH的异常包括了软件异常和硬件异常。

像access violation ,除0这些就属于硬件异常。

关于windows操作系统异常的定义,可参见microsoft sdk中的ntstatus.h头文件,比如

G:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\ntstatus.h。
更多关于Win32异常的理解参见CodeProject上的文章:
http://www.codeproject.com/Articles/82701/Win32-Exceptions-OS-Level-Point-of-View
3.SEH异常与C++标准异常

异常代码是c0000005。

总结就是:C++异常是底层是通过SEH异常服务实现的,是SEH异常的一种。C++语言的标准异常处理机制是在收到SEH抛出的

异常之后,在C++语言层实现的异常处理服务。SEH异常是通过异常代码来标记异常的,C++标准异常是通过异常数据类型来区分异常的。

4.捕获方法

try()catch()是C++提供的异常处理机制,不能捕获SEH异常,因为只有异常代码0xE06D7363为的SEH异常,才会转交给

C++标准异常处理。但是在VC编译器下,依据版本的不同会有变化。

__try()__except()是微软提供用于捕获SEH异常的机制,在VC编译器中实现。详细可以参见msdn关于__try()__except()的说明,这样,我们就可以抓取access violation这样的异常了,并且可以使用GetErrorCode()等这些WinAPI,记录错误的异常代码,调用堆栈。

原文:http://www.cnblogs.com/meiwlongblog/p/3528479.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!