¿Cómo solucionar problemas de mensajes de informe de errores de .NET 2.0 en el registro de eventos?

StackOverflow https://stackoverflow.com/questions/814560

Pregunta

Trabajo en un producto de código abierto llamado EVEMon escrito en C # dirigido a la plataforma .NET 2.0, I tener un usuario que sufre un extraño bloqueo de .NET que no hemos podido resolver.

Event Type: Error
Event Source: .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID: 5000
Date: 4/29/2009
Time: 10:58:10 PM
User: N/A
Computer: removed this
Description:
EventType clr20r3, P1 evemon.exe, P2 1.2.7.1301, P3 49ea37c8, P4
system.windows.forms, P5 2.0.0.0, P6 4889dee7, P7 6cd3, P8 18, P9
system.argumentexception, P10 NIL.

Data:
//hex representation of the above Description

La aplicación se bloquea sin mostrar un error (a pesar de tener un error al manejar la IU), los mensajes anteriores se copiaron del registro de eventos de Windows. El usuario final ha reinstalado .NET y actualizado a las últimas versiones. Los archivos .PDB se distribuyen con cada versión de lanzamiento del programa para ayudar en la depuración y prueba, el usuario con el problema en cuestión tiene el complemento completo de archivos PDB para la versión correcta de EVEMon.

¿Existe una técnica específica, probada y probada para analizar y diagnosticar este tipo de choque? y si es así, ¿qué herramientas y tecnologías están disponibles para ayudar en la depuración?

Agradecimientos especiales

Quisiera agradecer especialmente a Steffen Opel y resaltar que su respuesta mientras no respondía directamente la pregunta que estaba haciendo, abordó el problema más grande con mi base de código de que el manejo de errores globales faltaba un componente importante.

¿Fue útil?

Solución

Así es como abordaría el problema para un usuario final con un bloqueo.

  1. Descargue e instale las herramientas de depuración para Windows en http: // www .microsoft.com / whdc / devtools / debugging / default.mspx

  2. Una vez que las herramientas están instaladas (terminan yendo a C: \ Archivos de programa \ por defecto), inicie una ventana de línea de comandos.

  3. Cambie al directorio que contiene adplus (por ejemplo, " C: \ Archivos de programa \ Herramientas de depuración para Windows (x86) ").

  4. Ejecute el siguiente comando. Esto iniciará la aplicación y adjuntará adplus.

  

adplus -crash -o C: \ debug \ -FullOnFirst -sc C: \ path \ to \ your \ app.exe

Después de crear el volcado por caída

Una vez que la aplicación se bloquea, inicie WinDbg y cargue el archivo .dmp que se crea en C: \ debug. (Archivo - > Open Crash Dump)

Ejecute estos comandos para ver el seguimiento de la pila y, con suerte, encontrar el problema.

Para cargar SOS para la depuración

  • Pre .NET 4.0
.loadby sos mscorwks
  • .NET 4.0
.loadby sos clr

Para ver el seguimiento de la pila

!clrstack

Para ver un seguimiento de pila más útil

!clrstack –p

Para meter dentro de un objeto ... quizás vea qué causó la excepción

!do <address>

por ejemplo, este es el resultado de una aplicación que falló aleatoriamente con una excepción IO. WinDbg señaló la ruta a la que se hacía referencia que era incorrecta.

0:009> !do 017f2b7c    
Name: System.String    
MethodTable: 790fd8c4    
EEClass: 790fd824    
Size: 124(0x7c) bytes    
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
String: \\server\path\not_here.txt
Fields:    
      MT    Field   Offset                 Type VT     Attr    Value Name    
79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
790fd8c4  4000099       10        System.String  0   shared   static Empty    
    >> Domain:Value  00161df8:790d884c <<    
7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
    >> Domain:Value  00161df8:014113e8 <<

Otros consejos

Mirar a escondidas en su código fuente (troncal) indica que su manejo de excepciones no controlado parece estar incompleto con respecto a las aplicaciones de formularios Windows Forms:

Debe manejar tanto excepciones de subprocesos que no son de UI como excepciones de subprocesos de IU:

  • Para el primero, debe implementar un controlador de excepciones no controlado CLR a través de AppDomain.CurrentDomain.UnhandledException , que ya está en su lugar.

  • Para lo último, debe implementar un controlador de excepciones no controlado de formularios Windows Forms a través de Application.ThreadException , que parece faltar; De hecho, esto podría producir exactamente esos problemas que está presenciando. Para ver un ejemplo de implementación, consulte la documentación de MSDN de Application.ThreadException Evento .

Tenga en cuenta que en este momento suprime explícitamente la captura de excepciones de formularios Windows Forms no controlados a través de Application.SetUnhandledExceptionMode (UnhandledExceptionMode.ThrowException) , deberá cambiar esto a UnhandledExceptionMode.CatchException para habilitar el enrutamiento a su controlador para Application.ThreadException , como ya sugirió Jehof correctamente.

¿Qué sistema operativo (Windows XP, Windows Vista, etc.) utiliza el usuario?

Si Windows Vista intenta deshabilitar " Informes de problemas y la función de Soluciones " (Panel de control - > Informes de problemas y soluciones - > Cambiar configuración - > Configuración avanzada - > Desactivar para mis programas, informes de problemas)

O intente configurar

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

Esto siempre enrutará excepciones al controlador ThreadException.

En pocas palabras: hay una excepción no controlada en la aplicación.

Si tiene acceso a la máquina (a través de acceso remoto, etc.), intente instalar Visual Studio Express e iniciar la aplicación. Debería ver un cuadro de diálogo que ofrece la posibilidad de depurar la aplicación con una nueva instancia de Visual Studio.

También puede ser que haya algo que impida que Windows Forms se inicialice correctamente. He visto publicaciones en foros que sugieren que los problemas de fuentes pueden causar esto: asegúrese de que los usuarios tengan instaladas las fuentes que su aplicación necesita además de los valores predeterminados habituales, como MS SansSerif, Arial, Tahoma, Times y similares.

Y en su defecto ... intente sacrificar un pollo sobre la PC. Funciona un encanto cada vez!

Hemos tenido problemas con Excepciones en Thread-Code. Si genera un nuevo subproceso y olvida manejar una excepción en el método del subproceso, la aplicación simplemente '' se detiene '' - sin mensaje de error, sin nada, sino solo una entrada en el registro de eventos. Ni siquiera entonces se activa UnhandledExceptionHandler .

¿Quizás algo como esto es la causa?

... si puede contactar a ese usuario que sufre, aquí hay un

Idea: registrar las etapas previas a la ejecución

En lugar de hacer un acceso directo a su program.exe , cree un acceso directo a program.bat , que lo hará

echo "Pre-start" > stage.txt
start program.exe

La primera línea de Program.cs será, por lo tanto,

File.WriteAllLines("stage.txt", "Program execution started.");

En el controlador de AppDomain.UnhandledException la primera línea será

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

Además, asegúrese de que el controlador no asigne memoria o recursos & # 8212; preasignarlos al inicio de los programas. El controlador solo activa la escritura en el registro.

Comentarios

Es muy probable que el stage.txt (enviado por el usuario) contendrá " Pre-start " ;. Esto sucede cuando se lanza una excepción en terceros .dll & # 8212; incluso antes de que su programa haya comenzado.

En ese caso, necesitará un programa de verificación simple, que no hará referencia a los ensamblados que program.exe hace, pero Assembly.Load (...) ellos.

P.S.

stage.txt debe colocarse en algún lugar debajo de% APPDATA%, no en Archivos de programa.

Encontré un caso interesante en Server 2003 y otra buena discusión .

Debería obtener un seguimiento de pila más detallado enviando el archivo .pdb para esa versión en particular al usuario (que se colocará junto al .exe ) y tener ellos reproducen el bloqueo.

Debe manejar AppDomain.UnhandledException en el código.

Hubo un pregunta similar formulada. Ver los relacionados también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top