Access Violation'0xc0000005'的范围究竟是什么?

时间:2011-03-14 19:36:56

标签: windows winapi exception

我想知道异常0xc0000005以及它实际包含的内容。

即。我认为如果应用程序试图访问属于另一个进程的释放内存/内存,就会发生这种情况 但是,例如,为硬件映射的地址呢?或者有效范围之外的地址?是否尝试使用相同的代码访问这些错误,或者他们是否拥有自己的错误? 这是否包括对进程拥有的有效地址的读取失败?

基本上我想知道应用程序何时因此异常而失败,可能出现了什么问题;这是一个狭隘的错误,只能来自应用程序。代码还是我在查看任何内容并包括硬件问题?

(我知道必须有一个MSDN页面,但搜索谷歌或MSDN会带来预期的100页故障排除随机应用程序;))

谢谢!

3 个答案:

答案 0 :(得分:36)

您需要阅读处理器手册以向下钻取。它由“陷阱”触发,最好在处理器中描述为异常。陷阱中断代码执行并让操作系统“catch”处理程序处理错误。一个非常常见的良性问题是页面错误,当处理器尝试从尚未映射的RAM读取数据时引发。这就是虚拟内存的实现方式。

AccessViolation属于一组陷阱,这些陷阱是操作系统不知道如何处理的硬错误。它在处理器手册中称为“常规保护错误”。它有点像抓包,有很多方法可以触发GPF。到目前为止,最常见的是尝试读取未映射的内存,通常是由堆内存损坏引起的。然后尝试执行无效的机器代码指令,或者只能由特权代码执行,通常由堆栈内存损坏引起。

这些陷阱和它们一样令人讨厌,处理器根本无法继续执行程序。操作系统当然不知道如何处理它,它引发了一个AccessViolation异常,让程序可以将处理器重新调回已知良好的代码。可以在代码中使用__try/__except关键字。 btw不是一个好主意,除了自定义错误报告之外,你还不知道你的程序状态在它死之前是如何变异的,因此无法恢复它。

如果没有这样的SEH处理程序,最终会出现在Windows提供的支持中。您可以使用SetUnhandledExceptionFilter()提供自己的,以便自定义崩溃报告。系统提供的一个通过触发WER(Windows错误报告组件)来结束它。这最终会终止这个过程。

答案 1 :(得分:15)

首先,您需要了解用户模式进程中的地址是虚拟地址。它们不是用于访问硬件的实际地址。相反,在CPU(存储器管理单元的一部分)中存在虚拟到物理转换电路,其在“转换后备缓冲器”中找到匹配的条目。在每次上下文切换期间,操作系统使用属于您的进程的内存映射填充TLB。

因此无法尝试访问属于其他进程的内存,也无法尝试访问硬件。并不是检测到此访问并且失败,而是不存在不属于您的程序的内存映射。

如果你的程序访问的地址没有映射到任何地方,那么就会出现陷阱,汉斯说。这与“页面错误”和“访问违规”的陷阱相同。首先,操作系统将检查地址是否有效但不在TLB中(例如,您的PC内存不足,而某些地址已交换到磁盘)。在这种情况下,操作系统会将数据移回物理RAM,在TLB中设置正确的映射,然后继续运行程序。如果操作系统确定该地址完全无效(没有与之关联的交换位置),则会生成“访问冲突”(Windows命名)或“分段错误”(POSIX命名)。

通常原因是一个逻辑错误,但如果你有例如RAM故障在您的一个指针中发生了一些变化,硬件故障也可能触发访问冲突。

答案 2 :(得分:1)

我在谷歌上获得了this作为“访问冲突”(没有引号)的第一个结果。我不确定具体细节,但AV只是意味着:处理器试图读取或写入其当前状态不允许的特定地址。它可能是硬件问题,总线错误,未映射的虚拟内存,坏CPU;几乎任何表明违反访问保护的行为。