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

我想知道exception0xc0000005和它acctually包含。

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

基本上我想知道什么时候一个应用程序失败,这个例外,可能出了什么问题; 这是一个很小的错误,只能来自应用程序。 代码还是我在看什么和包括硬件问题?

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

谢谢!

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

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

这些陷阱和他们一样讨厌,处理器根本无法继续执行程序。 操作系统当然不知道如何处理它,它引发了一个AccessViolation异常,使得程序能够将处理器抽回到已知好的代码中。 可以在你的代码中使用__try/__except关键字。 不是一个好主意btw,除了自定义错误报告,你没有真正的想法如何你的程序的状态发生变化之前死亡,因此没有办法恢复它。

没有这样的SEH处理程序,这最终会导致Windows提供的支持。 你可以用SetUnhandledExceptionFilter()来提供你自己的,这对定制崩溃报告很有用。 系统提供的一个通过触发WER(Windows错误报告组件)来结束它。 这最终终止了这个过程。

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

所以没有办法尝试访问属于其他进程的内存,也不能尝试访问硬件。 这并不是说这个访问被检测到并失败了,而是不存在不属于你的程序的内存映射。

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

通常原因是一个逻辑错误,但是如果你有一个内存错误在你的指针中改变了一点,那么硬件错误也会触发一个访问冲突。

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