2010-09-25 8 views
7

Uno de mis programas falla periódicamente, pero no sé por qué. Lo estoy ejecutando en modo de depuración, pero no aparece nada. El programa simplemente sale de repente. He tenido otros errores que arrojan una excepción ... pero no esta. ¿Hay una forma mágica de atraparlo o algo así?Cómo depurar un programa cuando falla sin excepción?

Respuesta

8

Presumiblemente lo está ejecutando desde Visual Studio y, por alguna razón, no se detiene en el depurador con una excepción no detectada, en cuyo caso podría intentar detectar el bloqueo desde fuera de Visual Studio. Vea mi respuesta en System.AccessViolationException from unmanaged code?, en particular how to capture a crash dump.

Si solo se cuelga periódicamente, pero dentro de un período de tiempo razonablemente corto, comience con Sysinternals procdump. Comience el ejecutable desde fuera de Visual Studio, ejecute:

procdump -e <YourExecutableNameOrPid> 

y esperar a que la cosecha de un volcado de bloqueo - suponiendo que sale debido a una excepción no controlada - a continuación, cargar el volcado de bloqueo en VS 2010 o WinDbg.

+0

¿qué hacer si tiene una AccessViolationException en una aplicación .NET 4 que realmente golpea un bloque catch inesperadamente? Sí, esto realmente me está sucediendo en este momento. No pude creerlo yo mismo. Planee hacer una pregunta separada de StackOverflow, pero primero leo esta respuesta. Debido a que la aplicación no falla, no hay un volcado de emergencia, ¿no? –

+1

@JohnZabroski Volvería a la depuración con WinDbg y SOS [EX]. Ver mi otra respuesta vinculada a arriba. –

+0

Gracias, describí mi problema en detalle aquí: http://stackoverflow.com/questions/39378849/what-to-do-when-accessviolationexception-in-net-4-app-defies-msdn-documented-be –

4

El programa de repente sale

definitivamente compruebe que su código, o una de las bibliotecas que utiliza, no llama a exit() (sí puede parecer demasiado simple, pero horas una vez perdido el rastreo los programas al azar cierran las llamadas a exit() ..). Si es así, coloque un punto de interrupción allí o cambie a throw(), luego vuelva a ejecutar. Si no, la respuesta de Sean parece legítima.

+0

Nosotros tuvo este problema exacto una vez y nos llevó años averiguarlo. Vale la pena verificarlo. –

+0

También debe establecer un punto de interrupción o alguna declaración de registro como última línea en main()/winmain(). Posiblemente el programa termina "normalmente" por lo tanto de una manera inesperada. –

+0

@Red: es una aplicación GUI de WPF ... todo el código está en eventos, no creo que llegue nunca al final. @stijn: Estoy bastante seguro de que no escribí ninguna llamada de salida, pero lo verificaré dos veces. – mpen

Cuestiones relacionadas