seb*_*ebf 34 windows winapi exception
我想知道异常0xc0000005以及它实际包含的内容.
即如果应用程序试图访问属于另一个进程的释放内存/内存,则会发生这种情况.
但是,例如,为硬件映射的地址呢?或者有效范围之外的地址?是否尝试使用相同的代码访问这些错误,或者他们是否拥有自己的错误?这是否包括对进程拥有的有效地址的读取失败?
基本上我想知道什么时候应用程序失败了这个例外,可能出了什么问题; 这是一个狭隘的错误,只能来自应用程序.代码还是我在看任何东西,包括硬件问题?
(我知道必须有一个MSDN页面,但搜索谷歌或MSDN会带来预期的100页故障排除随机应用程序;))
谢谢!
Han*_*ant 39
您需要阅读处理器手册以向下钻取.它由"陷阱"触发,最好在处理器中描述为异常.陷阱中断代码执行并让操作系统"catch"处理程序处理错误.一个非常常见的良性问题是页面错误,当处理器尝试从尚未映射的RAM读取数据时引发.这就是虚拟内存的实现方式.
AccessViolation属于一组陷阱,这些陷阱是操作系统不知道如何处理的硬错误.它在处理器手册中称为"常规保护错误".它有点像抓包,有很多方法可以触发GPF.到目前为止,最常见的是尝试读取未映射的内存,通常是由堆内存损坏引起的.然后尝试执行无效的机器代码指令,或者只能由特权代码执行,通常由堆栈内存损坏引起.
这些陷阱就像它们来的一样令人讨厌,处理器根本无法继续执行程序.操作系统肯定不知道如何处理它,它引发了一个AccessViolation异常,让程序可以将处理器重新调回已知良好的代码.可以__try/__except在代码中使用关键字.btw不是一个好主意,除了自定义错误报告之外,你还不知道你的程序状态在它死之前是如何变异的,因此无法恢复它.
如果没有这样的SEH处理程序,最终会出现在Windows提供的支持中.您可以使用SetUnhandledExceptionFilter()提供自己的功能,这对于自定义崩溃报告非常有用.系统提供的一个通过触发WER(Windows错误报告组件)来结束它.这最终终止了这个过程.
Ben*_*igt 18
首先,您需要了解用户模式进程中的地址是虚拟地址.它们不是用于访问硬件的实际地址.相反,在CPU(存储器管理单元的一部分)中存在虚拟到物理转换电路,其在"转换后备缓冲器"中找到匹配的条目.在每个上下文切换期间,OS使用属于您的进程的内存映射填充TLB.
因此,无法尝试访问属于其他进程的内存,也无法尝试访问硬件.并不是检测到此访问并且失败,而是不存在不属于您的程序的内存映射.
如果你的程序访问的地址没有映射到任何地方,那么汉斯说会发生一个陷阱.这与"页面错误"和"访问违规"的陷阱相同.首先,操作系统将检查地址是否有效但不在TLB中(例如,您的PC内存不足,而某些地址已交换到磁盘).在这种情况下,操作系统会将数据移回物理RAM,在TLB中设置正确的映射,然后继续运行程序.如果操作系统确定地址完全无效(没有与之关联的交换位置),则会生成"访问冲突"(Windows命名)或"分段错误"(POSIX命名).
通常原因是一个逻辑错误,但是如果你的某个指针中的RAM故障发生了一些变化,那么硬件故障也可能触发访问冲突.
| 归档时间: |
|
| 查看次数: |
41431 次 |
| 最近记录: |