尝试读取或写入受保护的内存
Posted
技术标签:
【中文标题】尝试读取或写入受保护的内存【英文标题】:Attempted to read or write protected memory 【发布时间】:2010-10-10 10:21:54 【问题描述】:我已经开始在我的应用程序的几个不同位置看到一个 AccessViolationException。它从未发生在我的开发电脑,我们的测试服务器上。它也只出现在我们的 2 台生产服务器中的 1 台上。因为它似乎只发生在我们的一台生产服务器上,所以我开始查看服务器上安装的 .net 框架版本。 我发现(出于某种奇怪的原因),有问题的生产服务器有 2.0 sp2、3.0 sp2 和 3.5 sp1,而另一台生产服务器和测试服务器有 2.0 sp1。我的应用程序仅针对 2.0 框架,决定从生产服务器卸载所有框架版本并仅安装 2.0 sp1。到目前为止,我还无法重现该问题。很有意思。 开发电脑:compact 2.0 sp2、compact 3.5、2.0 sp2、3.0 sp2、3.5 sp1 测试服务器:2.0 sp1 生产服务器1:2.0 sp1 生产服务器 2:2.0 sp2、3.0 sp2、3.5 sp1 现在,为什么我无法在具有 2.0 sp2 的开发 PC 上重现该问题,我无法弄清楚。我听说这种访问冲突可能发生在某些使用远程处理的软件上,我的就是这样做的,但是当远程处理实际发生时,访问冲突从未发生过。我现在只使用 2.0 sp1 没问题,但我真的很想知道是否有人遇到过这个问题,以及他们是否找到了新版本框架的解决方法。
以下是一些异常及其堆栈跟踪:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at ICSharpCode.TextEditor.TextArea.HandleKeyPress(Char ch)
at ICSharpCode.TextEditor.TextArea.SimulateKeyPress(Char ch)
at ICSharpCode.TextEditor.TextArea.OnKeyPress(KeyPressEventArgs e)
at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
at System.Windows.Forms.Control.WmKeyChar(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.RichTextBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
【问题讨论】:
我唯一一次有 AccessViolationExceptions 是在 Visual Studio .NET 中安装了旧版本的 ahknsvn。除此之外,我没有任何线索......也许该系统上安装了其他东西,例如 PostSharp? 相关帖子 - Attempted to read or write protected memory. This is often an indication that other memory is corrupt 【参考方案1】:从 .NET 4.5 升级到 .NET 4.5.1 后,我遇到了同样的问题。为我解决的问题是运行以下命令:
netsh winsock reset
【讨论】:
谢谢!在找到您的解决方案之前,我遇到了同样的问题! 我的项目使用的是 .NET 4.0,这个命令为我解决了这个异常,谢谢! 我知道这是一个长期休眠的线程,但到底是什么促使您尝试这样做?在很难捕获内存转储进行调试的情况下,我每隔一段时间就会看到此异常。如果您看到此内容并获得一些信息,请提前致谢! @ChrisBilson 我不记得 100%,但我想我可能尝试过这个,认为这是 Nortel *** 组件的问题,而且它碰巧起作用了。 我不明白这个问题是如何突然出现的,但这个解决方案为我解决了这个问题。谢谢!它确实需要管理员权限,然后重新启动。【参考方案2】:我遇到了同样的问题。 2.0 运行良好。安装到 3.5 sp1 后,应用程序会出现访问冲突。
安装了http://support.microsoft.com/kb/971030,我的问题就解决了,即使我没有使用 LCG。
【讨论】:
您是否有直接下载修补程序的链接?该页面说我们需要联系 Microsoft 支持,但没有任何下载链接。【参考方案3】:Microsoft 还发布了一个修补程序(2007 年 7 月 2 日),以防止已经困扰 .NET 2.0 平台一段时间的错误“尝试读取或写入受保护的内存”。看看http://support.microsoft.com/kb/923028 - 不确定它是否适用于你,但我想你可能想看看。
【讨论】:
是否意味着如果我将程序的.Net更改为.Net 3.5,问题会解决吗? 正确,从 @Ash 链接的页面下载修补程序的链接似乎已损坏。【参考方案4】:对于 VS 2013,.NET Framework 4.5.1 also has a AccessViolationException
bug (KB2915689) 在处理 SQL Server / TCP 套接字时。升级到.NET Framework 4.5.2 可以解决这个问题。
报告 VS.NET AccessViolationException
试图读取或写入受保护的内存。这通常表明其他内存已损坏。
【讨论】:
连接到 IBM AS400 时,我在 4.6.1 上得到了这个。 @JosephMorgan 我也在 4.6.1 中得到了这个。尝试导出数据库模式时发生了这种情况。你有没有运气解决它? 仍然没有喜悦。当我退出正在使用连接的应用程序时,当表单关闭时,我会得到它。我想知道我是否需要处理连接而不仅仅是关闭它??【参考方案5】:我使用的是 OLEDB,然后我切换到 SQL 客户端,它解决了我的这个错误问题。
【讨论】:
这里似乎没有任何迹象表明 TS 正在使用这些驱动程序中的任何一个(也没有执行数据库操作)。 我来这个问题是因为它是排名最高的。对于它的价值,任何人都发现了这个问题和响应,但他们的问题在于 db 查询。我有一个查询工作正常 SQL CE 3.5(sp1 和 sp2)x86,但在 x64 中失败。连接上的列数据类型不匹配,它被隐式转换在 x86 中工作,但导致在 x64 中尝试读取或写入受保护的内存错误。用 convert 或 coalesce 包裹其中一列解决了这个问题。【参考方案6】:在某些 WinForms 上调用“显示”方法时,我通常会得到“尝试读取或写入受保护的内存”。我检查了这些表格并没有什么特别之处。我不知道为什么会这样(也许有人可以告诉我),但通常将在表单的“加载”事件中执行的代码移动到“显示”事件会为我修复它,我再也看不到它了。
【讨论】:
【参考方案7】:检查以确保线程中没有线程。这就是导致我这个错误的原因。见此链接:Attempted to read or write protected memory. This is often an indication that other memory is corrupt
【讨论】:
【参考方案8】:在某些情况下,在 VB.NET 中添加“Option Strict On”并通过适当的转换解决它发现的所有问题已经为我解决了这个问题。
【讨论】:
【参考方案9】:您好,有两个可能的原因。
我们有非托管代码,我们从托管代码中调用它。那是阻止运行此代码。 尝试运行这些命令并重新启动您的电脑
cmd: netsh winsock 重置
打开cmd.exe
并运行命令"netsh winsock reset catalog"
-
防病毒软件将非托管代码视为有害并限制运行此代码
禁用杀毒软件然后检查
【讨论】:
这是我的问题。 +1 我不知道你为什么没有 cmets 或理由而被否决。【参考方案10】:在我的情况下,当我为 IIS 服务器中的应用程序池设置“启用 32 位应用程序”=True 时,此问题已得到解决。
【讨论】:
【参考方案11】:问题可能是由于项目中混合了构建平台 DLL。即您将项目构建到任何 CPU,但项目中已经为 x86 平台构建了一些 DLL。由于 32 位和 64 位架构的不同内存映射,这些将导致随机崩溃。如果所有的 DLL 都是为一个平台构建的,那么问题就可以解决。为安全起见,请尝试构建 32 位 x86 架构,因为它是最兼容的。
【讨论】:
就是这样。我的解决方案在针对 x86 构建时运行完美,但在 x64 上出现错误。【参考方案12】:在我的情况下,系统中未安装共享库之一中使用的字体。
【讨论】:
【参考方案13】:在我的情况下,我在添加对我的 COM DLL 的引用时遇到了“环境变量”的问题。
当我添加对我的项目的引用时,我正在寻找 P:\Core 路径,而我之前已将 c:\core 路径添加到路径中环境变量。
所以我的代码首先尝试了错误的路径。我删除了它并取消注册了 DLL 引用并使用 (regsvr32) 重新注册了我的 DLL 引用。希望这会有所帮助。
【讨论】:
【参考方案14】:我在创建新项目时忘记添加 EntityFramework 导致此问题。
【讨论】:
以上是关于尝试读取或写入受保护的内存的主要内容,如果未能解决你的问题,请参考以下文章
PInvoke - 读取字符串字段的值 - “尝试读取或写入受保护的内存”