Access Violation

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

当你运行程式得到了一个AV(Access Violation)错误的时候,这意味着你的程式正在试图访问一块不再有效的内存,请注意我所提到的“不再 ”有效。大多数的情况下,出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针。

    幸运的是:Win32的内存体系在不同的进程(Process)间使用了独立的地址空间。所以我们可以不必担心会访问到其他的进程中的地址空间而造成破坏,(在Win 16下就有这种潜在的危险).这也就意味着我们能够正确的利用错误对话框中的信息。

    当我们得到一个AV错误对话框的时候,将会出现例如:Av at ddress ????的字样。这个时候把这个地址写下来(如图为:0X4006A620),回到程序中并且打开调试用的CPU窗口,右键选择"Goto Address",你将会发现出错的信息结构。

    当然CPU窗口都是以汇编语言(Assembly)出现的.你可能对此不大熟悉。于是你就可以在窗口中滚动看看到底是哪个函数(funtion)调用了它。这样你就可以在这个地方设置断点了(breakpoint).

不幸的是,不是每个错误都是这么容易的捕捉到的。相对而言。指针问题是很难调试的。这里有个常规的法则就是:在删除指针指向的对象以后。请将它置为NULL 。因此在调用的时候你可以先看看这个指针是否为NULL,如果是NULL,你可以在这个地方输出一些调试信息以方便你在发生AV错误的时候能精确的找到这个地方。

    在VC中调试程序时,Output窗口有时会出现“First-chance exception in xxx.exe...”这样的信息。一般来说,这是由于程序中发生了异常,被VC捕获而产生的输出。
  在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次被通知(即Second-chance exception,Last-chance exception),并结束程序。
 通常见到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,这些都说明程序中有缺陷,需要修正。
  但是也有一些属于正常的情况,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系统中广泛使用了结构化异常(SEH)来处理特殊情况,许多和底层打交道的API都靠SEH来处理可能发生的意外。并且,这些API中都有捕获SEH 的代码,产生的异常不会对程序造成影响。但是由于上面提到的“First-chance exception,Second-chance exception”机制,VC仍然会有输出,但是我们完全可以忽略。如果你实在不喜欢这些输出信息,那你就必须禁用对特定异常的“First- chance exception”捕获。

    在调试状态下,打开debug菜单下的exception对话框,把access violation异常的action改成stop always,这时再出现异常,调试器就会弹出一个对话框报告这个异常,并在异常发生处停下来,而不仅仅是在output窗口中报告first- chance exception,这有助于你定位异常位置。


在编写自己的dll程序的时候,先开始在调用dll的exe上出现 (AVIDLL.DLL): 0xC0000005: Access Violation,不是很明白,为什么会出现这个问题。

在内部进行调试的时候发现,是调用了new操作符的缘故。

很不理解,在dll中调用new操作符会出现这么一个问题,网络上搜索,在微软msdn论坛(具体地址:http://forums.msdn.microsoft.com/zh-CN/vclanguage/thread/951a04be-6b52-4617-b396-9c35e3755759/)上搜索到相关问题。

于是按照说明,将dll的生成方式修改为"共享mfc方式"

         project properties -> general -> Project Defaults->Use of MFC
         To set the properties "Use MFC In A Shared DLL "

 

另外,在网上也发现另外一篇,console方面的, 解决办法:使用c   runtime   library的动态链接版本(在你的console工程中设置忽略所有的默认链接库,然后链接到msvcrt.lib就可以了)(具体地址:http://www.poptool.net/software/p606/A60674501.shtml

 

调试,发现问题解决


在使用C++ Builder的调用VC的DLL的时候遇到了'Access violation at address xxx'的错误,以下是测试程序:

 

C++ Builder代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//---------------------------------------------------------------------------
 
#include <stdio.h>
#include <windows.h>
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
int  __stdcall (*add)( int , int );
int  __stdcall (*sub)( int , int );
 
#pragma argsused
int  main( int  argc, char * argv[])
{
         HMODULE handle = LoadLibrary( "AddFunc.dll" );
         add = GetProcAddress(handle, "Add" );
         sub = GetProcAddress(handle, "Sub" );
 
         printf( "2+3=%d\n" , add(2, 3));
         printf( "100-30=%d\n" , sub(100, 30));
 
         FreeLibrary(handle);
         getchar();
         return  0;
}
//---------------------------------------------------------------------------
?
1
  
?
1
  
?
1
DLL代码:
?
1
.h:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the ADDFUNC_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// ADDFUNC_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef ADDFUNC_EXPORTS
#define ADDFUNC_API extern "C" __declspec(dllexport)
#else
#define ADDFUNC_API extern "C" __declspec(dllimport)
#endif
 
 
ADDFUNC_API int  Add( int  a, int  b);
 
ADDFUNC_API int  Sub( int  a, int  b);

 

.c:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// AddFunc.cpp : Defines the exported functions for the DLL application.
//
 
#include "stdafx.h"
#include "AddFunc.h"
 
 
ADDFUNC_API int  Add( int  a, int  b)
{
     return  (a + b);
}
 
ADDFUNC_API int  Sub( int  a, int  b)
{
     return  (a - b);
}
?
1
  

于是调用就出现了该异常,经过查阅资料得知VC的DLL在export的时候要加上__stdcall的修饰,强制使用WINAPI的导出方式,对两个函数修改为(.h, .c):

?
1
2
3
ADDFUNC_API int  __stdcall Add( int  a, int  b);
 
ADDFUNC_API int  __stdcall Sub( int  a, int  b);

 

结果发现导出的函数发生了变化_Add@4__Sub@4,解决方法是在VC工程中加入一个AddFunc.def,内容如下:

?
1
2
3
4
5
LIBRARY    "AddFunc"
 
EXPORTS
Add @ 1
Sub @ 2

 

至此,解决问题。


Access Violation(非法访问)问题解析 1、Access Violation(非bai法访问),General Protection Fault(一般保护性错误du)或者Invalid Page Fault(无效页面错误),虽然说法不zhi一样,但本质上总是由同一种dao错误引起的。 Access Violation常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到。 Access violation at address <十六进制值> in module <应用程序名> Read of address &l 阅读详情

相关推荐

Access Violation(非法访问)错误的解决方法

Access Violation(非法访问),General Protection Fault(一般保护性错误)或者Invalid Page Fault(无效页面错误),虽然说法不一样,但本质上总是由同一种错误引起的。Access Violation常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到。 Access violation at address in module

crkres9527 6万+

究竟什么是“Access Violation”?如何在设计期避免它的出现?

Windows用户可能经常会看到类似于错误提示:“Error:Access violation at address 836556F8. Read of address 836556F8”。作为一个Delphi程序开发者,遇到这种错误的机会比其他用户更多(^_^)。   究竟什么是“Access Violation”?如何在设计期避免它的出现?   Access Violation(非法访问),G

ou630j的专栏 1910

DELPHI系统运行时,提示“ccess violation at address 00000000 .read of address 00000000”是什么意思?

肯定是引用了 已经释放的资源  检查一下你的代码, 有Free的都看一下。应该不是连接出错好像是你把你的DM保存为单元不要保存为DCU保存好了后再USES。 哦这样你可以用with DM.aq_admin do 或者是 DM.aq_admin.sql 或者是其他的,总的来讲是把DM.来调用Access Violation(非法访问),General Protection Fault(一般保

haibindancao的专栏 1万+

Vivado exception_access_violation

vivado exception_access_violation 的错误 在 vivado工程进行综合Implementation 中会遇到exception_access_violation这个错误 1、解决方法首先关闭所有杀毒软件; 2、打开 win + R 输入msconfig 3、在msconfig的服务中找到FlexNet Licensing Service 64 取消勾选(也就是禁用这个服务)点击 确定 4、重启计算机 ok了 ...

qq_39597489的博客 4564

高手求救:access violation

程序执行时,出现错误:access violation,不知什么原因?请高手指点!

layaming的专栏 773

Runtime Error(ACCESS_VIOLATION)常见解决方法

Runtime Error(ACCESS_VIOLATION)即运行时访问了非法内存导致异常。 在我看来,主要有以下三种情况会导致这种错误: 数组开的不够大,假如题目的数据范围是1e6,而我们如果只开了1e5的数组就会导致这个错误 解决办法:查看题目数据范围和自己所开数组 数组访问异常,有时候即使我们申请的内存是可用的,但在下面访问时不小心访问了所开范围外数组下标 解决办法:把代码认真看一遍 使...

Happig的博客 1万+

EXCEPTION_ACCESS_VIOLATION异常

先记录下来,暂时还没有解决, 开发环境:Tomcat6+eclipse3.5+JDK6 问题描述:Tomcat6在eclipse3.5中没有任何反应,停止服务器,出现如下错误.原因未知. 原因猜测:这种错误由于第一次出现,也不频繁,环境没有任何改动,软件没有升过级,JAVA程序也没有跑,怀疑可能是太长时间没有关过机了- -!.约有3个星期了 错误信息 1 ...

weixin_30621711的博客 5864

Runtime Error (ACCESS_VIOLATION)

Runtime Error(ACCESS_VIOLATION)当出现这种错误时,先看看定义的范围是不是与题目不符,比如题目要求m&lt;1000,定义数组时只定义为a[100],这种错误多次出现。一定要注意题目中数据的范围!如果不是这种错误,还有可能是程序太麻烦,太复杂,如果还不对。。。再想想吧,I don't know....

婳儿的博客 1971

【已解决】Google Chrome 浏览器报错 STATUS_ACCESS_VIOLATION 的解决方案

Chrome浏览器STATUS_ACCESS_VIOLATION错误通常由内存管理问题引起,主要解决方案包括:1)禁用Renderer Code Integrity特性;2)排查扩展程序冲突;3)以管理员身份运行;4)重置用户配置文件;5)兼容模式运行;6)重命名chrome.exe文件;7)检查物理内存。其中修改文件名和添加启动参数是最有效的两种方法。若问题持续,建议尝试Chrome测试版。

欢迎来到我的CSDN个人博客主页! 7519

EXCEPTION_ACCESS_VIOLATION

http://203.208.39.99/search?q=cache:euv39jJOmSoJ:www.pboa.cn/archiver/showtopic-55.aspx+tomcat+EXCEPTION_ACCESS_VIOLATION+(0xc0000005)&hl=zh-CN&ct=clnk&cd=13&gl=cn&st_usg=ALhdy2_cWrH3K_y4YA4PJMfsv93kl

打杂人-aerchi 1万+

CAD报错unhandled access violation之类的错误

CAD报错unhandled access violation之类的错误

qq_42134364的博客 6078

文明6 遇到 EXCEPTION_ACCESS_VIOLATION 报错 的解决方案

文明6 遇到 EXCEPTION_ACCESS_VIOLATION 报错 的解决方案 节约时间直接看具体操作 首先我是收到这个方法的启发找到的解决方案的。 steam上的一个方法 根据这上面说, This usually means that there is a problem with the game reading its allocated memory RAM. And no there is barely any relation to Page Filing because compute

monkey_magician的博客 7万+

零基础理解Access Violation:从错误到修复全指南

Access Violation(访问冲突)是程序试图访问无效内存地址时触发的错误。00000000这个地址通常是空指针(NULL)的表示,意味着程序试图操作一个未分配或已释放的内存区域。这就像是你试图去打开一扇不存在的门——系统不知道你要去哪里,自然就会报错。理解这一点是解决这类问题的第一步。

NightshadeEagle34的博客 1454

【Code】Runtime Error(ACCESS_VIOLATION) 解决方法

在做题过程中,偶尔会遇到Runtime Error(ACCESS_VIOLATION) 的错误提示。 遇到这种运行错误,一般情况下是数组下标越界造成的,只需检查数组开的是否足够大,并将数组范围适当开大即可。

Ljnoit 1406

java EXCEPTION_ACCESS_VIOLATION 错误的一个解决办法

# # A fatal error has been detected by the Java Runtime Environment: # #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x5773f06b, pid=3288, tid=1060 # # JRE version: 7.0-b147 # Java VM: Java H

luguangxu68的专栏 2万+

access violation c语言,请教大家:出现Access violation怎么办?

我修改了一些依然不行;#include#include#includechar len='a'-'A';void trans(char *a){if((*a)>'Z'){*a=*a-len;}} //将输入字母变成大写;void check(char *p){trans(p);char str1[27],str2[26];char...

weixin_33953395的博客 723

什么是Access Violation?我该如何调试它

什么是AV错误?我该如何调试它? 当你运行程式得到了一个AV(Access Violation)错误的时候,这意味着你的程式正在试图访问一块不再有效的内存,请注意我所提到的“不再”有效。大多数的情况下,出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针。幸运的是:Win32的内存体系在不同的进程(Process)间使用了独立的地址空间。所以我们可以

龙虾的博客 1万+
上一篇: Security of ActiveX Controls
下一篇: Calling C++ DLLs from C++ Application Using VS2020
meander
博客等级 码龄18年 153粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值