如何捕获access violation异常
文章目录
- access violation的由来
- access violation的实例
- Win32 exception
- SEH异常与C++标准异常
- 捕获方法
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头文件,比如
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异常的更多相关文章
- 动态调用DLL函数有时正常,有时报Access violation的异常
动态调用DLL函数有时正常,有时报Access violation的异常 typedef int (add *)(int a,int b); void test() { hInst=LoadL ...
- ui自动化测试数据复原遇到的坑——2、python连接informix时pytest报致命错误Windows fatal exception: access violation
python连接informix只能通过jdbc(需要先部署java环境.我试过到IBM上下载ODBC但结局是失败的),在执行pytest时发现有一串报错(大致是下面的这样): Windows fat ...
- VS2010程序崩溃,报错Unhandled exception at **.exe:0xC0000005: Access violation reading location 0x000000008899.
最近被派到另外一个组支援,从而从Linux下开发暂转到Windows下开发,个人觉得Windows自己搞的一套并不那么完美,坑多. 网文可能出现的原因: 未处理的异常: 0xC0000005: 读取位 ...
- cout显示Mat类对象报错Access Violation
AV(Access Violation)错误:非法访问. image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation 程 ...
- Access Violation分成两大类:运行期和设计期(很全的解释)
用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因 在启动或关闭Delphi IDE以 ...
- STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission
使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...
- QDomDocument Access violation writing location
今天犯了一个非常2的错误! 为了将面板参数保存起来,选择用QDomDocument构造Dom树,然后用doc.toString()方法返回符合xml格式的QString.如: QString CutF ...
- iOS 捕获系统外异常
iOS 捕获系统外异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太 ...
- Access Violation at address 00000000.Read of address 00000000 解决办法
是数组越标或没有初始化某个对象之类的问题,搂住细细检查一下代码, 使用指针前未做检查,而这个指针未初始化. 可能是new后没有delete,这样出现溢出的可能性比较大 检查代码或者跟踪试试 使 ...
随机推荐
- java获取当前日期等以及时区
代码: public static void main(String[] args) throws Exception{ /* * 获取当前时间的办法 */ //这个获取从1970年..直到现在的毫秒 ...
- SVN has atopping svn已停止工作 or windows资源管理器无限重启
准备在空间时间用用linux,就在自己的win7系统上安装了属性系统,用easyBCD安装的,谁知安装好之后win7系统下的svn客户端不能使用了,点击报错“SVN已停止工作”,随后怀疑是linux引 ...
- Python 之 for循环中的lambda
第一种 f = [lambda x: x*i for i in range(4)] (如果将x换成i,调用时候就不用传参数,结果都为3) 对于上面的表达式,调用结果: >>> f ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...
- 前端模板之EasyUI常用控件及参数
CSS类定义 div easyui-window window窗口样式 属性如下: 1) modal:是否生成模态窗口.true[是] false[否] 2) shadow:是否显示窗口阴影.true ...
- 强大的commons
在此之前对commons包了解的不多,最常用的就是StringUtils.isBlack(str)来取代if(str !=null && str.lenght()>1)的判断,昨 ...
- SqlCommand执行带GO的SQL脚本文件
今天工作中遇到了这个问题,其实只要把GO替换成“;”就行了,其它人写的例子用Split来拆分这一个脚本文件的内容,完全没有必要.希望对你有用.
- 使用JQuery实现手风琴布局
当鼠标在元素上悬停或移出时,可以通过JQuery的hover方法来给元素绑定两个处理方法,前者用于鼠标悬停,后者用于鼠标移出,因此根据这这特点再设置相应元素的css属性后就可以方便的实现手风琴布局,然 ...
- OCR图像识别技术-Asprise OCR
// csc AspriseDemo.cs /r:AspriseOcr.dll // 注意注册:AspriseOCR.InputLicense("123456", "12 ...
- Add Office 365 Azure Directory into Windows Azure
Add Office 365 Azure Directory into Windows Azure Pre-Requisite: 1.Azure Subscription to the Microso ...