visual studio stop exceptions excepciones debug configuracion activar debugging winapi exception-handling crash application-shutdown

debugging - exceptions - visual studio 2017 stop on exception



GestiĆ³n de excepciones de cierre para Win32/C++ (3)

Esto suena como que el CRT ha puesto un bloque de prueba / captura SEH (no puede escribirlo correctamente, el Marcado entra en acción) alrededor de un fragmento de código, y está captando la excepción para mostrar el mensaje, por lo que nunca termina llamando a la excepción no controlada ruta del código Es posible que tengas que hacer algo de piratería CRT para descubrir qué está pasando.

Tengo un proceso que maneja las excepciones de maravilla. Llama:

_set_se_translator(exception_trans_func); SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler); _set_purecall_handler(purecallHandler); set_terminate(terminateHandler); set_unexpected(unexpectedHandler); _set_invalid_parameter_handler(InvalidParameterHandler); atexit(exitHandler); //ignored during an expected exit _onexit(onexitHandler); //ignored during an expected exit

Cada vez que ocurre una excepción, se llama a uno de los controladores, lo que crea un volcado de emergencia para mí. La vida es buena.

Excepto en el sitio de un cliente. Cuando cierran el proceso, hay una excepción que no se enruta a través de estas llamadas por algún motivo y obtienen el error:

La instrucción en "0x101ba9df" hace referencia a la memoria en "0x00000004". La memoria no puede ser leída". Haga clic en Aceptar para terminar ... "

La referencia de memoria de x000000004 parece que probablemente sea un puntero nulo. Y mirando esa dirección parece ser un destructor de objetos STL globales (probablemente en la llamada de iniciación de CRT donde se limpian los globales).

En este momento estoy algo atrapado, ya que no puedo obtener un volcado de diagnóstico y la pila de llamadas y ver exactamente qué está pasando. Asi que....

¿Por qué no se enruta la excepción a través de los controladores anteriores y, en cambio, se muestra al usuario?

¿Hay alguna forma de ocultar ese diálogo (ya que no se está haciendo daño en ese punto)?

¿Y hay una forma de rastrear el error raíz?

Gracias por cualquier idea


Podría ser que el código STL se esté ejecutando durante la destrucción de variables globales en el momento de cierre del programa y, tal vez (dependiendo de la versión de STL que esté utilizando) algunas variables globales que requiere ya hayan sido destruidas.

Lo he visto con el STL de VS2008. Hay algunos objetos de bloqueo de STL que se crean a través de un nivel de archivo estático durante el inicio.

¿Estás utilizando STL en tus funciones de administrador de errores? Podría ser que uno de estos se apague tarde en el cierre del programa y cause el problema.


¿Qué sistema operativo están ejecutando?

Supongo que está configurando el modo de error usando algo como

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

para asegurarse de que Windows no salta con su propio manejo de errores?