Необработанная и неуловимая System.AccessViolationException - PullRequest
1 голос
/ 31 октября 2011

Во время стресс-тестирования нашего приложения мы, похоже, всегда испытываем катастрофическое исключение AccessViolationException примерно через 10-12 часов использования.

Используя WinDbg для поиска источника, я вижу, что он, кажется, происходит из цикла сообщений нативной формы.Было бы здорово, если бы кто-то подтвердил мое подозрение, поэтому я включил полную трассировку стека с параметрами.Я также провел полную трассировку стека, если кому-то нужна дополнительная информация.

Заранее спасибо!

0: 000>! CLRStack -p Идентификатор потока ОС: 0x748 (0) ESPEIP
0012d44c 7c90e514 [InlinedCallFrame: 0012d44c] System.Windows.Forms.UnsafeNativeMethods.WaitMessage () 0012d448 7b1d8ed8 System.Windows.Forms.Application + Component ComponentManager.Int32) ПАРАМЕТРЫ: this = 0x015fe94c dwComponentID = причина = 0x00000004 pvLoopData = 0x00000000

0012d4e4 7b1d89c7 System.Windows.Forms.Application + ThreadContext.reason = 0x00000004 context = 0x0226ec58

0012d538 7b1d8811 System.Windows.Forms.Application + ThreadContext.RunMessageLoop (Int32, System.Windows.Forms.ApplicationContext) PARAMETERS: this = reason = context =

* 10140012d568 7b6ede47 System.Windows.Forms.Application.RunДиалог (System.Windows.Forms.Form) ПАРАМЕТРЫ: форма =

0012d57c 7b7225cb System.Windows.Forms.Form.ShowDialog (System.Windows.Forms.IWin32Window) ПАРАМЕТРЫ: это = 0x02265860 владелец =

0012d608 7b7227e3 System.Windows.Forms.Form.ShowDialog () ПАРАМЕТРЫ: this =

0012d60c 7b6eefa2 System.Windows.Forms.Application + ThreadContext.OnThreadException (System.Exception) PARXETERS 0: 0 = 0 = 0= 0x02265600

0012d648 7b6f7936 System.Windows.Forms.Control.WndProcException (System.Exception).System.Exception) ПАРАМЕТРЫ: this = e =

0012d658 7b1c8502 System.Windows.Forms.NativeWindow.Callback (IntPtr, Int32, IntPtr, IntPtr) ПАРАМЕТРЫ: this = 0x01a9c930 hWnd = msg = 0m0000

0012e880 003c25e4 [NDirectMethodFrameStandalone: ​​0012e880] System.Windows.Forms.UnsafeNativeMethods.IntDestroyWindow (System.Runtime.InteropServices.HandleRef) 0012e898 7b19ec50 System.Windows.Forms.UnsafeNativeMethods.DestroyWindow (System.Runtime.InteropServices.HandleRef) ПАРАМЕТРЫ: hWnd =

* 1030.ПАРАМЕТРЫ DestroyHandle (): это = 0x01a96d08

0012e8ec 7b1b9050 System.Windows.Forms.Control.DestroyHandle ().Forms.Form.ShowDialog () ПАРАМЕТРЫ: this =

0012ea08 04bf3a7b Workstation.FrontScreenForm.HandleNewEvent (GroupsRow, Int16, Int64) PARAMETERS: this = 0x0153b26c Group = 0x01a8de341038 * 0012ec50 04bf344f Workstation.FrontScreenForm.HandleNewEvent (GroupsRow, Int16) ПАРАМЕТРЫ: this = 0x0153b26c Group = 0x01a8de34 EventTypeID = 0x00000003

0012ec64 ​​04b21ac4.Site.Beck.Fext.b.F.FFentArgs)ПАРАМЕТРЫ: это = 0x0153b26c отправитель = 0x01546a44 e = 0x0153e990

0012ecd4 7b194180 System.Windows.Forms.Control.OnClick (System.EventArgs) ПАРАМЕТРЫ: это = е =

0012ecec 7b18f56a System.Windows.Forms.Button.OnClick (System.EventArgs) ПАРАМЕТРЫ: это = е =

0012ecfc 7b734429 System.Windows.Forms.ButtonBase.OnKeyUp (System.Windows.Forms.KeyEventArgs) ПАРАМЕТРЫ: это = 0x01546a44 kevent = 0x01a914c0

0012ed0c 7b6f5bf1 System.Windows.Forms.Control.ProcessKeyEventArgs (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = 0x01546a44 m = 0x0012ee44

0012ed5c 7b6f5c95 System.Windows.Forms.Control.ProcessKeyMessage (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = м =

0012ed6c 7b6f7381 System.Windows.Forms.Control.WmKeyChar (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = 0x01546a44 m = 0x0012ee44

0012ed7c 7ba2a0ee System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = м =

0012ed80 7b1c2626 [InlinedCallFrame: 0012ed80] 0012ee18 7b1c25a0 System.Windows.Forms.Button.WndProc (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = м =

0012ee24 7b1c8690 System.Windows.Forms.Control + ControlNativeWindow.OnMessage (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = м =

0012ee2c 7b1c8611 System.Windows.Forms.Control + ControlNativeWindow.WndProc (System.Windows.Forms.Message ByRef) ПАРАМЕТРЫ: это = м =

0012ee40 7b1c84ea System.Windows.Forms.NativeWindow.Callback (IntPtr, Int32, IntPtr, IntPtr) ПАРАМЕТРЫ: это = 0x01546b14 hWnd = сообщение = 0x00000101 wparam = lparam =

0012f220 003c25e4 [NDirectMethodFrameStandalone: ​​0012f220] System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG ByRef) 0012f230 7b1d8d5e System.Windows.Forms.Application + ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32, Int32, Int32) ПАРАМЕТРЫ: это = 0x015fe94c dwComponentID = причина = 0xffffffff pvLoopData = 0x00000000

0012f2cc 7b1d89c7 System.Windows.Forms.Application + ThreadContext.RunMessageLoopInner (Int32, System.Windows.Forms.ApplicationContext) ПАРАМЕТРЫ: this = 0x0153d9ec причина = 0xffffffff context = 0x015fdcd4

0012f320 7b1d8811 System.Windows.Forms.Application + ThreadContext.RunMessageLoop (Int32, System.Windows.Forms.ApplicationContext) ПАРАМЕТРЫ: это = причина = контекст =

0012f350 7b195921 System.Windows.Forms.Application.Run (System.Windows.Forms.Form) ПАРАМЕТРЫ: mainForm =

0012f364 00f809df Workstation.Program.Main () 0012f688 79e71b4c [GCFrame: 0012f688]

1 Ответ

0 голосов
/ 26 ноября 2012

Исключение нарушения прав доступа обычно не исходит из управляемого кода, это означает, что ваша ОС решила, что процесс сделал что-то плохое (пытается получить доступ / изменить память, где это не должно) и должно быть прекращено. когда вы ловите исключение с помощью windbg (и берете дамп), уже слишком поздно.

некоторые опции:

  • Используйте debugdiag для создания аварийного дампа (это создаст дамп в нужном месте, до того, как было сгенерировано исключение и начался процесс деконструкции) Захват аварийных дампов , Загрузка DebugDiag 1.2
  • посмотрите на диспетчер задач после того, как процесс некоторое время будет запущен и, как ожидается, завершится с ошибкой (используйте столбцы выбора), проверьте GDI, дескрипторы, потоки, объекты пользователя - все это отслеживаемые ресурсы и имеют ограничения поддержки ОС, если один из них высокий (в тысячах), это может быть проблемой.
  • посмотрите на ваш код, проверьте все точки, которые используют неуправляемые объекты, и убедитесь, что они правильно расположены. (использование COMobjects является наиболее распространенным способом доступа к неуправляемым ресурсам, и это может привести к нарушению доступа, так как они напрямую используют распределение памяти OS)
...