Il programma di dll di terze parti si arresta in modo anomalo senza eccezione

Sto usando Visual Studio 2010, e la codifica in C #. Ho una DLL di terze parti che sto usando nel mio progetto. Quando cerco di utilizzare un metodo specifico, in occasioni apparentemente casuali, il programma si blocca semplicemente, senza eccezione. La sessione finisce semplicemente. C’è un modo per rintracciare cosa sta succedendo?

Il modo in cui la pila per un thread è disposta in Windows va così (all’incirca, questa non è una descrizione esatta di tutto ciò che accade, quanto basta per darti l’essenza.E il modo in cui il CLR gestisce le pagine dello stack è leggermente diverso da come il codice non gestito lo gestisce anche.)

In cima allo stack ci sono tutte le pagine impegnate che stai utilizzando. Poi c’è una “pagina di guardia”: se colpisci quella pagina, la pagina di guardia diventa una nuova pagina di stack e la pagina successiva diventa la nuova pagina di guardia. Tuttavia, l’ ultima pagina di stack è speciale. Se lo colpisci una volta, ottieni un’eccezione di overflow dello stack. Se lo colpisci due volte, il processo termina immediatamente . Con “immediatamente” intendo “immediatamente” – nessuna eccezione, vai dritto in prigione, non passare, non raccogliere $ 200. Il sistema operativo spiega che a questo punto il processo è profondamente malato e forse è diventato triggersmente ostile all’utente. Lo stack è stato sovraccaricato e il codice che sta straripando lo stack potrebbe tentare di scrivere in modo arbitrario molti rifiuti in memoria. (*)

Poiché il processo è potenzialmente pericoloso per se stesso e per gli altri, il sistema operativo lo elimina senza consentire l’esecuzione di altri codici.

Il mio sospetto è che qualcosa nel tuo codice non gestito stia colpendo due volte la pagina dello stack finale. Quasi ogni volta che vedo un processo scomparire improvvisamente senza eccezioni o altre spiegazioni perché è stata colpita la pagina dello stack “non mi pasticciare”.

(*) Nei primi anni ’90 ho lavorato su driver di database per un piccolo sistema operativo chiamato NetWare. Non aveva questo genere di protezioni che i sistemi operativi più moderni ora hanno regolarmente. Avevo bisogno di essere in grado di “cambiare stack” dynamicmente durante l’esecuzione a livello di protezione del kernel; Sapevo quando il mio autista aveva bruciato accidentalmente lo stack perché alla fine avrebbe scritto nella memoria dello schermo e avrei quindi potuto eseguire il debug del problema osservando ciò che la spazzatura era stata scritta direttamente sullo schermo. Ah, quelli erano i giorni.

Cerca di forzare il debugger a catturare anche le eccezioni gestite, specialmente quelle cattive come Access Violation e Stack Overflow. Puoi farlo in Debug -> Eccezioni. È ansible che la DLL di terze parti rilevi tutte le eccezioni e quindi chiama exit () o qualche bellezza simile che esce dall’intero programma.

Hai controllato il registro eventi di Windows ? Puoi accedervi dal menu Strumenti di amministrazione> Visualizzatore eventi. Controllare in particolare i registri dell’applicazione e di sistema.

Se la tua DLL di terze parti è gestita, utilizzando Runtime Flow (sviluppato da me) puoi vedere cosa succede al suo interno prima dell’arresto anomalo: un overflow dello stack, un’uscita forzata o un’eccezione saranno chiaramente identificabili.