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

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

问题描述

我有一个 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:我再次遇到异常,这次是在显示一个相当简单的表单之后(只包含一个文本框和一个确定按钮).我正在使用 TextBox.AppendText().我碰巧同时浏览了这个评论.AppendText() 会导致问题吗?当原始"访问冲突发生时,它们往往是在显示包含富文本框的表单之后发生的,我也在该表单上调用了 AppendText().剧情变厚了!

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).

推荐答案

感谢 这篇文章.因此,一种解决方法似乎是使用 DataGridView.ShowCellToolTips = false; 禁用所有 datagridview 中的所有工具提示;然而,这并不理想.更好的解决方法是调用

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天全站免登陆