Autopsia di un'applicazione - seconda puntata gli MDA (Managed Debug Assistants)

A partire dal .NET Framework 2.0, abbiamo introdotto un nuovo strumento per il debugging dei problemi tradizionalmente difficili da diagnosticare.

I cosiddetti MDA (Managed Debugging Assistants) consentono di trattare alcune condizioni come eccezioni così da dare l'opportunità di attaccare un debugger.

Per avere la lista completa degli MDA fate riferimento a questa pagina su MSDN: Diagnosing Errors with the Managed Debugging Assistants

Giusto per dare un'aneddoto che mostra la potenza degli MDA, concentriamo l'attenzione su invalidOverlappedToPInvoke.

Nel 2005, quando le date per il release to manifacturing (RTM) di Visual Studio 2005 e SQL Server 2005 stavano avvicinandosi rapidamente, eravamo alla dispearata ricerca delle cause di un numero anomalo di NT Heap corruptions che lo stress testing stava trovando. Dopo uno stillicidio di due mesi, decidemmo di dedicare l'intero reliability team di entrambi i prodotti a scovare il colpevole. Dopo quattro settimane di immersione full time in memory dump e stack traces, la causa fu trovata in un'innocente funzione che faceva I/O sulla rete attraverso un I/O completion port.

Questo meccanismo dell'OS consente di trasferire il controllo dell'operazione ad un kernel thread e gestisce il messaging con l'applicazione chiamante. I dati sono scambiati attraverso una struct OVERLAPPED allocata dal caller in user mode e scritta dal kernel thread.

Il codice che aveva causato il patatrac non aveva fatto nulla di terribile, ed era formalmente corretto (motivo per cui non lo avevamo trovato immediatamente). L'unico problema era che la struttura OVERLAPPED era allocata sulla GC heap e non era pinned. Questo faceva sì che in certi casi la struttura venisse processata dal garbage collector prima che l'operazione di I/O potesse finire. Quando questo succedeva, il kernel thread scriveva sull'NT Heap handle che gli era stata passata, ma questa memoria era nel migliore dei casi free memory nel GC Heap o qualche altro oggetto (da cui le corruption).

Dopo questa avventura, introducemmo questo MDA, che genera un'eccezione a runtime ogni volta che una struttura OVERLAPPED allocata tramite P/Invoke è passata ad un kernel thread ed è raccolta dal garbage collector prima del tempo.

Per cui, se la vostra applicazione vi sta facendo impazzire e le avete provate tutte, forse un semplice

 Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework] "MDA"="1"

 

Può essere utile.

 

A presto

 

--Alessandro

Nella stessa categoria

Commenti
simone_b scrive:
Autopsia di un'applicazione - seconda puntata gli MDA (Managed Debug Assistants)

Già, è stata la stessa mia sensazione Daniele. C'è sempre (troppo) da imparare!
13/04/2008 ore 10.24
Daniele Bochicchio scrive:
Re: Autopsia di un'applicazione - seconda puntata gli MDA (Managed Debug Assistants)

Alessandro Catorcini wrote:
A partire dal .NET Framework 2.0, abbiamo introdotto un nuovo strumento per il debugging dei problemi tradizionalmente difficili da diagnosticare.

questi post mi fanno paura, perchè mi fanno capire che sei avanti (o io sono indietro, è chiaramente un problema di prospettiva)...
07/04/2008 ore 14.29

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - Il lato oscuro - Il blog di Alessandro Catorcini

TagCloud
BLOG INFO
  • Post: 9
  • Commenti: 13
  • TrackBacks: 1
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA