2011-09-18 12 views
6

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

+1

¿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

Respuesta

5

que fue capaz de duplicar los problema gracias a this post. Por lo tanto, una solución alternativa parece deshabilitar todas las sugerencias de herramientas en todos los datagridview utilizando DataGridView.ShowCellToolTips = false; Sin embargo, esto no es ideal. A better work-around es llamar

Application.EnableVisualStyles(); 

before any controls are created in the app.

He confirmado que el problema ocurre si DataGridView muestra información sobre herramientas personalizadas (con CellToolTipTextNeeded) o no.

0

No estoy seguro si esto será de alguna ayuda, pero este problema parece ser común en las versiones anteriores de .Net y Microsoft incluso lanzó algunas correcciones para eso.

Uno de la solución inicial era como sigue,

http://support.microsoft.com/kb/923028

Aquí es otro. http://support.microsoft.com/kb/975954

+0

Gracias. Para la revisión 923028, aparece un mensaje de error que dice "El parche de actualización no puede ser instalado por el servicio Windows Installer porque el programa que se va a actualizar puede faltar o el parche de actualización puede actualizar una versión diferente del programa. Verifique que el programa debe actualizarse en su computadora y que tiene el parche de actualización correcto ". 975954 se ha instalado con éxito. ¡Veamos si funciona! – Jimmy

+0

Ha recibido otra infracción de acceso esta mañana - por lo tanto, confirmó que el hotfix 975954 NO solucionó el problema :( – Jimmy

0

Eso no es fácil de rastrear/fix ya que toda la información es más bien "genérico" por lo que estos son algunos consejos generales:

  • qué siempre sucede en el mismo equipo?
    Si es así, podría valer la pena para comprobar la máquina (pruebas de memoria, etc ejecutar desde un CD de arranque de Linux o similar) y/o ejecutarlo en una máquina diferente a ver si cambia ...

  • La excepción parece ocurrir cuando se muestra una información sobre herramientas ... podría indicar un problema con el controlador de la tarjeta gráfica ...elija un controlador diferente y/o resolución de pantalla diferente, etc. y vea lo que sucede

  • ¿Está utilizando algunas bibliotecas de terceros?
    Si es así, podría valer la pena revisarlos para detectar problemas de memoria no administrados (por ejemplo, con un generador de perfiles de memoria ...). Verifique con el vendedor (s) si hay versiones más nuevas, etc.
    Hace algún tiempo tuve algo similar y resultó ser una pérdida de memoria no administrada dentro de una biblioteca de terceros (diagnosticada a través del generador de perfiles de memoria) ... verifico con proveedor y obtuvo una versión fija que se ejecuta sin problemas desde ...

+0

Actualicé el controlador la semana pasada. Tuvimos una semana sólida sin fallar, y luego bam! Crash esta tarde :( – Jimmy

+0

como absolutamente recurso de último recurso: a veces ayuda a reiniciar cada 24 horas más o menos ... – Yahia

+0

Sí, el software en sí se apaga a diario, y la computadora se reinicia semanalmente ... no parece ayudar (es decir, los bloqueos pueden ocurrir los lunes, después de reiniciando durante el fin de semana). – Jimmy

3

He observado este problema al llamar a un contenedor de C# externo para un dll C. Inhabilité DEP para C# dll, usando la utilidad editbin.exe/NXCOMPAT: NO {nombre dll} y eso parece haber solucionado el problema.

I CLR debería realizar comprobaciones adicionales cuando DEP está encendido y el dll C podría estar haciendo algo que el CLR considera como corrupción de memoria y arroja este error.

Usted puede leer más sobre esto en, http://blogs.msdn.com/b/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx

2

Recientemente también obtuvimos una AccessViolationException al hacer TextBox.AppendText(). Después de intentar reproducir el problema, nos dimos cuenta de que el TextBox no era el problema. En nuestro caso, fue la característica de arrastrar y soltar.

Aquí es un proyecto mínimo (un formulario con un cuadro de texto), que reproducirá la excepción:

using System; 
using System.Windows.Forms; 

namespace TestTextBoxAccessViolation { 
    public partial class Form1 : Form { 


     public Form1() { 
      InitializeComponent(); 
     } 

     private void Form1_DragEnter(object sender, DragEventArgs e) { 
      e.Effect = DragDropEffects.Copy; 
     } 

     private void Form1_DragDrop(object sender, DragEventArgs e) { 
      e.Data.GetData("DragImageBits"); 
      Form1 f = new Form1(); 
      f.textBox1.Text = "Keep resizing this window and you'll get an AccessViolationException after a while"; 
      f.Show(); 
     } 
    } 
} 

Conclusión: No use "DragImageBits".

0

Estaba sufriendo el mismo comportamiento que el OP. Revisé un software y agregué dos métodos de PInvoke (para mejorar la UI). Desafortunadamente, comencé a recibir los mismos mensajes que el OP. Al revisar las respuestas, encontré la de Raja Hindustani. Al comentar los dos métodos de PInvoke, el problema parece haber desaparecido.

1

Descubrí que este problema se produce (falla) no solo en WPF, sino también en WinForms. Mi problema estaba relacionado con OpenFileDialog. Es difícil decir cuál es la fuente del problema, pero aún parece que Microsoft dll relacionado con OpenFileDialog tiene errores (para mí, era ComDlg32.dll)

La única forma en que podría llamar a la función ShowDialog() era para envolverlo en el evento y llamar con la ayuda de

this.BeginInvoke(
     new Action<YourObject, EventArgs>(YourObject_FileDialogOpened), new object[] 
                 { YourObjectInstance, e }); 

donde "este" es un control (por ejemplo, la Forma).

Las subvenciones de BeginInvoke (...) a las que llame se procesarán de forma adecuada.

El problema no aparecerá si utiliza la llamada de OpenFileDialog en el evento de clic de botón o en cualquier otro escenario similar.

Cuestiones relacionadas