2010-11-09 25 views
11

Cuando una excepción sale de una función en una DLL, el tiempo de ejecución de mingw32 simplemente llama a finaliza std :: inesperado en lugar de propagar la excepción al código que llama a la DLL. ¿Qué soluciones hay para este problema? La DLL y la aplicación que la llama están compiladas con el mismo compilador.Captura de excepciones lanzadas desde DLL

Hay dos mecanismos de excepción diferentes admitidos por mingw32: SJLJ y Dwarf2. ¿Debería uno de ellos trabajar mejor que el otro para esto? Quizás la única opción es cambiar a MSVC o ICC o quizás cambiar las opciones de compilación por sí solos ayudaría?

Observe que ni siquiera catch (...) captará ninguna excepción, ni siquiera los tipos incorporados (throw 1;), por lo que no se trata de la visibilidad del tipo de excepción.

+0

Interesante. ¿Puede ser que cada biblioteca tenga un tiempo de ejecución de C++ estáticamente vinculado? – sharptooth

Respuesta

0

Parece haber un problema con gcc preservando la información sobre el tipo de excepción cuando se lanza la excepción desde otra biblioteca compartida.

Ver this bug report y tratar de google para "excepción biblioteca compartida gcc" (todavía no he encontrado una solución a ese problema)

5

¿Es el tiempo de ejecución si se asume que extern "C" funciones nunca lanzar excepciones? No estoy familiarizado con MinGW, pero sé que Visual Studio tiene un montón de argumentos de línea de comando para controlar este tipo de comportamiento. Por ejemplo, la opción /EHs hará que asuma que extern "C" nunca arrojará y tratará las funciones que sí lanzan llamando al std::unexpected() que a su vez llama al std::terminate(). Es posible que desee llamar al std::set_unexpected() para establecer un controlador de excepción inesperado y ver si atrapa.

Cuestiones relacionadas