<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Sébastien Bovo [Microsoft France]  : Debogage</title><link>http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx</link><description>Tags: Debogage</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Debogage .NET 4.0</title><link>http://blogs.msdn.com/sbovo/archive/2009/11/30/debugnet40.aspx</link><pubDate>Mon, 30 Nov 2009 20:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9927871</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9927871.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9927871</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9927871</wfw:comment><description>&lt;p&gt;&lt;a title="VS2010 et .NET Fx 4.0" href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" target="_blank"&gt;Visual Studio 2010 et le .NET Framework 4&lt;/a&gt; sont disponible en Beta 2 depuis quelques semaines. Afin de vérifier un comportement qui m’a un peu surpris, je vais les utiliser pour le débogage.&lt;/p&gt;  &lt;p&gt;Voici le contexte : Dans un précédent billet, je parlais du &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/07/09/deploymentretailtruepourasp-net.aspx" target="_blank"&gt;deployment retail=&amp;quot;true&amp;quot; pour ASP.NET&lt;/a&gt; en faisant référence au &lt;a title="Don’t run production ASP.NET Applications with debug=”true” enabled" href="http://weblogs.asp.net/scottgu/archive/2006/04/11/Don_1920_t-run-production-ASP.NET-Applications-with-debug_3D001D20_true_1D20_-enabled.aspx" target="_blank"&gt;billet de Scott Guthrie&lt;/a&gt;. Je pensais que retail=true était la solution pour s’affranchir du debug=true dans tous les Web.config du serveur. C’est seulement en parti vrai car le timeout des pages ASP.NET n’est pas modifié et reste démesuré si vous avez debug=true dans votre Web.config.&lt;/p&gt;  &lt;p&gt;Voici la preuve…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Page d’exemple&lt;/h3&gt;  &lt;p&gt;J’utilise un page exemple qui ne se termine jamais. Dans la vrai vie, nous aurons une boucle infinie plus complexes ou un bloclage quelconque. Dans tous les cas, le débogage est identique. Mon but est d’obtenir le timeout des pages ASP.NET. &lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;&lt;/p&gt;            &lt;p&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/a&gt;&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e)              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime t1 = DateTime.Now;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="background: yellow; mso-highlight: yellow"&gt;while (true)&lt;/span&gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime t2 = DateTime.Now;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }               &lt;br /&gt;&amp;lt;/script&amp;gt; &lt;/p&gt;            &lt;p&gt;&amp;lt;html xmlns=&amp;quot;&lt;a href="http://www.w3.org/1999/xhtml&amp;quot;"&gt;http://www.w3.org/1999/xhtml&amp;quot;&lt;/a&gt;&amp;gt;               &lt;br /&gt;&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;               &lt;br /&gt;&amp;lt;/head&amp;gt;               &lt;br /&gt;&amp;lt;body&amp;gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;div&amp;gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/div&amp;gt;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/form&amp;gt;               &lt;br /&gt;&amp;lt;/body&amp;gt;               &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Clin d’œil à Visual Studio 2010 et l’utilisation du zoom (CTRL+mollette de la souris) :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_8.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="VS2010" border="0" alt="VS2010" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb.png" width="544" height="321" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Cette page doit être positionnée dans un site Web utilisant un pool d’application configuré avec le Framework 4.0.&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WhileTrueSite4" border="0" alt="WhileTrueSite4" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_1.png" width="544" height="353" /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ASP.NET V4.0" border="0" alt="ASP.NET V4.0" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_7.png" width="342" height="238" /&gt;&lt;/p&gt;  &lt;p&gt;Avant de lancer WinDbg, naviguons vers notre page de test.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Lancement de WinDbg, chargement des symboles et SOS&lt;/h3&gt;  &lt;p&gt;Veillez bien à lancer Windbg en tant qu’administrateur et attachez-vous au processus W3WP.EXE en cours d’exécution (F6) :&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_10.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WinDbg" border="0" alt="WinDbg" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_2.png" width="544" height="789" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Chargement des symboles publics :&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols/&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Chargement de SOS livré avec le .NET Framework 4.0 :&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;.load C:\Windows\Microsoft.NET\Framework\v4.0.21006\SOS&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Affichage des objets&lt;/h3&gt;  &lt;p&gt;Maintenant, cherchons notre page en court d’exécution&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;!DumpHeap -type System.Web.HttpContext&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_16.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DumpHeapHttpContext" border="0" alt="DumpHeapHttpContext" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_5.png" width="542" height="294" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;!do 062d9d18&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_18.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="HttContext" border="0" alt="HttContext" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_6.png" width="542" height="389" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Comme il s’agit d’un objet de type TimeSpan, nous devons utiliser la méthode !DumpVC (Pour information, voici le pointeur MSDN vers SOS - &lt;a title="SOS sur MSDN" href="http://msdn.microsoft.com/en-us/library/bb190764.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/bb190764.aspx&lt;/a&gt;)&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;!DumpVC 532747bc 062d9dd0&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_20.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Timeout" border="0" alt="Timeout" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_7.png" width="542" height="146" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La valeur du timeout donnée est un nombre de ticks CPU. Sachant qu’il y a 10000 ticks par millisecondes. Pour obtenir le temps en secondes, nous devons donc diviser la valeur par 10000 puis par 1000. Utilisons Windbg comme calculatrice :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;?1100000000/10000/1000&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WinDbgCommeCalculatrice" border="0" alt="WinDbgCommeCalculatrice" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_25.png" width="333" height="38" /&gt;&lt;/p&gt;  &lt;p&gt;Le timeout de la page ASPX est de 110 secondes.&lt;/p&gt;  &lt;p&gt;Nous avons bien le comportement normal et celui par défaut décrit dans le fichier &amp;quot;Web.config.comments&amp;quot; :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_27.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="web.config.comments" border="0" alt="web.config.comments" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_10.png" width="544" height="183" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Maintenant, regardons avec exactement la même démarche, ce que nous avons avec debug=true (dans Web.config) et retail=true (dans le Machine.config) :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_29.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="debugtrue" border="0" alt="debugtrue" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_11.png" width="544" height="58" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_31.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="retailtrue" border="0" alt="retailtrue" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_12.png" width="344" height="60" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Je vous passe toutes les copies d’écran, voici juste les deux dernières commandes :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_33.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TimeoutPourHttpContext" border="0" alt="TimeoutPourHttpContext" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/image_thumb_13.png" width="542" height="148" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TimeoutDebug" border="0" alt="TimeoutDebug" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebugNET40_B427/66_3.png" width="385" height="41" /&gt; &lt;/p&gt;  &lt;p&gt;Le timeout est de 30 000 000 secondes soit 347 jours. Effectivement, dans ce cas, nous avons tout le temps de déboguer nos pages… Et le retail=true n’a pas changé ce comportement.&lt;/p&gt;  &lt;p&gt;La conclusion est : &lt;strong&gt;vérifiez que vous n’avez pas debug=true dans tous les Web.config en production même si vous avez retail=true&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Plutôt intéressant&amp;#160; :-) Qu’en pensez-vous ?&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9927871" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx">Outils</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/WinDbg/default.aspx">WinDbg</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/.NET+Fx+4.0/default.aspx">.NET Fx 4.0</category></item><item><title>Debogage Silverlight avec WinDbg et SOS - C'est possible !</title><link>http://blogs.msdn.com/sbovo/archive/2009/10/30/debogagesilverlightavecwindbgetsos-cestpossible.aspx</link><pubDate>Fri, 30 Oct 2009 16:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9895116</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9895116.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9895116</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9895116</wfw:comment><description>&lt;p&gt;Tout comme les applications développées en .NET, qu'elles soient clientes (Windows Forms, WPF) ou serveurs (ASP.NET, Service Windows, WCF), les applications Silverlight ont aussi le droit d’être déboguées !&lt;/p&gt;  &lt;p&gt;Comment analyser un crash ou une fuite mémoire de nos applications riche Internet ? &amp;quot;Tout simplement&amp;quot; (façon de parler) de la même manière que pour toutes les autres... avec WinDbg.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff8000"&gt;Cela veut donc dire que ce que nous avons vu sur le débogage .NET avec WinDbg et SOS est valable : C’est un luxe de pouvoir s’appuyer sur ses acquis !&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Si vous n’êtes pas familier avec WinDbg et SOS, je vous invite à lire mes précédents articles :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Premiers pas avec WinDbg -&amp;#160; &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/06/19/premierpasavecwindbg.aspx"&gt;http://blogs.msdn.com/sbovo/archive/2009/06/19/premierpasavecwindbg.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Debogage .NET avec WinDbg et SOS - Threads - &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx"&gt;http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Debogage .NET avec WinDbg et SOS - Objects -&amp;#160; &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/07/06/debogage-netavecwindbgetsos-objects.aspx"&gt;http://blogs.msdn.com/sbovo/archive/2009/07/06/debogage-netavecwindbgetsos-objects.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Debogage .NET avec WinDbg et SOS - Travaux Pratiques -&amp;#160; &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/08/04/debogage-netavecwindbgetsos-travauxpratiques.aspx"&gt;http://blogs.msdn.com/sbovo/archive/2009/08/04/debogage-netavecwindbgetsos-travauxpratiques.aspx&lt;/a&gt; &lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Allez zou… Démonstration !&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;1. Exemple d’application&lt;/h3&gt;  &lt;p&gt;Prenons un exemple le plus simple possible. Le but est de pouvoir être capable de visualiser nos appels de fonctions et nos objets. Pour ce faire, j’ai créé un nouvelle application Silverlight et modifié le code associé à la page par défaut (&amp;quot;MainPage.xaml.cs&amp;quot;) :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;J’utilise une liste d’objets d’un type particulier &amp;quot;Elt&amp;quot; &lt;strong&gt;&amp;gt; Ce qui me permettra de les différencier dans WinDbg &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Cette liste est rempli au démarrage et je marque un temps d’arrêt avec un message destiné à l’utilisateur &lt;strong&gt;&amp;gt; Ce qui me laissera le temps de lancer WinDbg et m’attacher au processus &lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Voici le code (mémorisez l’espace de nom)    &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;             &lt;p&gt;namespace ExempleSL                &lt;br /&gt;{                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public partial class MainPage : UserControl                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private List&amp;lt;Elt&amp;gt; listeElements = new List&amp;lt;Elt&amp;gt;(); &lt;/p&gt;              &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public MainPage()                &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; 10; i++)                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listeElements.Add(new Elt() { Name = &amp;quot;elt&amp;quot; + DateTime.Now.Millisecond, Donnees = i });                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBox.Show(&amp;quot;Continuer ?&amp;quot;);                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;              &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public class Elt                &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name { get; set; }                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int Donnees { get; set; }                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }                 &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }                 &lt;br /&gt;}&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;C’est parti : lancement de l’application avec CTRL+F5 dans Visual Studio. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ExempleSL" border="0" alt="ExempleSL" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_8.png" width="377" height="299" /&gt; &lt;/p&gt;  &lt;p&gt;Le message apparait : nous pouvons lancer le débogueur pour regarder ce que nous avons en mémoire.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;  &lt;h3&gt;2. S’attacher au processus avec WinDbg&lt;/h3&gt;  &lt;p&gt;Les applications Silverlight s’exécutent dans le navigateur. Il ne faut donc pas chercher à prendre un dump ou s’attacher à ExempleSL.exe mais plutôt à iexplore.exe.&lt;/p&gt;  &lt;p&gt;Lançons WinDbg en tant qu’administrateur et attachons-nous au processus avec &amp;quot;FILE / Attach to process…&amp;quot; ou F6. Prenons iexplore.exe.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WinDbg" border="0" alt="WinDbg" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_11.png" width="482" height="138" /&gt; &lt;/p&gt;  &lt;p&gt;Ensuite, comme nous le faisons à l’accoutumé, 3 étapes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Renseignement du &lt;strong&gt;serveur de symboles&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Chargement des symboles&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;.reload&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Chargement de l’extension SOS&lt;/strong&gt; pour Silverlight &lt;/li&gt; &lt;/ul&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;.load &lt;span style="background: yellow; mso-highlight: yellow"&gt;c:\Program Files (x86)\Microsoft Silverlight\3.0.40818.0\sos&lt;/span&gt;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Notez bien que nous avons une version sos.dll par version du Framework dans C:\windows\Microsoft.NET\Framework\vX et un une version sos.dll par version de Silverlight.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;3. Deboguer&lt;/h3&gt;  &lt;p&gt;La liste des commandes disponibles de SOS est donnée par    &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;             &lt;p&gt;!help&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windbg !help" border="0" alt="Windbg !help" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_17.png" width="550" height="794" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour savoir quel code est en cours d’exécution dans notre application, nous lançons une commande qui s’exécutera sur tous les threads du processus. Cette commande est &amp;quot;&lt;strong&gt;&lt;font color="#008000"&gt;!ClrStack&lt;/font&gt;&lt;/strong&gt;&amp;quot;. Elle nous permet d’obtenir la pile d’appel d’un thread.&amp;#160; &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;             &lt;p&gt;~*e !ClrStack&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Beaucoup de threads ne sont pas en cours d’exécution de code Silverlight :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_21.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_thumb_7.png" width="550" height="82" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Mais le thread 5, l’est :&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_19.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Windbg !ClrStack" border="0" alt="Windbg !ClrStack" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_thumb_6.png" width="550" height="89" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;ESP&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EIP&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;02abd4f4 77cd9a94 [NDirectMethodFrameStandalone: 02abd4f4] MS.Internal.XcpImports.MessageBox_ShowCoreNative(IntPtr, System.String, System.String, UInt32, Int32 ByRef)             &lt;br /&gt;02abd510 03fd84f2 MS.Internal.XcpImports.MessageBox_ShowCore(System.String, System.String, UInt32)             &lt;br /&gt;02abd52c 03fd8449 System.Windows.MessageBox.ShowCore(System.String, System.String, System.Windows.MessageBoxButton)             &lt;br /&gt;02abd55c 03fd835c &lt;span style="background: yellow; mso-highlight: yellow"&gt;System.Windows.MessageBox.Show&lt;/span&gt;(System.String)             &lt;br /&gt;02abd56c 03f40376 &lt;span style="background: yellow; mso-highlight: yellow"&gt;ExempleSL.MainPage..ctor&lt;/span&gt;()             &lt;br /&gt;02abd5c8 03f401fe &lt;span style="background: yellow; mso-highlight: yellow"&gt;ExempleSL.App.Application_Startup&lt;/span&gt;(System.Object, System.Windows.StartupEventArgs)             &lt;br /&gt;02abd5e0 03fa69c9 System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32, System.Delegate, System.Object, System.Object)             &lt;br /&gt;02abd6a0 03fa3b04 MS.Internal.JoltHelper.FireEvent(IntPtr, IntPtr, Int32, System.String)             &lt;br /&gt;02abd884 694917b0 [GCFrame: 02abd884]             &lt;br /&gt;02abd940 694917b0 [ContextTransitionFrame: 02abd940]             &lt;br /&gt;02abda38 694917b0 [UMThkCallFrame: 02abda38]&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Nous voyons donc noir sur blanc, le &amp;quot;cheminement&amp;quot; d’exécution.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;D’abord nous avons le démarrage de l’application avec &amp;quot;ExempleSL.App.Application_Startup&amp;quot; &lt;/li&gt;    &lt;li&gt;Puis le constructeur de la clase MainPage (&amp;quot;ExempleSL.MainPage..ctor&amp;quot;) &lt;/li&gt;    &lt;li&gt;Et enfin, l’affichage de notre message : &amp;quot;System.Windows.MessageBox.Show&amp;quot; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Est-il possible de visualiser nos objets en mémoire ?&lt;/p&gt;  &lt;p&gt;Oui, la méthode &amp;quot;&lt;font color="#008000"&gt;&lt;strong&gt;!DumpHeap&lt;/strong&gt;&lt;/font&gt;&amp;quot; nous donne tous les objets .NET en mémoire. Le paramètre &amp;quot;-type&amp;quot; nous permet de filtrer sur les objets dont le nom de la classe contient &amp;quot;ExempleSL&amp;quot;. &lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;!DumpHeap -stat -type ExempleSL&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_25.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="WinDbg !DumpHeap" border="0" alt="WinDbg !DumpHeap" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/DebogageSilverlightAvecWinDbgEtSOSCestPo_135FB/image_thumb_9.png" width="550" height="69" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;total 13 objects              &lt;br /&gt;Statistics:               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MT&amp;#160;&amp;#160;&amp;#160; Count&amp;#160;&amp;#160;&amp;#160; TotalSize Class Name               &lt;br /&gt;039d3dcc&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 24 System.Collections.Generic.List`1[[ExempleSL.MainPage+Elt, ExempleSL]]               &lt;br /&gt;039d3868&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 44 ExempleSL.App               &lt;br /&gt;039d3c24&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 84 ExempleSL.MainPage               &lt;br /&gt;039d3d6c&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 10&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 160 ExempleSL.MainPage+Elt&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Nous avons bien&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Notre liste &lt;/li&gt;    &lt;li&gt;1 objet pour notre application &lt;/li&gt;    &lt;li&gt;1 objet pour notre page &lt;/li&gt;    &lt;li&gt;Les 10 éléments de la liste &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;cqfd :-)&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9895116" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/WinDbg/default.aspx">WinDbg</category></item><item><title>"Deboguer ce dump" dans le menu contextuel de l’explorateur Windows</title><link>http://blogs.msdn.com/sbovo/archive/2009/05/14/deboguercedumpdanslmenucontextueldelexplorateurwindows.aspx</link><pubDate>Thu, 14 May 2009 15:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9583658</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9583658.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9583658</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9583658</wfw:comment><description>&lt;p&gt;Voici un petit raccourci bien pratique lorsque vous avez à ouvrir des dumps avec WinDbg :&lt;/p&gt;  &lt;table&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;           &lt;p&gt;Windows Registry Editor Version 5.00 &lt;/p&gt;            &lt;p&gt;; Ajout de la fonctionnalité d’ouverture en double clic d’un dump par WinDbg dans le menu contextuel de l'explorateur Windows              &lt;br /&gt;; Cette fonctionnalité est ajouté pour les fichiers .DMP &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\.dmp]              &lt;br /&gt;@=&amp;quot;SB-DebugDumpFile&amp;quot; &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\SB-DebugDumpFile] &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\SB-DebugDumpFile\DefaultIcon]              &lt;br /&gt;@=&amp;quot;c:\\debuggers\\windbg.exe&amp;quot; &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\SB-DebugDumpFile\Shell] &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\SB-DebugDumpFile\Shell\SB-DebugThisDump]              &lt;br /&gt;@=&amp;quot;-&amp;gt; Deboguer ce dump&amp;quot; &lt;/p&gt;            &lt;p&gt;[HKEY_CLASSES_ROOT\SB-DebugDumpFile\Shell\SB-DebugThisDump\Command]              &lt;br /&gt;@=&amp;quot;\&amp;quot;C:\\debuggers\\windbg\&amp;quot; -z \&amp;quot;%1\&amp;quot;&amp;quot;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;A noter, que j’utilise le chemin &amp;quot;c:\debuggers\windbg.exe&amp;quot; ; N’oubliez pas de le changer si vous avez les outils de débogage dans un autre répertoire.&lt;font face="Courier New"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Maintenant, un double clic sur un dump suffit pour l’ouvrir dans WinDbg !&lt;/p&gt;  &lt;p&gt;A bientôt,&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9583658" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx">Outils</category></item><item><title>Plan d‘action pour la capture des informations lors d’un problème de production IIS</title><link>http://blogs.msdn.com/sbovo/archive/2009/05/13/plandactioncapturedumpslogsretablissementiis.aspx</link><pubDate>Wed, 13 May 2009 17:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9590854</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9590854.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9590854</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9590854</wfw:comment><description>&lt;p&gt;Je fais suite à mon précédent billet sur &lt;a title="Billet précédent : Déboguer une application en production... Mais pour quoi faire ?" href="http://blogs.msdn.com/sbovo/archive/2009/05/05/debogueruneapplicationenproductionmaispourquoifaire.aspx" target="_blank"&gt;l’introduction sur le débogage en production&lt;/a&gt; afin de vous donner plus de précisions sur la collecte d’informations lors de l’apparition d’un problème en production.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Dans tous les cas se présentant à vous, je vous conseille de récupérer des serveurs Web les logs IIS, les logs HTTPErr et vos logs applicatifs. Vous trouverez les explications dans le billet &lt;a title="Billet précédent : Données à récolter pour un travail de surveillance ou d&amp;#39;investigation sur un serveur Web" href="http://blogs.msdn.com/sbovo/archive/2008/11/26/donneesARecolterPpourUnTravailDeSurveillanceOouDInvestigationSurUnServeurWeb.aspx" target="_blank"&gt;Données à récolter pour un travail de surveillance ou d'investigation sur un serveur Web&lt;/a&gt;. Ces logs nous permettent de vérifier la charge utilisateur, les temps de réponses, les erreurs HTTP : ce sont des informations précieuses à relier avec le comportement observé de l’application. Aussi, si vous avez la possibilité de &lt;a title="Billet précédent : Performances de vos applications ASP.NET - Quels compteurs étudier ?" href="http://blogs.msdn.com/sbovo/archive/2008/10/31/PerformancesApplicationsASPNETQuelsCompteurs.aspx" target="_blank"&gt;prendre un log Perfmon&lt;/a&gt;, cela constitue un apport d’informations supplémentaires.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;D’un point de vue système, je résumerais les problématiques de production en deux comportements distincts :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;font color="#804000"&gt;Hang&lt;/font&gt; &lt;/strong&gt;=&amp;#160; Etat de blocage &amp;quot;deadlock&amp;quot; (avec ou sans 100% CPU) ou d’attente &amp;quot;hang&amp;quot; du processus &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;font color="#804000"&gt;Crash&lt;/font&gt;&lt;/strong&gt; = Arrêt &amp;quot;crash&amp;quot; du processus &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La prise de dumps peut se faire par le script Adplus. Voici comment faire : &lt;a title="Billet précédent : Procédures de prises de dumps pour un serveur Web" href="http://blogs.msdn.com/sbovo/archive/2008/11/25/proceduresDePrisesDeDumpsPourUnServeurWeb.aspx" target="_blank"&gt;Procédures de prises de dumps pour un serveur Web&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;D’une manière générale, vous pouvez utiliser Adplus pour les prises de dumps/logs pour tous les processus et pas pour IIS seulement. Les paramètres les plus utiles sont :&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="542"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="49"&gt;-p&lt;/td&gt;        &lt;td valign="top" width="30"&gt;–&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="461"&gt;Spécifie le PID du processus&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="49"&gt;-pn&lt;/td&gt;        &lt;td valign="top" width="30"&gt;–&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="461"&gt;Donne le nom du processus (plutôt que son PID)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="49"&gt;-o&lt;/td&gt;        &lt;td valign="top" width="30"&gt;–&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="461"&gt;Renseigne le répertoire de sortie pour la création du dumps&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Ainsi, pour une prise de dumps de plusieurs processus et la création des dumps dans un répertoire particulier, la commande ressemble à&lt;/p&gt;  &lt;p&gt;   &lt;table&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="border-bottom: 1px dotted; border-left: 1px dotted; border-top: 1px dotted; border-right: 1px dotted" bgcolor="#e1eaff" bordercolor="#000080"&gt;&lt;font face="Courier New"&gt;             &lt;p&gt;cscript.exe adplus.vbs -pn w3wp.exe -pn inetinfo.exe -crash -o c:\temp -quiet&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Deux autres paramètres sont utiles :&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="542"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="135"&gt;-NoDumpOnFirst &lt;/td&gt;        &lt;td valign="top" width="30"&gt;–&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="371"&gt;Permet de ne pas surcharger le débogueur (et donc le serveur) qui prend un mini dump pour chaque exception de première chance. Logue toutes les exceptions levées&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;-NoDumpOnSecond &lt;/td&gt;        &lt;td valign="top" width="30"&gt;–&amp;gt;&lt;/td&gt;        &lt;td valign="top" width="371"&gt;Aucune prise de dump mais seulement le remplissage d’un log permettant de visualiser toutes les exceptions levées&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Pour vous donner plus de précisions, en deux mots, il existe deux types d'exceptions : première chance et seconde chance.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Une exception de première chance&lt;/strong&gt; peut être interceptée par votre application par un try/catch ou un gestionnaire d’exceptions global &lt;/li&gt;    &lt;li&gt;Si cette exception n’est pas gérée, elle est à nouveau levée mais comme &lt;strong&gt;une exception de seconde chance&lt;/strong&gt;. Dans ce cas, seul un débogueur peut l’intercepter et si aucun débogueur n’est attaché, l’application se ferme (autrement dit : le processus crashe). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Par exemple, pour une prise d’un dump lors du crash de l’application &amp;quot;WpfApplication1.exe&amp;quot;, vous pouvez utiliser &amp;quot;cscript.exe adplus.vbs -crash -pn WpfApplication1.exe -o c:\temp -quiet&amp;quot;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_7.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Adplus.vbs" border="0" alt="Adplus.vbs" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_thumb_2.png" width="513" height="216" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cette commande a pour effet de brancher le débogueur &amp;quot;cdb.exe&amp;quot; au processus WpfApplication1.exe. Le debogueur logue toutes les exceptions dans un fichier pendant l’exécution du processus et si une exception de seconde chance est levée (provoquant l’arrêt du processus), un dump est pris.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_8.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="cdb.exe" border="0" alt="cdb.exe" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_thumb_3.png" width="511" height="260" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le répertoire de sortie contient les fichiers suivants :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Process_List.txt&lt;/strong&gt; - Liste des processus s’éxécutant sur la machine au moment du lancement de la commande &lt;/li&gt;    &lt;li&gt;un ou plusieurs fichiers du type &lt;strong&gt;PID-2852__WPFAPPLICATION1.EXE__Date_05-13-2009__Time_15-46-0303.log&lt;/strong&gt; - Log des exceptions levées par l’application &lt;/li&gt;    &lt;li&gt;un ou plusieurs fichiers du type &lt;strong&gt;PID-2852__WPFAPPLICATION1.EXE__2nd_chance_NET_CLR__full_0a70_2009-05-13_15-46-10-421_0b24.dmp&lt;/strong&gt; - Dump du processus &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_14.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="RepertoireSortie" border="0" alt="RepertoireSortie" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Plandactionpourlacapturedesinformationsl_D2E5/image_thumb_6.png" width="515" height="168" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A noter que le répertoire et les fichiers contiennent la date et l’heure exacte de la prise de dumps. Dans l’exemple précédent, il s’agit du 2009-05-13 pour le 13 mai et 15-46-10 pour 15h46m.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nous avons donc maintenant toutes les données nécessaires (en particulier les dumps) pour déboguer à tête reposée. Ouvrons le dump avec Windbg :-)&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt;&amp;gt; Suite : &lt;a title="Premiers pas avec WinDbg" href="http://blogs.msdn.com/sbovo/archive/2009/06/19/premierpasavecwindbg.aspx"&gt;Premiers pas avec WinDbg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9590854" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Données à récolter pour un travail de surveillance ou d'investigation sur un serveur Web</title><link>http://blogs.msdn.com/sbovo/archive/2008/11/26/donneesARecolterPpourUnTravailDeSurveillanceOouDInvestigationSurUnServeurWeb.aspx</link><pubDate>Wed, 26 Nov 2008 10:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9128171</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9128171.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9128171</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9128171</wfw:comment><description>&lt;P&gt;Afin de commencer un travail d’investigation sur le fonctionnement d’une application Web (erreurs, crashes, performance, fuites mémoire), les données les intéressantes à récupérer d’un serveur Web sont&amp;nbsp;:&lt;/P&gt;
&lt;P&gt;- &lt;B&gt;Logs IIS&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;- &lt;B&gt;Logs HTTPERR&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;- &lt;B&gt;Journaux d’événements&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;- Logs perfmon si possible&lt;/P&gt;
&lt;P&gt;- Dumps si necessaire&lt;/P&gt;
&lt;P&gt;Voici plus de précisions :&lt;/P&gt;
&lt;H4&gt;Logs IIS&lt;/H4&gt;
&lt;P&gt;Les logs IIS sont les fichiers contenus dans « C:\windows\system32\logfiles\W3SVCxxxx ». xxxx représente le numéro du site Web.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=W3SVC1 src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image002_3.jpg" width=346 height=226 mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image002_3.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Vous avez ensuite un ou plusieurs fichiers portant la date du jour&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=LogsIIS src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image004_3.jpg" width=405 height=482 mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image004_3.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Référence pour les codes IIS :&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Description of Microsoft Internet Information Services (IIS) 5.0 and 6.0 status codes - &lt;A href="http://support.microsoft.com/kb/318380/en-us" mce_href="http://support.microsoft.com/kb/318380/en-us"&gt;http://support.microsoft.com/kb/318380/en-us&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;H4&gt;Logs HTTPERR&lt;/H4&gt;
&lt;P&gt;Il s'agit des logs de la partie Kernel de Windows qui réceptionne les requêtes et envoie les réponses.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=HTTPERR src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image006_3.jpg" width=405 height=198 mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image006_3.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Pour analyser les messages d'erreurs contenus dans ces logs :&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Error logging in HTTP API - &lt;A href="http://support.microsoft.com/kb/820729/en-us" mce_href="http://support.microsoft.com/kb/820729/en-us"&gt;http://support.microsoft.com/kb/820729/en-us&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;H4&gt;Les journaux d’évènements Application, Système et Sécurité&lt;/H4&gt;
&lt;P&gt;Les journaux donnent des informations pertinentes sur les redemarrages d'IIS/des pools d'applications, sur erreurs remontés par les pools d'applications, etc...&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WWW Service Events (IIS 6.0) - &lt;A title=http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true"&gt;http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;WWW Service Worker Process Events (IIS 6.0) - &lt;A title=http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true"&gt;http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ea584d51-16b5-4be7-9e70-7c7487ca4500.mspx?mfr=true&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Deux précisions sur les logs IIS :&lt;/P&gt;
&lt;P&gt;- Pour apprécier le temps total de traitement des requêtes par le serveur Web, nous vous conseillons d’activer le champ « time-taken » des logs IIS6. Ce champs donne le temps total de traitement de chaque requête à partir du moment où le serveur reçoit la requête jusqu’au moment où il renvoie la réponse HTTP. Cela englobe le temps de traitement Web Service et/ou Base de données sous-jacent.&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=UILogIIS src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image008_3.jpg" width=476 height=462 mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image008_3.jpg"&gt; &lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=time-taken src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image010_3.jpg" width=408 height=387 mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/eeb01e5d249d_9788/clip_image010_3.jpg"&gt;&lt;/P&gt;
&lt;P&gt;- Le Win32 Status peut être aussi très utile. Il est possible d’en connaitre la signification avec l’outil « Err.exe » : Microsoft Exchange Server Error Code Look-up - &lt;A target=_blank href="http://www.microsoft.com/downloads/details.aspx?familyid=be596899-7bb8-4208-b7fc-09e02a13696c&amp;amp;displaylang=en"&gt;Err.exe&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9128171" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Procédures de prises de dumps pour un serveur Web</title><link>http://blogs.msdn.com/sbovo/archive/2008/11/25/proceduresDePrisesDeDumpsPourUnServeurWeb.aspx</link><pubDate>Tue, 25 Nov 2008 10:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9128124</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/9128124.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=9128124</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=9128124</wfw:comment><description>&lt;P&gt;Voici une procédure simple pour effectuer une prise de dumps sur IIS.&lt;/P&gt;
&lt;H4&gt;Utilisation d’ADPLUS.VBS&lt;/H4&gt;
&lt;P&gt;L’outil de prise de dumps est "adplus". Il est fourni avec les outils de débogage Windows téléchargeables à l’adresse - &lt;A href="http://www.microsoft.com/whdc/devtools/debugging/" mce_href="http://www.microsoft.com/whdc/devtools/debugging/"&gt;http://www.microsoft.com/whdc/devtools/debugging/&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;La démarche d’installation que je vous conseille est la suivante : &lt;/P&gt;
&lt;P&gt;- Télécharger les outils de débogage &lt;/P&gt;
&lt;P&gt;- Faire l’installation sur une machine quelconque &lt;/P&gt;
&lt;P&gt;- Copier sur le serveur Web le répertoire qui a été installé par les outils de débogage (par exemple dans « C:\debuggers\ ») &lt;/P&gt;
&lt;H4&gt;Prise d’un dump automatiquement lors d’un crash&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;Ouvrir une session avec un compte administrateur sur le serveur Web (se connecter avec « /console » si vous utilisez Terminal Serveur) &lt;/LI&gt;
&lt;LI&gt;En ligne de commande, naviguer vers le répertoire contenant les outils de débogage &lt;/LI&gt;
&lt;LI&gt;Lancer la commande suivante : « cscript.exe adplus.vbs -iis -crash -quiet ». A partir de ce moment, un débogueur est branché sur les processus IIS et prend un dump si un crash apparait &lt;/LI&gt;
&lt;LI&gt;Récupérer le répertoire nommée de la façon suivante « Crash_Mode__Date_01-11-2007__Time_18-31-1515 » &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Si vous avez beaucoup de mini-dumps, vous pouvez utiliser « cscript.exe adplus.vbs -iis -crash –quiet -nodumponfirst » pour avoir seulement un dump de second chance. &lt;/P&gt;
&lt;H4&gt;Prise d’un dump au moment du lancement de la commande &lt;/H4&gt;
&lt;P&gt;Pour une prise d’un dump immédiatement, dans le cas ou vous vous apercevez d’un problème ponctuel (application ne répondant pas, ayant de très mauvaises performances) ou dans le cas d’une fuite mémoire, la commande est « cscript.exe adplus.vbs -iis -hang -quiet » : &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Ouvrir une session avec un compte administrateur sur le serveur Web (se connecter avec « /console » si vous utilisez Terminal Serveur) &lt;/LI&gt;
&lt;LI&gt;En ligne de commande, naviguer vers le répertoire contenant les outils de débogage &lt;/LI&gt;
&lt;LI&gt;Lancer la commande suivante : « cscript.exe adplus.vbs -iis -hang -quiet ». Les dumps des processus IIS sont pris immédiatement &lt;/LI&gt;
&lt;LI&gt;Récupérer le répertoire nommée de la façon suivante « Hang_Mode__Date_01-11-2007__Time_18-31-1515 » &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;L’analyse des dumps se fait avec l’outil WinDbg (fourni avec les outils de débogage Windows) par vous et/ou par le support Microsoft.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9128124" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Comment mettre en place le débogage distant avec Visual Studio .NET</title><link>http://blogs.msdn.com/sbovo/archive/2007/03/23/DebogageDistantAvecVisualStudio.aspx</link><pubDate>Fri, 23 Mar 2007 19:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2794747</guid><dc:creator>Sebastien Bovo</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/sbovo/comments/2794747.aspx</comments><wfw:commentRss>http://blogs.msdn.com/sbovo/commentrss.aspx?PostID=2794747</wfw:commentRss><wfw:comment>http://blogs.msdn.com/sbovo/rsscomments.aspx?PostID=2794747</wfw:comment><description>&lt;P&gt;Je vous propose, par ces quelques lignes, de clarifier l'insaisissable et célèbre "débogage distant avec Visual Studio .NET".&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 1px; BORDER-BOTTOM: 1px solid"&gt;&lt;B&gt;Conditions préalable&lt;/B&gt;&lt;/DIV&gt;
&lt;P&gt;Pour simplifier les explications,&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Appelons &lt;I&gt;clientA&lt;/I&gt; notre station de travail et &lt;I&gt;serveurB&lt;/I&gt; le serveur distant 
&lt;LI&gt;ClientA fonctionne avec Windows 2000, Windows XP ou Windows 2003 
&lt;LI&gt;ServeurB fonctionne avec Windows 2000 ou Windows 2003 
&lt;LI&gt;clientA et ServeurB sont dans le même domaine Windows&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;D'autre part,&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;IIS et Visual Studio .NET sont installés sur ClientA 
&lt;LI&gt;IIS est installé sur ServeurB 
&lt;LI&gt;Si ServeurB fonctionne avec Windows 2000, le .NET Framework 1.1 doit être téléchargé et installé 
&lt;LI&gt;Le compte du domaine utilisé fait parti des groupes &lt;I&gt;Administrateurs&lt;/I&gt;, &lt;I&gt;VS Développeurs&lt;/I&gt; et &lt;I&gt;Utilisateurs du Débogueur&lt;/I&gt; sur clientA et sur ServeurB&lt;/LI&gt;&lt;/UL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 1px; BORDER-BOTTOM: 1px solid"&gt;&lt;B&gt;Composants distants&lt;/B&gt;&lt;/DIV&gt;
&lt;P&gt;Afin de pouvoir déboguer un processus sur un serveur distant, ce dernier doit pouvoir recevoir les ordres de débogage et communiquer en retour avec la station de travail. Ce sont les &lt;I&gt;composants distants&lt;/I&gt; qui participent à ce travail.&lt;/P&gt;
&lt;P&gt;Pour les installer, je lance l'installation de Visual Studio .NET. Sur le tout premier écran, j'utilise le lien &lt;I&gt;Installations des composants distants&lt;/I&gt;. S'affiche ensuite une fenêtre dans laquelle il suffit localiser puis de cliquer sur le bouton &lt;I&gt;Tout installer&lt;/I&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 1px; BORDER-BOTTOM: 1px solid"&gt;&lt;B&gt;Configuration du pare-feu&lt;/B&gt;&lt;/DIV&gt;
&lt;P&gt;Le point délicat est celui de la configuration du pare-feu si nous avons Windows XP SP2 et Windows 2003 SP1. En effet, pour le débogage, il importe de pouvoir utiliser certains ports comme &lt;I&gt;TCP 135&lt;/I&gt;, mais aussi d'autoriser des composants comme Mdm.exe, Vs7Jit.exe ou Msvcmon.exe.&lt;/P&gt;
&lt;P&gt;Afin d'effectuer cette configuration, la fiche technique &lt;A title="Description of the DebuggerFirewall utility that makes the Visual Studio Remote Debugger work through the Windows XP Service Pack 2 firewall" href="http://support.microsoft.com/kb/841177/" mce_href="http://support.microsoft.com/kb/841177/"&gt;841177&lt;/A&gt; nous fourni l'outil &lt;I&gt;DebuggerFirewall.hta&lt;/I&gt;. Ce dernier est une simple page qui liste les paramétrages nécessaires et les applique en un clic.&lt;/P&gt;
&lt;P&gt;L'utilisation de &lt;I&gt;DebuggerFirewall.hta&lt;/I&gt; est indispensable sur ClientA et ServeurB si le pare-feu est activé.&lt;/P&gt;
&lt;P&gt;Si vous avez la curiosité de découvrir le travail dont nous soulage cet outil ou si vous avez besoin de faire les manipulations manuellement, voici tous les détails &amp;gt;&amp;gt; &lt;A title="How to turn on remote debugging in Windows XP with Service Pack 2" href="http://support.microsoft.com/kb/833977/" mce_href="http://support.microsoft.com/kb/833977/"&gt;833977&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 1px; BORDER-BOTTOM: 1px solid"&gt;&lt;B&gt;Points à vérifier si cela ne fonctionne pas&lt;/B&gt;&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;L'application doit est un répertoire virtuel dans IIS. Ce dernier doit avoir au moins &lt;I&gt;l'authentification Intégrée Windows&lt;/I&gt; 
&lt;LI&gt;La création du projet ASP.NET et son débogage doit se faire en utilisant le nom de serveur et non pas son adresse IP 
&lt;LI&gt;Le Web.config de l'application doit avoir &lt;I&gt;debug="true"&lt;/I&gt; 
&lt;LI&gt;Dans l'explorateur de solution de Visual Studio, en cliquant droit sur le projet, vérifiez que le débogage ASP.NET est autorisé 
&lt;LI&gt;Lorsque vous naviguez avec Internet Explorer sur l'application ASP.NET, vous devez être dans la zone &lt;I&gt;Intranet&lt;/I&gt; ou &lt;I&gt;Sites de confiance&lt;/I&gt; (cette condition n'est pas rempli si vous utilisez le nom complet du serveur comme &lt;I&gt;ServeurB.Domaine1.com&lt;/I&gt;). Dans ce cas, ajoutez le nom du serveur à la liste des sites de la zone &lt;I&gt;Intranet&lt;/I&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2794747" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx">Debogage</category><category domain="http://blogs.msdn.com/sbovo/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>