2010-11-09 19 views
11

Quando un'eccezione esce da una funzione in una DLL, il runtime mingw32 chiama semplicemente e termina std :: inatteso invece di propagare l'eccezione al codice che sta chiamando la DLL. Quali soluzioni ci sono per questo problema? La DLL e l'applicazione che lo chiama sono entrambi compilati con lo stesso compilatore.Eccezioni di cattura generate dalle DLL

Ci sono due differenti meccanismi di eccezione supportati da mingw32: SJLJ e DWARF2. Uno di loro dovrebbe lavorare meglio dell'altro per questo? Forse l'unica opzione è passare a MSVC o ICC o forse il solo cambiamento delle opzioni di compilazione potrebbe aiutare?

Avviso che nemmeno catch (...) prenderà alcuna eccezione, neppure tipi built-in (gettare 1;), quindi non è la visibilità del tipo di eccezione.

+0

Interessante. Può essere che ogni libreria abbia un runtime C++ collegato staticamente? – sharptooth

risposta

0

Ci cuciture ad essere un problema con gcc conservare le informazioni relative al tipo di eccezione quando l'eccezione viene generata da un'altra libreria condivisa.

Vedi this bug report e provare googling per "eccezione condiviso libreria gcc" (non ho ancora trovato una soluzione a questo problema)

5

È il runtime assumendo che extern "C" funzioni non saranno mai generare eccezioni? Non ho familiarità con MinGW ma so che Visual Studio ha un sacco di argomenti da linea di comando per controllare questo tipo di comportamento. Ad esempio, l'opzione /EHs lo farà supporre che extern "C" non potrà mai lanciare e tratterà funzioni che gettano chiamando std::unexpected(), che a sua volta chiama std::terminate(). Potresti voler chiamare std::set_unexpected() per stabilire un gestore di eccezioni imprevisto e vedere se intercetta.

Problemi correlati