<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Visual Studio 2010 Beta 1</title>
        <link>http://blogs.ugidotnet.org/leonardo/category/Visual Studio 2010 Beta 1.aspx</link>
        <description>Visual Studio 2010 Beta 1</description>
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Debug Post-Mortem step by step con Visual Studio 2010</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/05/22/debug-post-mortem-step-by-step-con-visual-studio-2010.aspx</link>
            <description>&lt;p&gt;Se la nostra applicazione va in errore fuori dal nostro ambiente di sviluppo e non riusciamo a riprodurre il problema (seguendo eventualmente la procedura indicata dal nostro cliente) iniziano inevitabilmente i… dolori!&lt;/p&gt;
&lt;p&gt;Spesso l’unica arma di cui disponiamo con applicazioni scritte in codice gestito è lo &lt;a href="http://msdn.microsoft.com/it-it/library/system.diagnostics.stacktrace.aspx"&gt;StackTrace&lt;/a&gt; ovvero la sequenza di funzioni che sono state chiamate prima della manifestazione del fatidico errore ma nella maggior parte dei casi non basta a capire dove si è verificato realmente il problema, serve una completa istantanea dello stato dell’applicazione (o memoria del processo) che comprenda sia la cronologia delle funzioni chiamate sia i valori delle variabili interne.&lt;/p&gt;
&lt;p&gt;Nel mondo Windows l’istantanea si traduce in Mini Dumps e Full Dumps, in poche parole istantanee di parte della memoria del processo e istantanee della memoria del processo assieme alla memoria degli altri moduli (anche di sistema) caricati.&lt;/p&gt;
&lt;p&gt;Il vantaggio nell’uso di Mini Dumps si traduce in dimensioni minori, solamente alcune sezioni della memoria del processo sono salvate, moduli come user32.dll non sono salvati poiché è possibile recuperare una copia dei file dal CD di Windows della corrispondente versione.&lt;/p&gt;
&lt;p&gt;Fino ad oggi WinDbg (Windows Debugger) con SOS.dll (Son of Strike, un’estensione per il debugging di applicazioni gestite) erano la lunga e dura strada da intraprendere che richiedeva parecchio studio e dedizione per riuscire a scoprire la causa dell’errore partendo dal Dump del crash.&lt;/p&gt;
&lt;p&gt;Visual Studio 2010 apre nuove strade al debug Post-Mortem ovvero al debug di applicazioni dopo l’errore, permette infatti di aprire i file dump del crash di applicazioni gestite e visualizzarne lo stato(stack, variabili locali, etc..) senza utilizzare SOS e rendere quindi più rapido e confortevole il debug.&lt;/p&gt;
&lt;p&gt;Per poter eseguire il debug dobbiamo disporre oltre che al file dump (.dmp) del crash anche dei sorgenti e del file dei simboli (.pdb) corrispondente ai binari dell’applicazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;NB: E’ buona norma conservare sempre i file .pdb e i sorgenti delle release distribuite a terzi della nostra applicazione.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Passiamo adesso alla pratica e vediamo un caso pratico di debug “Post-Mortem”:&lt;/p&gt;
&lt;p&gt;Apriamo Visual Studio 2010 e creiamo una nuova applicazione Windows Forms 4.0 inserendo del semplice codice a scopo dimostrativo che generi un’errore di divisione per zero:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/1_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="1" border="0" alt="1" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/1_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Eseguiamo in modalità Release la nostra applicazione e alla segnalazione dell’eccezione da parte di Visual Studio salviamo il Dump andando su &lt;strong&gt;Debug/Save Dump As..&lt;/strong&gt;, in scenari reali dovremo modificare la nostra applicazione per creare automaticamente un Dump in caso di crash e spedircelo se il cliente acconsente o più semplicemente potremmo registrarci a &lt;a href="https://winqual.microsoft.com/"&gt;WinEqual&lt;/a&gt; per poter ricevere i dump della segnalazione standard di errori di Windows.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/2_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="2" border="0" alt="2" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/2_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/3_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="3" border="0" alt="3" width="550" height="383" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/3_thumb.png" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;em&gt;Il dump del crash può raggiungere centinaia di megabyte&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Utilizzando Windows Vista o Windows 7 possiamo anche creare tramite Task Manager (Gestione Attività) il MiniDump del processo scegliendo &lt;strong&gt;Create Dump file&lt;/strong&gt; (Crea file di dettagli) dalla scheda Processi.&lt;/p&gt;
&lt;p&gt;NB: Il dump così creato non è però utilizzabile dalla versione Visual Studio 2010 Beta 1. La strada suggerita è utilizzare &lt;a href="http://msdn.microsoft.com/en-us/library/ff537953(v=VS.85).aspx"&gt;AdPlus&lt;/a&gt; per catturare il dump della propria applicazione in "produzione".&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/12_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="12" border="0" alt="12" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/12_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Creiamo ora una nuova soluzione vuota in Visual Studio per analizzare il nostro file di dump&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/4_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="4" border="0" alt="4" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/4_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Aggiungiamo alla soluzione un nuovo elemento esistente facendo click destro sulla soluzione nel Solution Explorer e scegliendo &lt;strong&gt;Add Existing Item&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/5_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="5" border="0" alt="5" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/5_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Indichiamo il file di crash del dump salvato in precedenza.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/6_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="6" border="0" alt="6" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/6_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Verrà automaticamente mostrata una schermata con alcune informazioni sul file Dump, indichiamo però prima di iniziare il Debug la cartella contenente il file .pdb della nostra applicazione cliccando su &lt;strong&gt;Set symbol paths&lt;/strong&gt; (se non visibile subito sarà necessario scorrere la finestra verso destra).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/8_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="8" border="0" alt="8" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/8_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nella finestra di dialogo Symbols che apparirà clicchiamo sull’icona della cartella per indicare la posizione del nostro file .pdb.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/9_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="9" border="0" alt="9" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/9_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clicchiamo infine &lt;strong&gt;start debugging&lt;/strong&gt; (la grossa freccia verde) per iniziare ad analizzare l’applicazione proprio dallo stato in cui avevamo salvato il file dump&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/7_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="7" border="0" alt="7" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/7_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;L’esperienza di debug sarà simile ad un normale debug in fase di sviluppo (con alcune limitazioni), andando col mouse sopra alle variabili appariranno i valori contenuti. Se richiesto indichiamo la posizione dei file sorgenti necessari per visualizzare il codice (dovranno ovviamente essere la stessa versione dell’eseguibile crashato)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/10_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="10" border="0" alt="10" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/10_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Cliccando sull’icona alla destra del valore possiamo inserire dei commenti per migliorare la collaborazione con gli altri sviluppatori se al progetto hanno partecipato più persone.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/11_2.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="11" border="0" alt="11" width="550" height="385" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DebugPostMortemconVisualStudio2010_E2AD/11_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le nuove funzionalità di debug di Visual Studio 2010 rappresentano un grande passo in avanti per colmare il gap con il debug post-mortem di applicazioni native e sicuramente si renderanno molto utili in scenari client/server dove costituiranno un insostituibile aiuto allo sviluppatore.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/96265.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/05/22/debug-post-mortem-step-by-step-con-visual-studio-2010.aspx</guid>
            <pubDate>Fri, 22 May 2009 00:35:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/05/22/debug-post-mortem-step-by-step-con-visual-studio-2010.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/96265.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/96265.aspx</trackback:ping>
        </item>
    </channel>
</rss>