文章目录

  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:对空指针进行赋值

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

示例2:修改只读内存

  char * sss="abcd";
sss[]='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 Files\Microsoft SDKs\Windows\v7.0A\Include\ntstatus.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,记录错误的异常代码,调用堆栈。

如何捕获access violation异常的更多相关文章

  1. 动态调用DLL函数有时正常,有时报Access violation的异常

    动态调用DLL函数有时正常,有时报Access violation的异常 typedef int (add *)(int a,int b); void test() {     hInst=LoadL ...

  2. ui自动化测试数据复原遇到的坑——2、python连接informix时pytest报致命错误Windows fatal exception: access violation

    python连接informix只能通过jdbc(需要先部署java环境.我试过到IBM上下载ODBC但结局是失败的),在执行pytest时发现有一串报错(大致是下面的这样): Windows fat ...

  3. VS2010程序崩溃,报错Unhandled exception at **.exe:0xC0000005: Access violation reading location 0x000000008899.

    最近被派到另外一个组支援,从而从Linux下开发暂转到Windows下开发,个人觉得Windows自己搞的一套并不那么完美,坑多. 网文可能出现的原因: 未处理的异常: 0xC0000005: 读取位 ...

  4. cout显示Mat类对象报错Access Violation

    AV(Access Violation)错误:非法访问. image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation 程 ...

  5. Access Violation分成两大类:运行期和设计期(很全的解释)

    用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以 ...

  6. STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission

    使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...

  7. QDomDocument Access violation writing location

    今天犯了一个非常2的错误! 为了将面板参数保存起来,选择用QDomDocument构造Dom树,然后用doc.toString()方法返回符合xml格式的QString.如: QString CutF ...

  8. iOS 捕获系统外异常

    iOS 捕获系统外异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太 ...

  9. Access Violation at address 00000000.Read of address 00000000 解决办法

    是数组越标或没有初始化某个对象之类的问题,搂住细细检查一下代码, 使用指针前未做检查,而这个指针未初始化. 可能是new后没有delete,这样出现溢出的可能性比较大     检查代码或者跟踪试试 使 ...

随机推荐

  1. (PHP)程序中如何判断当前用户终端是手机等移动终端

    推荐: Mobile-Detect:https://github.com/serbanghita/Mobile-Detect/blob/master/Mobile_Detect.php Detect ...

  2. [Mongdb] 关于Replica Set复制集奇数成员限制的解释--待完善

    一.缘由: http://blog.itpub.net/29254281/viewspace-1176821/ http://blog.chinaunix.net/uid-20726500-id-54 ...

  3. jsoncpp初使用

    一 前言 由于最近一个c++项目需要使用json这种数据格式来传输数据, so上网去寻找合适的类库,毕竟对于这种不是很新的技术, 自己造轮子有点得不偿失. 从百度上翻了翻, 基本上就boost跟jso ...

  4. 查看regulator的信息

    例如,查看ldo6 /sys/devices/soc.0/qcom,rpm-smd.35/rpm-regulator-ldoa6.85/regulator-l6.110/regulator/regul ...

  5. 02-C#入门(循环)

    记得第一次学编程的时候,就听说过一句话:“新手学习和掌握一门编程语言是很容易的,但是如果你学会了某种编程语言,再去学习新的语言,就很难掌握了”,现在深深地感受到了这方面的阻力. 其实流程控制.循环,包 ...

  6. xcode 工具学习笔记

    1. 快速打开辅助界面   快捷键:使用Option + 单击文件   2. 辅助编辑器更多打开方式   快捷键: Option+shift +单击文件   3. tab页面快捷键   快捷键: Co ...

  7. 【原】redis插件安装

    wget -c https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz -O phpredis-2.2.4.tar.gz tar xzf ...

  8. 无需写try/catch,也能正常处理异常 (转)

    原文地址: http://www.cnblogs.com/artech/archive/2012/10/28/automatic-exception-handling-aspnet.html 对于企业 ...

  9. ZOJ 1958. Friends

    题目链接: ZOJ 1958. Friends 题目简介: (1)题目中的集合由 A-Z 的大写字母组成,例如 "{ABC}" 的字符串表示 A,B,C 组成的集合. (2)用运算 ...

  10. Webpack 入门指南 - 2.模块

    这一次我们谈谈模块问题. 通常我们希望这个项目可以分为多个独立的模块,比如,上一次提高的 hello 函数,如果我们定义为一个模块,其它模块引用之后,直接调用就好了.在前端怎么使用模块呢?这可说来话长 ...