访问冲突:尝试读取或写入受保护的内存 [英] Access Violation: Attempted to read or write protected memory

查看:281
本文介绍了访问冲突:尝试读取或写入受保护的内存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个c#(.net 4.0)winforms应用程序,每个星期一天运行几乎每天8小时,在XP SP 3上。大多数时候,有时候几个月都可以正常工作。那么似乎有一个坏的咒语,每天一次,连续几天,在不同的时间,访问冲突异常出现。我已经尝试查看转储文件,并捕获访问冲突异常来查看堆栈;无论哪种方式,我几乎都是相同的堆栈:

I have a c# (.net 4.0) winforms application that runs pretty much every week day, 8 hours a day, on an XP SP 3. It works fine most of the time, sometimes for months. Then it seems to get in a bad spell, and once a day, for a few days in a row, at various times, an access violation exception comes up. I've tried looking at the dump file, and catching the access violation exception to look at the stack; either way, I get pretty much the same stack:

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.ToolTip.WndProc(Message& msg)
   at System.Windows.Forms.ToolTip.ToolTipNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)

我很难修复这个因为堆栈跟踪不是很有用。首先,我甚至不确定我是否可以信任堆栈跟踪:程序是否到达(看起来它试图显示一些工具提示,这当然是可能的),因为内存已经被破坏了,或者如果程序真的应该是合法的那里有一些数据内存被破坏。第二,假设堆栈跟踪是正确和值得信赖的,我没有看到什么是破坏内存的方法...我们没有做任何一致的触发访问冲突...应用程序日志不显示任何其他捕获的异常之前...事件日志不会与访问冲突同时显示任何条目...任何提示如何进一步诊断这个?

I'm having a very hard time fixing this because the stack trace isn't very useful. First, I'm not even sure if I can trust the stack trace: does the program get there (looks like it's trying to display some tooltip, which is certainly possible) because memory is already corrupted, or if the program really should legitimately be there, but some data memory is corrupted. Second, assuming the stack trace is correct and trustworthy, I don't see a way to figure out what is corrupting the memory... We are not doing anything consistent to trigger the access violation... the application log does not show any other caught exceptions before then... the event logs don't show any entries at the same time as the access violation... Any hints on how to further diagnose this?

更新2011-10-11:我已经捕获了异常,但是在Application.Run()方法中。在这一点上,看起来太晚了。为了防止由于硬件/驱动程序错误而发生这种异常,并不表示应用程序的内存已损坏 - 是否有其他地方可以捕获异常(并显示它,但是让应用程序继续)?

Update 2011-10-11: I'm already catching the exception, but around the Application.Run() method. At that point it seems it's too late to do much. Just in case this exception is happening due to faulty hardware/driver and does not indicate that the application's memory is corrupt -- would there be any place else that I could catch the exception (and display it, but then let the application continue)?

更新2012-03-04:我再次收到异常,这次显示一个相当简单的表单(只包含一个文本框和一个ok按钮)。我正在使用TextBox.AppendText()。我刚刚正好浏览这个评论。可能AppendText()是否导致问题?当原始访问冲突发生时,他们会显示一个包含一个我还调用AppendText()的richtextbox的表单后会发生。剧情变厚!

Update 2012-03-04: I got the exception again, this time after displaying a fairly trivial form (only contains a textbox and an ok button). I was using TextBox.AppendText(). I just so happened to be browsing this comment at the same time. Could AppendText() be causing the issue? When the 'original' access violations occur, they tend happend after displaying a form that contains a richtextbox on which I also call AppendText(). The plot thickens!

更新2012-03-06:我删除了AppendText,只是使用了TextBox.Text =,但是今天再次获得了访问冲突异常。因此,AppendText似乎不是罪魁祸首。此外,例外在运行Windows 7的开发框中发生了一次。因此,它似乎不是特定于Windows XP或其他计算机的异常(如内存问题)。

Update 2012-03-06: I removed AppendText and just used TextBox.Text = instead, but I got the access violation exception again today. Thus, AppendText does not seem to be the culprit. Furthermore, the exception happened once on a dev box, running Windows 7. Thus, it does not seem like the exception is specific to Windows XP, or to the other computer (like a memory issue).

推荐答案

由于这篇文章

I was able to duplicate the issue thanks to this post . So, one work-around appears to disable all tooltips in all datagridview using DataGridView.ShowCellToolTips = false; However, this is not ideal. A better work-around is to call

Application.EnableVisualStyles();

在应用程序中创建任何控件之前

我已经确认发生问题是否DataGridView是否显示自定义工具提示(使用CellToolTipTextNeeded)。

I have confirmed that the issue occurs whether the DataGridView is displaying custom tooltips (with CellToolTipTextNeeded) or not.

这篇关于访问冲突:尝试读取或写入受保护的内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆