Pregunta

Tengo un proceso que maneja excepciones grande. Se 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, uno de los manipuladores se llama lo que crea un volcado de bloqueo para mí. La vida es buena.

excepto en un sitio del cliente. Cuando el proceso de apagado, hay una excepción que no se enruta a través de estas llamadas, por alguna razón y consiguen el error:

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

La referencia de memoria de x000000004 parece que es probablemente un puntero nulo. Y mirando en esa dirección aparece para ser destructor de un objeto STL mundial (probablemente en la llamada initterm del CRT, donde se limpian globales).

En este momento estoy un poco atascado, aunque ya que no puedo obtener un volcado y la llamada pila de diagnóstico y ver exactamente lo que está pasando. Así que ....

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

¿Hay alguna manera de ocultar que el diálogo (ya que ningún daño se está haciendo en ese momento)?

Y hay una manera de rastrear el error de raíz?

Gracias por cualquier idea.

¿Fue útil?

Solución

¿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 las ventanas no está saltando de una con su propio control de errores?

Otros consejos

Esto suena como el CRT ha puesto un bloque de SEH try / catch (no se puede escribir de forma adecuada, patadas de rebajas en) alrededor de alguna pieza de código, y se captura la excepción para mostrar el mensaje, por lo que nunca termina llamando no controlada ruta de código excepción. Es posible que tenga que hacer algún CRT piratería de averiguar lo que está pasando.

Podría ser que el código STL está siendo ejecutada durante la destrucción de las 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 han sido destruidos.

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

¿Está utilizando STL en sus funciones de controlador de error? Podría ser que uno de ellos se va fuera tarde en la parada del programa y la causa del problema.

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