Нарушение доступа: Попытка чтения или записи защищенной памяти

У меня есть c# (.net 4.0) выигрышное приложение, которое работает почти каждый день недели, 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(). На данный момент, кажется, уже слишком поздно что-то делать. Как раз на тот случай, если это исключение происходит из-за неисправного аппаратного обеспечения/драйвера и не свидетельствует о том, что память приложения повреждена - есть ли еще место, где я мог бы поймать исключение (и вывести его на экран, но потом позволить приложению продолжить)?

Update 2012-03-04: Я снова получил исключение, на этот раз после отображения довольно тривиальной формы (содержит только текстовое поле и кнопку ok). Я использовал TextBox.AppendText(). Просто так получилось, что я одновременно просматривал этот комментарий . Может ли AppendText() стать причиной проблемы? Когда происходят "оригинальные" нарушения доступа, они, как правило, происходят после отображения формы, содержащей богатый текстовый ящик, на котором я также вызываю AppendText(). Сюжет утолщается!

Обновление 2012-03-06: Я удалил AppendText и просто использовал TextBox.Text =, но сегодня я снова получил исключение о нарушении доступа. Таким образом, AppendText не кажется виновным. Более того, исключение произошло однажды на dev box под управлением Windows 7. Таким образом, не похоже, что исключение специфично для Windows XP, или для другого компьютера (вроде проблемы с памятью).

6
задан Community 23 May 2017 в 12:07
поделиться