我有一個ac#(.net 4.0)winforms應用程序,它幾乎每週8個小時在XP SP 3上運行。它大多數時間工作正常,有時幾個月。然後,它似乎陷入了一個不好的咒語,並且每天一次,連續幾天,在不同的時間出現訪問衝突異常。我試着查看轉儲文件,並捕獲訪問衝突異常來查看堆棧;無論哪種方式,我得到幾乎相同的堆棧:訪問衝突:試圖讀取或寫入受保護的內存
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)
我有一個非常艱難的時間來修復這一點,因爲堆棧跟蹤不是非常有用。首先,我甚至不確定我是否可以信任堆棧跟蹤:程序是否到達那裏(看起來它試圖顯示一些工具提示,這當然是可能的),因爲內存已經損壞,或者如果程序真的應該合法那裏,但一些數據內存已損壞。其次,假設堆棧跟蹤是正確和可信的,我沒有看到一種方法來找出什麼是破壞內存...我們沒有做任何事情一致觸發訪問衝突...應用程序日誌不顯示任何其他捕獲異常之前...事件日誌不會顯示任何條目與訪問衝突同時...任何提示如何進一步診斷此?
更新2011-10-11:我已經在捕獲異常,但圍繞Application.Run()方法。在這一點上,似乎現在做太多太遲了。爲了防止由於硬件/驅動程序錯誤而導致發生此異常,並且未指出應用程序的內存已損壞 - 是否還有其他地方可以捕獲異常(並顯示它,但讓應用程序繼續運行)?
更新2012-03-04:我再次得到異常,這次顯示一個相當小的表單(只包含一個文本框和一個ok按鈕)。我正在使用TextBox.AppendText()。我只是碰巧在同一時間瀏覽這個comment。 AppendText()會導致問題嗎?當發生「原始」訪問衝突時,他們往往會在顯示一個包含richtextbox的表單之後發生,我也在這個表單上調用AppendText()。情節變濃了!
更新2012-03-06:我刪除了AppendText,只是使用TextBox.Text =代替,但今天我再次遇到了訪問衝突異常。因此,AppendText似乎不是罪魁禍首。此外,在運行Windows 7的開發盒上發生了一次異常。因此,Windows XP或其他計算機(如內存問題)似乎沒有特殊情況。
你在應用程序中執行任何PInvoke嗎?如果是的話,可能值得評論一下代碼(如果可能的話),看看它是否有區別。也可以看看這個http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/6adca20b-649f-41a4-8fa1-09534882d76c/,特別是來自「James Kovac」和「DejanR」的答案。 。可能與調試優化有關。 – Raghu