zoukankan      html  css  js  c++  java
  • 如何捕获access violation异常

    文章目录

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

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

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

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

    2. access violation的实例

     示例1:对空指针进行赋值

    1 char * p=NULL; 
    3 p="abcd"; 

    示例2:修改只读内存

    1  char * sss="abcd";
    2  sss[0]='A'; //sss指向只读区域,不可改写
    3.Win32 exception

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

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

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

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

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

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

    G:Program FilesMicrosoft SDKsWindowsv7.0AInclude tstatus.h。
    更多关于Win32异常的理解参见CodeProject上的文章:
    http://www.codeproject.com/Articles/82701/Win32-Exceptions-OS-Level-Point-of-View
    4.SEH异常与C++标准异常

    (1)C++标准异常在Windows上的实现依赖SEH异常。

    (2)SEH异常是通过Windwos API ,RaiseException抛出的,每个不同的异常,规定了不同的异常代码。比如access violation,

    异常代码是c0000005。

    (3)C++标准异常在底层也是通过RaiseException抛出(throw内部调用RaiseException)的,但是他的异常代码都是相同的,都是0xE06D7363,对应的“.msc”的ASCII码。当一个SEH异常抛出时,如果它的异常代码是0xE06D7363,就会被认定为C++标准异常,程序转交给C++异常处理机制,C++语言在这个之后,依据异常的类型,再进行C++层次的异常处理。

    总结:

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

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

    5.捕获方法

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

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

    • VC++6.0 try catch默认可以捕获SEH
    • VC++8.0 默认不可以,开启/EHa编译命令后可以

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

  • 相关阅读:
    WCF进阶01 服务配置
    资源学习备忘 04
    .NET IoC主流框架 01:Castle Windsor Registering components onebyone
    IIS URL重写模块和ASP.NET路由组件比较
    资源学习备忘 03
    开源组件DockPanel Suite使用
    Dockable Window开源组件分享
    WCF进阶02 服务承载
    Prometheus 初探和配置(安装测试)
    TF31003错误的解决办法
  • 原文地址:https://www.cnblogs.com/meiwlongblog/p/3528479.html
Copyright © 2011-2022 走看看