¿Cómo solucionar problemas de mensajes de informe de errores de .NET 2.0 en el registro de eventos?
-
03-07-2019 - |
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.
Solución
Así es como abordaría el problema para un usuario final con un bloqueo.
-
Descargue e instale las herramientas de depuración para Windows en http: // www .microsoft.com / whdc / devtools / debugging / default.mspx
-
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.
-
Cambie al directorio que contiene adplus (por ejemplo, " C: \ Archivos de programa \ Herramientas de depuración para Windows (x86) ").
-
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.