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

di Alessandro Catorcini, in Diagnostica,

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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese