Tengo una aplicación para winforms de CA # (.NET 4.0) que se ejecuta casi todos los días, 8 horas al día, en un XP SP 3. Funciona bien la mayor parte del tiempo a veces durante meses Luego parece que se trata de un mal hechizo, y una vez al día, durante varios días seguidos, varias veces, aparece una excepción de violación de acceso. Intenté ver el archivo de volcado y detectar la excepción de violación de acceso para ver la pila; De cualquier manera, me sale más o menos la misma pila:Infracción de acceso: Intento leer o escribir en memoria protegida
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)
Estoy teniendo un momento muy difícil arreglar esto debido a que el seguimiento de la pila no es muy útil. En primer lugar, ni siquiera estoy seguro de si puedo confiar en el seguimiento de la pila: ¿llega el programa allí (parece que está intentando mostrar algo de información sobre herramientas, lo cual es ciertamente posible) porque la memoria ya está corrupta o si el programa debería ser legítimamente allí, pero parte de la memoria de datos está corrupta. En segundo lugar, suponiendo que el seguimiento de la pila es correcto y confiable, no veo una forma de descubrir qué está corrompiendo la memoria ... No estamos haciendo nada coherente para desencadenar la infracción de acceso ... el registro de la aplicación no muestra ninguna otras excepciones detectadas antes de esa fecha ... los registros de eventos no muestran ninguna entrada al mismo tiempo que la infracción de acceso ... ¿Alguna pista sobre cómo seguir diagnosticando esto?
Actualización 2011-10-11: Ya estoy detectando la excepción, pero en torno al método Application.Run(). En ese momento, parece que ya es demasiado tarde para hacer mucho. En caso de que esta excepción ocurra debido a un hardware/controlador defectuoso y no indique que la memoria de la aplicación está corrupta, ¿habría algún otro lugar donde pudiera detectar la excepción (y mostrarla, pero luego dejar que la aplicación continúe)?
Actualización 2012-03-04: Obtuve la excepción de nuevo, esta vez después de mostrar una forma bastante trivial (solo contiene un cuadro de texto y un botón Aceptar). Estaba usando TextBox.AppendText(). Yo estaba pasando este comment al mismo tiempo. ¿Podría AppendText() estar causando el problema? Cuando se producen las violaciones de acceso 'originales', tienden a suceder después de mostrar un formulario que contiene un richtextbox en el que también llamo AppendText(). ¡La trama se complica!
Actualización 2012-03-06: Eliminé AppendText y acabo de usar TextBox.Text = en su lugar, pero hoy recibí la excepción de violación de acceso nuevamente. Por lo tanto, AppendText no parece ser el culpable. Además, la excepción ocurrió una vez en un cuadro dev, ejecutando Windows 7. Por lo tanto, no parece que la excepción sea específica de Windows XP o de la otra computadora (como un problema de memoria).
¿Estás haciendo alguna invocación en tu aplicación? Si es así, podría valer la pena comentar ese detalle del código (si es posible) para ver si hace alguna diferencia. También eche un vistazo a este http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/6adca20b-649f-41a4-8fa1-09534882d76c/ especialmente la respuesta de "James Kovac" y "DejanR" . Podría ser algo relacionado con las optimizaciones de depuración. – Raghu