尝试读取或写入受保护的内存。这通常意味着其他内存已损坏。

203
我希望有人能告诉我可能是什么原因导致了这个错误:
尝试读取或写入受保护的内存。这通常表明其他内存已经损坏。
我无法贴出代码,因为这个错误似乎会在应用程序的任何随机区域抛出。应用程序会在运行12-48小时后抛出该错误。有时它会停止在一个看似随机的地方并抛出上述错误,其他时候整个应用程序都会停止,并显示一个错误屏幕,上面显示类似于“...中发生了致命错误。这可能是CLR中的一个漏洞或...”之类的信息,还有一些与PInvoke或其他不相关的信息。当这种情况发生时,所有线程都被终止,没有调试信息可用。
简而言之,这就是该应用程序的功能:
这是一个完全用C#编写的多线程服务器应用程序。客户端通过socket连接到服务器。服务器为客户端运行一个虚拟的“环境”,客户端可以在其中相互交互。它消耗相当多的内存,但我没有看到内存泄漏。它通常使用约1.5GB。我认为它没有泄漏,因为内存使用量在应用程序运行期间始终保持相对恒定。即使客户端没有做任何事情,它也会不断运行代码以维护环境。它不使用任何第三方软件或其他API。此应用程序使用的唯一外部资源是socket连接和SQL数据库连接。它在64位服务器上运行。我尝试过在VS2008和VS2010中使用.net 2.0、3.5和4.0进行调试,并在多个服务器上运行,但问题最终仍然会出现。
我尝试关闭编译器优化和几个Microsoft热修复。但是似乎没有任何方法可以解决这个问题。如果有人知道可能的原因或一些识别问题根源的方法,将不胜感激。

请提供完整的调用堆栈... - Mitch Wheat
可能是Troubleshooting .NET "Fatal Execution Engine Error"的重复问题。 - Hans Passant
没有COM或ActiveX组件。 - Someone Else
我也有这个问题。我正在使用Paradox 5.x、.NET 3.5和Sage数据对象(COM组件),它会随机发生,我找不到它的规律。我认为这只是COM组件中一些瑕疵代码的问题。 - Larry
您也可以通过访问被某些东西锁定的资源来获取它,例如已经打开的 Excel 文件。我将此发布为答案,因为这是我的问题。 - Sonic Soul
显示剩余3条评论
33个回答

72

我刚刚在使用VS 2013 .NET 4.5时遇到了这个问题,与MapInfo DLL有关。结果发现,问题出在我将生成平台从x86更改为Any CPU,这就足以触发此错误。将它改回x86就可以解决问题。可能对某些人有帮助。


1
你是如何使用x86将其改回去的?我遇到了与这个指令CSingleLock lock(&m_csMember, TRUE);相同的问题。更多细节请参见我的帖子 - ABCmo
在VS 2012/2013中,转到项目属性->生成并将“平台目标”更改为您需要的任何内容。虽然我认为还有另一个地方可以更改这个设置,但我似乎找不到它,我认为两种方法都应该能够实现相同的结果。 - Sergey
我实际上正在使用VS 2013,并且它配置为x86 :/ - ABCmo
1
你的问题可能由许多因素引起,我真的很惊讶,通过更改构建平台解决了我的问题。你可以说是幸运的逃脱。 - Sergey
这个解决方案与这个答案的结合,为我解决了这个问题。 - Zach Olivare

41

我在使用Visual Studio (VS) 2010时遇到了这个问题。有趣的是,我的解决方案中有几种类型的项目,包括控制台应用程序项目、WPF应用程序项目、Windows窗体应用程序项目等等。但只有当我将控制台应用程序类型的项目设置为解决方案的启动项目时,它才会失败。所有项目都是完全空的。它们没有用户代码或任何第三方程序集作为引用。所有项目仅引用.NET基类库(BCL)的默认程序集,这些程序集随项目模板本身一起提供。

如何解决这个问题?

进入控制台应用程序项目的项目属性(或者您可以在解决方案资源管理器中选择项目文件,然后按Alt+Enter键组合)> 转到调试选项卡>启用调试器部分下选中启用非托管代码调试复选框(参见屏幕截图)> 单击工具栏中的Floppy按钮保存项目属性。

enter image description here

我不知道问题的根本原因。我只观察到前一晚有很多Windows更新安装在我的机器上。所有的更新主要包括办公软件和操作系统的更新(超过十几个KB文章)。

更新:从VS 2017开始,设置名称已更改为启用本机代码调试。它位于调试引擎部分(参考截图):

enter image description here

更新2(2023年4月22日):在VS 2022中,它可以在Debug选项卡的调试器引擎部分中使用(参见截图):

enter image description here


你能告诉我在VS 2022中哪里可以找到这些复选框吗? - MJBZA
1
亲爱的 @MJBZA,我已经添加了 VS 2022 的截图。希望这可以帮到你。 - RBT

31

问题可能是因为项目中混合了不同的构建平台DLL。即,您将项目构建为任意CPU,但已经为x86平台构建了一些DLL。这会导致随机崩溃,因为32位和64位架构的内存映射不同。如果所有的DLL都是为一个平台构建的,问题可以得到解决。


25

在WinDBG和SOS的帮助下,最终找到了问题根源。一个未知的DLL抛出了访问冲突异常。原来一款名为"Nvidia Network Manager"的软件导致了这个问题。我曾经看过无数遍,说这个问题可能是由于防火墙或杀毒软件引起的,但我没有使用这些软件,所以我忽略了这个想法。而且,我认为这不是环境因素造成的,因为在使用不同硬件的多台服务器上都出现了这个问题。结果发现,我测试过的所有机器都安装了"Nvidia Network Manager"。我认为它是与其他主板驱动程序一起安装的。

希望这能帮助有需要的人,因为这个问题一直困扰着我的应用程序很长时间。


1
在我的情况下,当我频繁从设备读取数据时,会抛出错误,因此我需要停止线程一段时间,使用Thread.Sleep(1000)进行下一次读取,这样就可以完美地工作了。 - J R B
9
我会假设解决方法是“卸载Nvidia网络管理器”。 - paulm
100
得票最高的答案没有提供任何合乎逻辑的答案。 - Teoman shipahi
我怀疑我的主板或软件与Nvidia无关。我正在使用Visual Studio 2010。问题只在从VS调试项目时发生。从debug文件夹中输出的exe完美运行。 - RBT
1
我正在访问自己进程的线程,这是导致问题的原因。 - Muhammad Saqib
重启电脑对我来说起作用了。 - Muhammad Saqib

14

10

这个错误不应该发生在托管代码中。尝试以下方法来解决问题:

打开 Visual Studio 调试器以绕过此异常:


Tools menu -> Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

希望这能有所帮助。


3
很抱歉它对你没有起作用。这个错误会因为很多原因而出现,我认为,我发布的解决方案,如果问题是JIT优化引起的,可能会为其他人解决问题。 - curiousBoy

8

当我在使用PInvoke调用一个需要传入StringBuilder引用的方法时,遇到了这个错误。我使用了默认构造函数,但它只分配了16个字节。Windows试图将超过16个字节的数据放入缓冲区,导致了缓冲区溢出。

应该使用

StringBuilder windowText = new StringBuilder(); // Probable overflow of default capacity (16)

使用更大的容量:

StringBuilder windowText = new StringBuilder(3000);

6

5

最近我更换了一个项目的开发服务器,出现了这个问题。在声明一个新的OracleConnection变量的代码行上,我遇到了这个错误。

尝试了很多方法,包括安装hotfixes,然后我尝试更改项目中的引用Oracle.DataAccess和System.Data.OracleClient,这样就解决了问题!

当一个项目被移动到一个新的机器上时,我建议您更新该项目中添加的所有引用。


5

可能是硬件问题。也可能是一些复杂的问题...但我建议你检查一下你的线程代码是否使用了适当的锁来保护某些集合(例如字典)。

你正在运行哪个操作系统和服务包?


2
正在运行XP 64 SP2。尽管如此,这已经发生在多个服务器上了。我已经检查了很多次,没有看到任何不是线程安全的东西。而且我不会得到一个集合修改错误而不是访问冲突吗? - Someone Else

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接