2012-07-19 15 views
12

Estoy trabajando en el desarrollo de un software en C++ en Visual Studio 2010. Como este software debe ejecutarse en servidores donde la interacción humana no está disponible, realmente necesito deshacerme de esto "program.exe ha dejado de funcionar "ventana que aparece en la versión de lanzamiento en caso de errores. Solo quiero que el programa finalice (quizás también dé un mensaje de error, pero no necesariamente) y no lo tenga bloqueado esperando que alguien haga clic en el botón "Cerrar el programa". Debo mencionar que tengo Windows 7 Professional de 64 bits en mi máquina.¿Cómo evitar la ventana "program.exe ha dejado de funcionar" en modo de lanzamiento en Windows?

He leído en varias cosas, como por ejemplo:

  • la función _set_abort_behavior. Esto resuelve el caso cuando se invoca abort(), pero ese no es el caso para errores como "vector subíndice fuera de rango".

  • Sé que podría estar solucionando algunos de estos errores haciendo el manejo de excepciones, pero no todos los errores son excepciones, por lo tanto, esto no resolvería todo mi problema.

  • También he leído algo sobre el depurador Dr. Watson, que se supone que debe terminar la aplicación silenciosamente, pero tengo la impresión de que este depurador no está disponible para Windows 7. Además, no sé si esto depurador resolvería mi problema en el modo de lanzamiento ...

  • No me parece que deshabilitar los informes de error en toda mi máquina es una opción elegante, aunque he leído que esto también podría ser una alternativa (no realmente una que Quiero tomar).

¿Cómo puedo hacer esto en Visual Studio? ¿Hay alguna configuración que pueda usar?

¿Existe alguna forma de convertir todos los errores en excepciones en Visual Studio, para que pueda resolver el problema con el mecanismo de manejo de excepciones? (Sea tolerante si esta fue una pregunta estúpida)

Espero sus propuestas. ¡Muchas gracias por tu tiempo!

Saludos, Cornelia

+2

La mejor manera sería deshacerse de lo que está causando el colapso en primer lugar. – chris

+0

"También he leído algo sobre el depurador Dr. Watson, que se supone que debe terminar la aplicación silenciosamente" - Este es un tipo de uso "excepcional" para el depurador (del que nunca escuché, el depurador puede iniciarse automáticamente en el caso de bloqueo de la aplicación). Y ciertamente no para el modo de lanzamiento. – SChepurin

+0

@Chris: ¡esa es una respuesta obvia! Pero el problema real es que cuando la aplicación se ejecuta en algún servidor y encuentra un error y falla, sigue colgando y no sé si todavía está ejecutándose o atascado (sin implementar algún tipo de vigilante dependiente de la plataforma en el sistema backend, que no es lo que quiero!). Así que prefiero que la aplicación se cierre después de descubrir el error y luego puedo verificar el archivo de registro y ver que inesperadamente dejó de funcionar y sabré que tengo un problema. –

Respuesta

19

Puede utilizar

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 

MSDN documentation for SetErrorMode

Puede también refer here

Hope esto va a resolver su problema ...

+0

¡Gracias, esto resolvió mi problema! –

+0

Gracias! <3 <3 <3 <3 –

+0

Gracias, eso era lo que quería :) –

0

Una buena forma es agregar su propio filtro de excepción no controlada (consulte SetUnhandledExceptionFilter() documentos) y luego escribir un registro y un mini volcado para que pueda hacer el manejo de errores que necesite (por ejemplo, cerrar dispositivos/controladores) y también tiene un bloqueo volcado que puedes analizar más tarde.información útil en esta respuesta: https://stackoverflow.com/a/1547251/188414

+0

Gracias por su respuesta. La solución anterior resolvió mi problema. Pero solo por curiosidad, este SetUnhandledExceptionFilter(), ¿funciona para todos los errores o solo para excepciones? El problema es que en C++ no todos los errores son excepciones (como en Java, por ejemplo), por ejemplo, los errores que provienen de un comportamiento indefinido no son excepciones. –

+0

En C++ nativo en Windows existen dos tipos de excepciones: las excepciones normales de C++ pero también las excepciones estructuradas que son específicas de Windows. Estos pueden atrapar errores de tiempo de ejecución, como llamadas a funciones virtuales puras y violaciones de acceso que no se pueden detectar en C++ regular. Esto le da a su aplicación la oportunidad de arreglar en el caso de un error fatal. Vea más en MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx –

+0

Muy interesante, gracias. Lo echaré un vistazo. –

-1

A veces se produce este error sólo porque no ha añadido una señal & antes del valor que ha utilizado en scanf

Pruebe lo siguiente, que resolvió mi problema

De

scanf("%d",code); 

Para

scanf("%d",&code); 
Cuestiones relacionadas