无法在 C# 中捕获 0xC0000005 异常

Posted

技术标签:

【中文标题】无法在 C# 中捕获 0xC0000005 异常【英文标题】:Can't catch 0xC0000005 exception in C# 【发布时间】:2012-06-15 18:14:10 【问题描述】:

我的 C#.Net 程序出现以下异常:

System.Data.dll 中发生了“System.Data.SqlClient.SqlException”类型的第一次机会异常 myapp.exe 中 0x000007feff75121b 的第一次机会异常:0xC0000005:访问冲突读取位置 0x0000000000000000。 CustomMarshalers.dll 中出现了“System.AccessViolationException”类型的第一次机会异常 CustomMarshalers.dll 中出现“System.AccessViolationException”类型的未处理异常 附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

我在 try/catch(Exception) 块中得到它,但它从未被捕获。

我正在尝试调试它以了解它发生的原因,但如果不抓住它就很难做到这一点。

是否可以在 C#.Net 中捕获 0xC0000005 异常? (Windows 2008 R2 上的框架 4.0)。

感谢任何提示。

【问题讨论】:

异常是SqlException,可能是由于尝试取消引用空指针引起的。 这是一个访问冲突异常。查看此回复:***.com/questions/3469368/… 【参考方案1】:

默认情况下,您无法捕获 AccessViolationException,因为它表示尝试读取或写入受保护的内存。不过,您可以将[HandleProcessCorruptedStateExceptions] 属性添加到它发生的方法中:

默认情况下,公共语言运行时 (CLR) 不会将这些异常传递给托管代码,并且 try/*catch* 块(以及其他异常处理子句)不会为它们调用。如果您绝对确定要保持对这些异常的处理,则必须将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于要执行其异常处理子句的方法。 CLR 仅在具有 HandleProcessCorruptedStateExceptionsAttribute 和 SecurityCriticalAttribute 属性的方法中将损坏的进程状态异常传递给适用的异常子句。

【讨论】:

这个答案很有用,谢谢。我知道那是很久以前的事了,但是当您说“如果您绝对确定要处理这些异常”时,添加 [HandleProcessCorruptedStateExceptions] 属性对性能有什么不利影响吗?

以上是关于无法在 C# 中捕获 0xC0000005 异常的主要内容,如果未能解决你的问题,请参考以下文章

来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005

java - 来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005

使用异常代码从窗口服务获取错误:0xc0000005

Project3.exe 中 0x00C61540 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000003

task2.exe 中 0x001066F6 处未处理的异常:0xC0000005:访问冲突读取位置 0x0000000C [关闭]

C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突