Domanda

Sto scrivendo Small Utility (VC 2010, No CLR) che svolge un semplice compito (rasterizzazione) usando la libreria di terze parti. L'utilità successiva sarà utilizzata da un'applicazione più grande. A volte l'utilità si schianta a causa di un po 'di corruzione di heap nella biblioteca di terze parti. Va bene, ma Windows (Vista/2008) mostra il dialogo noto "Il programma ha smesso di funzionare ... Programma chiuso/debug". che non è appropriato nel mio caso (lato server). L'utilità dovrebbe arrestare/terminare silenziosamente senza effetti visibili.

Per fare ciò ho installato SEH per un'eccezione non gestita (setUnHandlexceptionFilter). Il gestore è perfettamente invocato per eccezioni come AV ( *(PDword) 0 = 0), ma per qualche motivo non è invocato nel caso della corruzione dell'heap. La corruzione avviene a Dllmain di una delle DLL della libreria di terze parti mentre viene scaricata.

Un paio di domande. Qualcuno può spiegare perché il gestore non è invocato? C'è qualche altro modo per impedire quella finestra di dialogo?

È stato utile?

Soluzione

Apparentemente è intenzionale che le corruzioni heap non possano essere catturate da gestori di eccezioni definiti dall'utente, anche se vengono emessi come eccezioni con il proprio codice di eccezione (0xc0000374 "status_heap_corruption"). Ecco un rapporto di bug C ++ visivo che è stato sostanzialmente chiuso come "Will Fix":

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

Come hai scoperto, questo non è un bug nel compilatore o nel sistema operativo. La corruzione di heap che la funzione causa viene trattata come un errore critico e come parte della gestione di tale errore, il sistema operativo termina il processo. Questo è ciò che fa invocare i tuoi gestori di eccezione.

Immagino che il report di errori di Windows o altri modi di creare un dump di crash potrebbero ancora prenderlo.

Per quanto riguarda la prevenzione della finestra di dialogo, nel registro è possibile disabilitare completamente o semplicemente disabilitare la finestra di dialogo in modo che il processo non blocchi:

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

Altri suggerimenti

Ma per qualche motivo non è invocato nel caso della corruzione dell'heap. La corruzione avviene a Dllmain di una delle DLL della libreria di terze parti mentre viene scaricata.

La corruzione di heap è un comportamento indefinito. Può lanciare eccezioni, può fare diversamente. Se una biblioteca di terze parti sta incasinando il tuo mucchio, allora la domanda è "Perché permetti loro di scherzare con il tuo heap in primo luogo?"

La finestra di dialogo "Programma ha smesso di funzionare" viene mostrato ogni volta che un processo termina in modo anomalo. Non tutte le terminazioni di processo anormali derivano da eccezioni. Molti errori (come lo stack overflow, lo stack disallineato, ecc.) Causano la terminazione istantanea del processo, che può mostrare quel messaggio ma non ti darà la possibilità di gestire l'errore.

(Inoltre, vedi il fantastico commento di Hans sopra)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top