Pregunta

Estoy escribiendo una pequeña utilidad (VC 2010, sin CLR) que haga una tarea simple (rasterizando) usando la biblioteca de terceros. La utilidad posterior será utilizada por una aplicación más grande. A veces, la utilidad se bloquea debido a una corrupción de montón en la biblioteca de terceros. Eso está bien, pero Windows (Vista/2008) muestra un diálogo bien conocido "El programa ha dejado de funcionar ... Programa de cierre/depuración". que no es apropiado en mi caso (lado del servidor). La utilidad debe bloquearse/terminar en silencio sin ningún efecto visible.

Para hacerlo, instalé SEH para una excepción no controlada (setUnhandledExceptionFilter). El controlador se invoca perfectamente para excepciones como AV ( *(PDWORD) 0 = 0), pero por alguna razón no se invoca en el caso de la corrupción de almacenamiento. La corrupción ocurre en DllMain de una de las dlls de la biblioteca de terceros mientras se está descargando.

Par de preguntas. ¿Alguien puede explicar por qué el manejador no está invocado? ¿Hay otra forma de prevenir ese diálogo?

¿Fue útil?

Solución

Aparentemente, es intencional que los manejadores de excepción definidos por el usuario no sean atrapados por los manejadores de excepción definidos por el usuario, a pesar de que se emiten como excepciones con su propio código de excepción (0xc0000374 "status_heap_corruption"). Aquí hay un informe visual de errores C ++ que básicamente se cerró como "no se solucionó":

https://connect.microsoft.com/visualstudio/feedback/details/664497/cant-catch-0xc0000374-exception-status-heap-corruption

Como ha descubierto, este no es un error en el compilador o el sistema operativo. La corrupción del montón que causa su función se trata como un error crítico, y como parte del manejo de ese error, el SO termina el proceso. Esto es lo que hace que sus manejadores de excepción no se invocen.

Supongo que los informes de errores de Windows u otras formas de crear un volcado de bloqueo aún podrían atraparlo.

En cuanto a prevenir el diálogo, en el registro puede deshabilitarlo por completo o simplemente deshabilitar el diálogo para que el proceso no bloquee:

https://msdn.microsoft.com/de-de/library/windows/desktop/aa366711(v=vs.85).aspx (ver "Donkshowui")

Otros consejos

Pero por alguna razón no se invoca en el caso de la corrupción del montón. La corrupción ocurre en DllMain de una de las dlls de la biblioteca de terceros mientras se está descargando.

La corrupción del montón es un comportamiento indefinido. Puede arrojar excepciones, puede hacer lo contrario. Si una biblioteca de terceros en buggy está arruinando su montón, entonces la pregunta es "¿por qué les permite meterse con su montón en primer lugar?"

El diálogo "El programa ha dejado de funcionar" se muestra cada vez que un proceso termina anormalmente. No todas las terminaciones de proceso anormales resultan de excepciones. Muchos errores (como el desbordamiento de la pila, la pila desalineada, etc.) causan la terminación instantánea del proceso, que puede mostrar ese mensaje pero no le dará la oportunidad de manejar el error.

(Además, ver el impresionante comentario de Hans arriba)

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