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

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个回答

1
这个问题几乎总是一个简单的问题。代码有问题。从统计分析来看,很少是工具的问题。数百万人每天都在使用Visual Studio,而只有一小部分人在使用你的代码——哪一部分代码得到了更好的测试?我保证,如果这是VS的问题,我们可能已经找到了它。
这个声明的意思是,当你尝试访问不属于你的内存时,通常是因为你正在使用来自其他地方的损坏指针。这就是为什么它陈述了这个迹象。
对于内存损坏,错误的捕获很少接近错误的根本原因。而且影响正是你所描述的,看起来是随机的。你只需要查看通常的罪魁祸首,比如:
- 未初始化的指针或其他值。 - 写入超过其大小的缓冲区。 - 被线程共享但没有受互斥保护的资源。
从这样的问题向后工作以找到根本原因是非常困难的,因为在问题创建和检测之间可能发生了很多事情。

我发现,更容易的方法是查看哪些地方是有问题的(例如一个特定的指针),然后对代码进行手动静态分析,查看可能导致问题的原因,检查如上所示的常见问题。但是,即使这样也无法捕捉到长时间的问题链。

我不熟悉VS,但您也可以考虑使用内存跟踪工具(例如Linux上的valgrind)来查看是否可以发现任何明显的问题。


3
你也可能从坏内存中得到一个损坏的指针。如果这不是在具有ECC内存的服务器上发生,请尝试运行长时间的内存测试实用程序以排除硬件问题。 - cdonner
13
我知道这不是硬件问题,因为它在多台服务器上都发生过。感谢明示代码中存在问题,这是显而易见的。我并不怪 Visual Studio。正如所述,该应用程序在随机一段时间内运行良好。它不容易重现,我已经试图找出问题已经有几周了。 - Someone Else
6
我不认为使用侮辱性语言会给你带来太多帮助。 - Mitch Wheat
5
为什么这个答案还在?令人失望的回答,方法不正确,无端揣测,未经证实的假设,没有提供解决方案……有哪三个人会点赞这个答案? - ThunderGr
2
我正在寻找解决方案,以解决OP发布的问题,而不是提供解决方案。其他每个答案都为经历过该问题的人提供了可行的解决方案。不幸的是,正如您所说,这并不是“糟糕的代码”,它可能不是Visual Studio本身的问题,而是.Net在访问冲突发生时未能提供有意义的东西的问题。我们没有责任知道.Net如何与机器中存在的各种.dll进行交互,这些.dll与我们的代码无关。因此,您的假设和推测是错误和无益的。 - ThunderGr
显示剩余10条评论

1

在尝试编译前一天完美构建的项目时,我在VS1017中随机遇到了这个错误。重新启动电脑解决了这个问题(我之前也运行了以下命令,不确定是否必须:netsh winsock reset)。


1
这正是我在使用VS 2017时遇到的情况 - System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 我只需重新启动电脑即可解决此问题,无需进行其他操作。 - Hong

1
在我的情况下,我需要使用P/Invoke引用一个C/C++库,但是我必须确保首先为输出数组分配内存,使用fixed
[DllImport("my_c_func_lib.dll", CharSet = CharSet.Ansi)]
public static extern unsafe int my_c_func(double input1, double input2, double pinput3, double *outData);

    public unsafe double[] GetMyUnmanagedCodeValue(double input1, double input2, double input3)
    {
        double[] outData = new double[24];

        fixed (double* returnValue = outData)
        {
            my_c_func(input1, input2, pinput3, returnValue);
        }

        return outData;
    }

详细信息请参见:https://www.c-sharpcorner.com/article/pointers-in-C-Sharp/


0

我遇到了同样的问题,因为在更新 Angular 服务时尝试覆盖我的模型。

var nu: ExtendedUserSettingModel = this.addUserForm1.value;
// nu.createdOn = this.date; //this was what caused the issue

请确保不要覆盖任何已写入的数据


0
在我的情况下,FTDI实用程序FT Prog在扫描USB设备时出现错误。从电脑上拔掉我的蓝牙耳机解决了这个问题。

0

当我在IIS下本地运行.Net Framework Web API应用程序时,我遇到了同样的问题。

问题是我之前将IIS应用程序池的托管管道模式更新为“经典”。将其设置回“集成”后,问题得到解决。


0

对于Xamarin Forms,可以用代码封装起来

Device.BeginInvokeOnMainThread(() => 
{
 //your code
});

在 UWP 中,当从错误的线程更新 UI 时,我遇到了这个问题。

0

如果有人在这么多年之后仍然没有找到任何解决方案,这里有另一个:

我有一个 .net web api,也遇到了这个错误。

解决办法是查看 api 项目,在 属性 下更改 "托管管道模式"集成,而不是 classic


0
我在使用Linq过滤对象集合的Lambda表达式上遇到了一个错误信息。当我检查集合时,我注意到它的成员没有被填充 - 在Locals窗口中展开它们只显示“...”。最终问题出现在最初填充集合的存储库方法中 - Dapper试图自动映射嵌套对象的属性。我修复了Dapper查询以处理多重映射,并解决了内存错误。

0

正如许多人所说,导致此错误的原因有很多。但首要原因是您经常用于存储和检索数据的变量或对象消耗了更多的内存。只需找到它并消除它,如果不需要它,或者为这些执行使用单独的线程或任何其他想法。


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