<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Sébastien Bovo [Microsoft France] </title><subtitle type="html">&lt;I&gt;&lt;font color="#FFFFFF"&gt;&lt;B&gt;&lt;/B&gt;&lt;/font&gt;&lt;/I&gt;</subtitle><id>http://blogs.msdn.com/sbovo/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/sbovo/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2009-04-03T11:20:00Z</updated><entry><title>Debogage Silverlight avec WinDbg et SOS - C'est possible !</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/10/30/debogagesilverlightavecwindbgetsos-cestpossible.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/10/30/debogagesilverlightavecwindbgetsos-cestpossible.aspx</id><published>2009-10-30T16:20:00Z</published><updated>2009-10-30T16:20:00Z</updated><content type="html">&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;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="Debogage" scheme="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx" /><category term="Silverlight" scheme="http://blogs.msdn.com/sbovo/archive/tags/Silverlight/default.aspx" /><category term="WinDbg" scheme="http://blogs.msdn.com/sbovo/archive/tags/WinDbg/default.aspx" /></entry><entry><title>Comment savoir si une dll est 32bits ou 64bits ?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/09/18/commentsavoirsiunedllest32bitsou64bits.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/09/18/commentsavoirsiunedllest32bitsou64bits.aspx</id><published>2009-09-18T10:59:00Z</published><updated>2009-09-18T10:59:00Z</updated><content type="html">&lt;p&gt;Point important pour vos développements natifs ou pour l’utilisation de composants COM sur plateformes x64 :&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#0080ff"&gt;Un processus 64bits peut charger seulement des dlls 64bits. De la même manière, un processus 32bits peut charger seulement des dlls 32bits.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ceci peut paraitre trivial comme affirmation, mais cela a son importance car un processus 64bits ne pourra donc pas charger de dll 32bits. L’inverse n’est pas possible non plus.&lt;/p&gt;  &lt;p&gt;Voici la référence : &lt;a href="http://msdn.microsoft.com/en-us/library/aa384231(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa384231(VS.85).aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ok, d’accord… Et pour la vérification, comment puis-je savoir si une dll est compilée en 32 ou 64 ?&lt;/p&gt;  &lt;p&gt;Simplement avec l’outil &lt;a title="Utilitaire DumpBin" href="http://msdn.microsoft.com/en-us/library/c1h23y6c.aspx"&gt;DumpBin&lt;/a&gt; livré avec Visual Studio. Vous pouvez le lancer directement à partir de la ligne de commande Visual Studio 2008.&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="VisualStudioCommandPrompt" border="0" alt="VisualStudioCommandPrompt" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/image36.png" width="270" height="97" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Par exemple :&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;dumpbin &amp;quot;C:\Windows\System32\inetsrv\asp.dll&amp;quot; /HEADERS&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/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/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="dumpbin" border="0" alt="dumpbin" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/image_thumb_3.png" width="544" height="267" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&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;dumpbin &amp;quot;C:\Windows\System32\inetsrv\asp.dll&amp;quot; /HEADERS | findstr &amp;quot;(x64)&amp;quot;&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/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/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="dumpbinfindstrx64" border="0" alt="dumpbinfindstrx64" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/image_thumb_1.png" width="544" height="85" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&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;dumpbin &amp;quot;C:\Windows\SysWOW64\inetsrv\asp.dll&amp;quot; /HEADERS | findstr &amp;quot;(x86)&amp;quot;&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/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/image_2.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="dumpbinfindstrx86" border="0" alt="dumpbinfindstrx86" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentSavoirSiUneDllEst32bitsOu64bits_A9E4/image_thumb.png" width="544" height="85" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ca peut servir :-)&lt;/p&gt;  &lt;p&gt;Bye,&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9896269" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="Outils" scheme="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx" /></entry><entry><title>Propagation de clés par Office2007 de HKLM vers HKCU</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/08/06/propagationdecl-soffice2007dehklmvershkcu.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/08/06/propagationdecl-soffice2007dehklmvershkcu.aspx</id><published>2009-08-06T12:35:00Z</published><updated>2009-08-06T12:35:00Z</updated><content type="html">&lt;p&gt;Office 2007 apporte une fonctionnalité intéressante de propagation de clés de registre. Le principe est de pouvoir utiliser HKEY_LOCAL_MACHINE pour des clés qui se retrouvent normalement que dans HKEY_CURRENT_USER.&lt;/p&gt;  &lt;p&gt;Cette fonctionnalité peut vous être utile, par exemple, dans le cadre d’un déploiement d’un Add-In Office 2007 qui ne peut se faire par définition que pour l’utilisateur courant (c’est à dire dans HKCU). Vous pouvez aussi en avoir besoin dans le cadre d’un paramétrage Office ne s’effectuant que dans la ruche HKCU comme l’affichage du ruban développeur Office. &lt;/p&gt;  &lt;p&gt;Voici comment cela fonctionne.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A chaque lancement d’applications Office, les clés contenus dans &amp;quot;&lt;b&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\&lt;span style="background: yellow; mso-highlight: yellow"&gt;User Settings&lt;/span&gt;&amp;quot;&lt;/b&gt; sont vérifiées &lt;/li&gt;    &lt;li&gt;Disons, par exemple, que l’on crée &amp;quot;&lt;b&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\&lt;span style="background: yellow; mso-highlight: yellow"&gt;MaPropagation&lt;/span&gt;&lt;/b&gt;&amp;quot; contenant notre logique de propagation. Nous pouvons ensuite créer des sous-clés &amp;quot;&lt;b&gt;Create&lt;/b&gt;&amp;quot; qui copieront toutes les clés contenues de cette sous-clé vers HKCU. De la même façon, des sous-clé &amp;quot;&lt;strong&gt;Delete&lt;/strong&gt;&amp;quot; effaceront toutes les clés correspondantes dans l’arborescence HKCU &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Pour être concret, prenons l’exemple suivant :&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;p&gt;&lt;font face="Courier New"&gt;Windows Registry Editor Version 5.00 &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;; Installation                &lt;br /&gt;; Utilisation de la fonctionnalité Office 2007 de propagation des clés HKLM vers HKCU                 &lt;br /&gt;; Exemple pour afficher le ruban developpeur Office&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation]              &lt;br /&gt;&amp;quot;Count&amp;quot;=dword:00000001               &lt;br /&gt;&lt;font color="#008000"&gt;; &amp;quot;MaPropagation&amp;quot; est le code donnée à mon exemple                &lt;br /&gt;; &amp;quot;Count&amp;quot; est notre compteur qui sera propagé dans                 &lt;br /&gt;; &amp;quot;HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\User Settings\MaPropagation&amp;quot;&lt;/font&gt; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font face="Courier New"&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation\Create&lt;strong&gt;\Software\Microsoft\Office\12.0\Common\General&lt;/strong&gt;]               &lt;br /&gt;&amp;quot;DeveloperTools&amp;quot;=dword:00000001               &lt;br /&gt;&lt;font color="#008000"&gt;; Nous créons le dword &amp;quot;DeveloperTools&amp;quot; avec la valeur 1 dans                &lt;br /&gt;; &amp;quot;HKEY_CURRENT_USER\&lt;strong&gt;Software\Microsoft\Office\12.0\Common\General&lt;/strong&gt;&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Détaillons :&lt;/p&gt;  &lt;p&gt;Nous mettons dans la base de registre le dword &amp;quot;Count&amp;quot; = 1 dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation. &amp;quot;MaPropagation&amp;quot; est le nom que j’ai choisi pour&amp;#160; cet exemple.&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/PropagationdeclsOffice2007deHKLMversHKCU_9A4B/image_30.png" width="544" height="261" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lorsque qu’Office va se lancer, il effectue un parcours de toutes les clés contenues dans &amp;quot;&lt;strong&gt;HKEY_LOCAL_MACHINE&lt;/strong&gt;\SOFTWARE\Microsoft\Office\12.0\User Settings&amp;quot;. Pour chaque clé, il va vérifier si la même clé existe dans &amp;quot;&lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt;\Software\Microsoft\Office\12.0\User Settings&amp;quot;. Dans notre exemple,&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Si la clé &amp;quot;MaPropagation&amp;quot; n’existe pas. La clé est créée avec le compteur et la propagation est faite &lt;/li&gt;    &lt;li&gt;Si la clé &amp;quot;MaPropagation&amp;quot; existe, le compteur est vérifié et la propagation est faite que si la valeur du compteur est différent de celle contenu dans &amp;quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation&amp;quot;. &lt;/li&gt; &lt;/ul&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/PropagationdeclsOffice2007deHKLMversHKCU_9A4B/image_27.png" width="544" height="261" /&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Cette vérification (de la valeur du compteur) permet de ne pas refaire indéfiniment la propagation à chaque lancement d’Office ! Justement, je pense que vous aurez compris que pour refaire un propagation qui modifiera ou supprimera des clés, nous devons modifier le compteur de &amp;quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation&amp;quot;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Au final, en quoi consiste cette fameuse propagation ? Très simplement :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Les clés contenues dans &amp;quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation\&lt;strong&gt;Create&lt;/strong&gt;&amp;quot; sont ajoutées/modifiées de &amp;quot;HKEY_CURRENT_USER&amp;quot; &lt;/li&gt;    &lt;li&gt;Les clés contenues dans &amp;quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\User Settings\MaPropagation\&lt;strong&gt;Delete&lt;/strong&gt;&amp;quot; sont supprimées de &amp;quot;HKEY_CURRENT_USER&amp;quot; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Dans notre exemple, nous créons le dword &amp;quot;DeveloperTools&amp;quot; dans &amp;quot;HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Common\General&amp;quot;.&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="Sans titre" border="0" alt="Sans titre" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PropagationdeclsOffice2007deHKLMversHKCU_9A4B/Sans%20titre_3.png" width="544" height="261" /&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="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PropagationdeclsOffice2007deHKLMversHKCU_9A4B/image_12.png" width="544" height="299" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour résumé, avant tout lancement d’Office, seules les clés HKLM sont présentes. Lorsque un utilisateur lance Office, le mécanisme de propagation opère. C’est donc comme ceci que l’on peut déployer un Add-In VSTO 3 pour tous les utilisateurs Office 2007 (même ceux qui n’ont pas encore de profil dans la base de registre)&lt;/p&gt;  &lt;p&gt;A titre d’exemple, voici les .REG qui permettent d’afficher/masquer le ruban développeur Office 2007    &lt;br /&gt;&lt;a title="SB-AjoutDeveloperToolsDansOffice2007PourTousLesUtilisateurs.zip" href="http://sebastien.bovo.fr/BlogFiles/SB-AjoutDeveloperToolsDansOffice2007PourTousLesUtilisateurs.zip"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="SB-Installation-AjoutDeveloperToolsDansOffice2007PourTousLesUtilisateurs.reg" border="0" alt="SB-Installation-AjoutDeveloperToolsDansOffice2007PourTousLesUtilisateurs.reg" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PropagationdeclsOffice2007deHKLMversHKCU_9A4B/Fichier_3.png" width="50" height="51" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Bye,&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9823657" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term=".NET Fx 3.5" scheme="http://blogs.msdn.com/sbovo/archive/tags/.NET+Fx+3.5/default.aspx" /><category term="Office" scheme="http://blogs.msdn.com/sbovo/archive/tags/Office/default.aspx" /><category term="VSTO" scheme="http://blogs.msdn.com/sbovo/archive/tags/VSTO/default.aspx" /></entry><entry><title>Debogage .NET avec WinDbg et SOS - Travaux Pratiques</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/08/04/debogage-netavecwindbgetsos-travauxpratiques.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/08/04/debogage-netavecwindbgetsos-travauxpratiques.aspx</id><published>2009-08-04T11:59:00Z</published><updated>2009-08-04T11:59:00Z</updated><content type="html">&lt;p&gt;Ci-dessous, dans mes premiers articles sur le débogage WinDbg avec SOS, j’aborde le chargement des symboles/SOS, l’examen des piles d’appels et la visualisation des objets :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Premiers pas avec WinDbg - &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 - &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;/ul&gt;  &lt;p&gt;J’espère que ces billets vous sont utiles !&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Afin que ce soit plus interactif, je mets à votre disposition le dump que j’ai pris et utilisé pour illustrer mes explications.&lt;/p&gt;  &lt;p&gt;Vous le trouverez ici (66Mo)    &lt;br /&gt;&lt;a title="W3WPActif.zip" href="http://sebastien.bovo.fr/BlogFiles/Debug/W3WPActif.zip"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="W3WPActif.zip" border="0" alt="W3WPActif.zip" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debog.NETAvecWinDbgEtSOSTravauxPratiques_8621/Fichier_3.png" width="271" height="276" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Comme exercices, pourquoi pas essayer de trouver par vous-même&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Quels sont les threads qui exécutent des pages Web au moment de la prise du dump ? Combien sont-ils ? &lt;/li&gt;    &lt;li&gt;Quelles sont les pages Web exécutées (les urls) ? &lt;/li&gt;    &lt;li&gt;Et pour le plaisir : une dll est utilisée par le site Web. Elle s’appelle &amp;quot;BlogEngine.Core.dll&amp;quot;. Quelle est la version de cette dll et à quelle date a-t-elle été compilée ? &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Bon débogage :-)&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt;&amp;gt; To be continued…&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9855984" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>Ajouter Bing dans votre site Web !</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/07/31/ajouterbingdansvotresiteweb.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/07/31/ajouterbingdansvotresiteweb.aspx</id><published>2009-07-31T17:10:00Z</published><updated>2009-07-31T17:10:00Z</updated><content type="html">&lt;p&gt;Envie d’avoir un vrai moteur de recherche pour votre blog ou site Internet sans avoir en acheter un, le coder et le maintenir ou même l’héberger… Alors lisez bien ce qui suit !&lt;/p&gt;  &lt;p&gt;De plus, pour une fois, je ne pense pas que l’on puisse faire plus simple ! Si peut-être un bouton &amp;quot;&lt;em&gt;copy to clipboard&lt;/em&gt;&amp;quot; dans l’étape 3 de l’assistant :-) Vous verrez : il faut faire un CTRL+A et CTRL+C :-)&lt;/p&gt;  &lt;h3&gt;Naviguez sur &lt;a title="http://www.bing.com/siteowner/" href="http://www.bing.com/siteowner/"&gt;http://www.bing.com/siteowner/&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_2.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="BingBox" border="0" alt="BingBox" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_thumb.png" width="544" height="430" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Suivez l’assistant&lt;/h3&gt;  &lt;p&gt;- en donnant l’url de votre site -    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/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="BingBox-Etape1" border="0" alt="BingBox-Etape1" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_thumb_1.png" width="544" height="519" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;- en choisissant la taille de zone de recherche, les dimensions de la fenetre de résultat ainsi que sa couleur -    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_6.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="BingBox-Etape2" border="0" alt="BingBox-Etape2" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_thumb_2.png" width="544" height="454" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;- en sélectionnant le HTML généré et le copier dans le presse-papier (c’est ici que l’on aurait pu rajouter un bouton :-) -    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/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="BingBox-Etape3" border="0" alt="BingBox-Etape3" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/AjouterBingDansVotreSiteWeb_137AE/image_thumb_3.png" width="544" height="434" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Coller ce HTML dans votre site&lt;/h3&gt;  &lt;p&gt;Le mieux est d’avoir un page maitre, comme cela : une seule insertion… C’est tout ! Ca fonctionne même immédiatement puisque c’est le moteur de recherche qui travaille pour nous ! Je l’ai adopté illico :-)&lt;/p&gt;  &lt;p&gt;C’est tellement facile et tellement efficace ! Vraiment IMPRESSIONANT !!! &lt;/p&gt;  &lt;p&gt;Qu’en pensez-vous ?&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=9853696" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>Debogage .NET avec WinDbg et SOS - Objects</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/07/31/debogage-netavecwindbgetsos-objects.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/07/31/debogage-netavecwindbgetsos-objects.aspx</id><published>2009-07-31T09:42:00Z</published><updated>2009-07-31T09:42:00Z</updated><content type="html">&lt;p&gt;Dans le &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx"&gt;précédent billet&lt;/a&gt;, nous parlions des threads. Continuons… et intéressons-nous aux objets en mémoire.&lt;/p&gt;  &lt;h3&gt;Objets sur la pile d’appels&lt;/h3&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;!dso&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;(pour &lt;strong&gt;d&lt;/strong&gt;ump &lt;strong&gt;s&lt;/strong&gt;tack &lt;strong&gt;o&lt;/strong&gt;bjets)&lt;/p&gt;  &lt;p&gt;!dso affiche tous les objets .NET contenus dans la pile d’appel du thread courant. Nous pouvons ensuite regarder ceux qui nous intéressent. Voici à quoi cela ressemble :&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image_2.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="dso" border="0" alt="dso" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image_thumb.png" width="484" height="414" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Deux informations sont importantes ici :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;La deuxième colonne donne l’adresse mémoire de l’objet - sur 64bits s’il vous plait:-) &lt;/li&gt;    &lt;li&gt;La troisième colonne indique le &amp;quot;type&amp;quot; de l’objet ; c’est à dire sa classe &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Voici un extrait du résultat de !dso :&lt;/p&gt; RSP/REG&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Object&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Name   &lt;br /&gt;...   &lt;br /&gt;00000000039ae340 000000013f4655d0 System.String   &lt;br /&gt;00000000039ae350 000000013f5df210 System.Web.HttpRequest   &lt;br /&gt;00000000039ae358 000000013f5e5920 System.Web.UI.ControlCollection   &lt;br /&gt;00000000039ae360 000000013f5e56d0 System.Web.UI.HtmlControls.HtmlForm   &lt;br /&gt;00000000039ae370 000000013f4656b0 System.String   &lt;br /&gt;00000000039ae388 000000013f5e56d0 System.Web.UI.HtmlControls.HtmlForm   &lt;br /&gt;00000000039ae3b8 000000013f5e0de8 ASP.search_aspx   &lt;br /&gt;...   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour obtenir plus d’information sur un objet, il suffit de faire double clic puis clic droit sur son adresse mémoire. Cela a le même effet que de faire une sélection de l’adresse puis un CTRL+C. A ce moment là, l’adresse est copiée dans le presse papier. Nous pourrons la coller par la suite avec un clic droit dans la zone de saisie ou un CTRL+V.&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="WindbgZoneSaisie" border="0" alt="WindbgZoneSaisie" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image_9.png" width="287" height="64" /&gt; &lt;/p&gt;  &lt;p&gt;Prenons, par exemple, l’objet HttpRequest stocké sur la pile d’appel :&lt;/p&gt;  &lt;p&gt;00000000039ae350 &lt;span style="background: yellow; mso-highlight: yellow"&gt;000000013f5df210&lt;/span&gt; System.Web.HttpRequest &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Analyse d’un objet&lt;/h3&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;!do AdresseMemoire&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;(pour &lt;strong&gt;d&lt;/strong&gt;ump &lt;strong&gt;o&lt;/strong&gt;bjet)&lt;/p&gt;  &lt;p&gt;!do affiche l’objet ainsi que toute sa structure interne. Nous avons donc directement les valeurs des propriétés qui composent l’objet ou bien leur adresse mémoire. Nous pouvons donc renouveler la même opération sur les adresses mémoires des propriétés/objets qui nous intéressent.&lt;/p&gt;  &lt;p&gt;Suivez le guide…&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 000000013f5df210 &lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt; &lt;span target="_blank" $image5.png?="$image5.png?"&gt;pour l’objet de type &lt;em&gt;System.Web.HttpRequest&lt;/em&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image1.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="do" border="0" alt="do" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image1_thumb.png" width="484" height="414" /&gt;&lt;/a&gt;&lt;/a&gt; &lt;/span&gt;  &lt;p&gt;&lt;/p&gt; Vous avez repéré l'adresse de la propriété &lt;em&gt;_url &lt;/em&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 000000013f5e9658&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt; pour l’objet &lt;em&gt;_url&lt;/em&gt; de type &lt;em&gt;System.Uri&lt;/em&gt; contenu dans l’objet HttpRequest précédent&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image6.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="do" border="0" alt="do" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image6_thumb.png" width="484" height="202" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Un dernier petit effort pour avoir l’url demandée par cette requête HTTP, voyons voir &amp;quot;m_String&amp;quot; :    &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 000000013f5e95d0&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; pour l’objet &lt;em&gt;m_String &lt;/em&gt;de type &lt;em&gt;System.String &lt;/em&gt;contenu dans l’objet Uri précédent&lt;em&gt;&amp;#160;&lt;/em&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/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="dostring" border="0" alt="dostring" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETavecWinDbgetSOSObjects_139CF/image_thumb_3.png" width="484" height="206" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Enfin, nous y voila&lt;/p&gt;  &lt;p&gt;&lt;em&gt;String: &lt;span style="background: yellow; mso-highlight: yellow"&gt;http://localhost:80/BlogEngine/search.aspx?q=BlogEngine&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Tout simplement fantastique ! :-) Et ce n’est que le début. &amp;quot;!DumpHeap -stat&amp;quot; vous connaissez ?&lt;/p&gt;  &lt;p&gt;Bye, Sebastien.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt;&amp;gt; Suite : &lt;a title="Debogage .NET avec WinDbg et SOS - Travaux Pratiques" href="http://blogs.msdn.com/sbovo/archive/2009/08/04/debogage-netavecwindbgetsos-travauxpratiques.aspx"&gt;Debogage .NET avec WinDbg et SOS - Travaux Pratiques&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9819625" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>Debogage .NET avec WinDbg et SOS - Threads</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx</id><published>2009-07-23T18:20:00Z</published><updated>2009-07-23T18:20:00Z</updated><content type="html">&lt;p&gt;Le débogage .NET diffère du débogage natif dans la mesure ou les objets et les piles d’appels qui nous intéressent ne sont pas visibles/exploitables sans utiliser une extension WinDbg nommée SOS.&lt;/p&gt;  &lt;h3&gt;Chargement de l’extension&lt;/h3&gt;  &lt;p&gt;Pour charger SOS dans WinDbg, la syntaxe est la suivante :    &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;.loadby sos mscorwks&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Vous pouvez vérifier la liste des extensions chargées avec    &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;.chain&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Pour information, le déchargement se fait avec    &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;.unload sos&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Démarrage&lt;/h3&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;!EEVersion&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; Permet d'obtenir lu numéro de version exact de la CLR chargée dans le processus. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/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="EEVersion" border="0" alt="EEVersion" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb_1.png" width="512" height="117" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;La liste des commandes disponibles de l’extension s’obtient 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;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_6.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="!help" border="0" alt="!help" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb_2.png" width="514" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vous trouverez l’aide complète en ligne sur MSDN : SOS Debugging Extension (SOS.dll) - &lt;a title="http://msdn.microsoft.com/en-us/library/bb190764.aspx" href="http://msdn.microsoft.com/en-us/library/bb190764.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb190764.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Afin de visualiser un semblant d’activité, j’utilise &lt;a title="TingGet" href="http://blogs.msdn.com/sbovo/archive/2009/04/10/utiliseztinygetpoureffectuerrapidementunechargesimplesurunserveurweb.aspx"&gt;TinyGet&lt;/a&gt; (un peu brusquement :-)) avec le lancement des deux commandes suivantes (2x50 utilisateurs simultanés effectuant 100 requêtes, les unes à la suite des autres)&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;tinyget.exe -srv:localhost -uri:/BlogEngine/ -status:200 -threads:50 -loop:100&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt; et   &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;tinyget.exe -srv:localhost -uri:/BlogEngine/search.aspx?q=BlogEngine -status:200 -threads:50 -loop:100&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Pendant l’exécution, après avoir lancé WinDbg en tant qu’administrateur, je m’attache au processus W3WP.EXE avec le menu FILE/Attach to process…&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="AttahToProcess" border="0" alt="AttahToProcess" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_9.png" width="282" height="142" /&gt; &lt;/p&gt;  &lt;p&gt;Ensuite comme d’habitude : &lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="480"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="234"&gt;Chargement des symboles&lt;/td&gt;        &lt;td valign="top" width="423"&gt;.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols/&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="234"&gt;Demande de chargement&lt;/td&gt;        &lt;td valign="top" width="423"&gt;.reload&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="234"&gt;Chargement de SOS&lt;/td&gt;        &lt;td valign="top" width="423"&gt;         &lt;p&gt;.loadby sos mscorwks&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;p&gt;--&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Voyons voir ce que nous avons et ce que nous pouvons obtenir avec WinDbg et SOS. Les questions que l’on peut se poser sont par exemple :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Combien de threads exécutent des pages ASPX ? &lt;/li&gt;    &lt;li&gt;Quelles sont les pages exécutées ? &lt;/li&gt;    &lt;li&gt;Où en est leur traitement ? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Piles d’appels ou &amp;quot;call stacks&amp;quot;&lt;/h3&gt;  &lt;p&gt;Vous remarquerez le nombre en bas à droite de la fenêtre de Windbg : il s’agit du numéro du thread sur lequel nous somme positionné &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="ThreadID" border="0" alt="ThreadID" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_15.png" width="153" height="97" /&gt;&lt;/p&gt;  &lt;p&gt;Pour visualiser la pile d’appel de ce thread, la commande est    &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;kp&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;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/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="kp" border="0" alt="kp" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb_10.png" width="488" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Loin d’être intuitif n’est pas ? En fait, c’est normal puisque nous visualisons les informations natives de la pile d’appels. Pour obtenir la pile d’appels managée, nous utilisons    &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;!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;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_23.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="ClrStack" border="0" alt="ClrStack" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb_9.png" width="490" height="146" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pour information, le changement de thread se fait avec    &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;~XXs&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; Où XX est le numéro du thread.&lt;/p&gt;  &lt;p&gt;Comme raccourci, pour exécuter une commande sur tous les threads, nous pouvons utiliser    &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;~*kp&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&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;~*e !ClrStack&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &amp;quot;e&amp;quot; permet d’exécuter une commande (contenu dans un extension - c'est le cas pour SOS)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Donc, si l’on reprend la pile d’appels du thread 20,    &lt;br /&gt;&lt;a title="!ClrStack" href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_23.png" target="_blank"&gt;&lt;em&gt;capture ci-dessus&lt;/em&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;System.Web.UI.HtmlTextWriter.WriteUTF8ResourceString(IntPtr, Int32, Int32, Boolean)      &lt;br /&gt;ASP.search_aspx.__RenderContent1(System.Web.UI.HtmlTextWriter, System.Web.UI.Control)       &lt;br /&gt;System.Web.UI.Control.RenderChildrenInternal(System.Web.UI.HtmlTextWriter, ... ASP.themes_standard_site_master.__Render__control5(System.Web.UI.HtmlTextWriter, ...       &lt;br /&gt;System.Web.UI.Control.RenderChildrenInternal(System.Web.UI.HtmlTextWriter, ...       &lt;br /&gt;System.Web.UI.HtmlControls.HtmlForm.RenderChildren(System.Web.UI.HtmlTextWriter)       &lt;br /&gt;System.Web.UI.HtmlControls.HtmlForm.Render(System.Web.UI.HtmlTextWriter)       &lt;br /&gt;System.Web.UI.HtmlControls.HtmlForm.RenderControl(System.Web.UI.HtmlTextWriter)       &lt;br /&gt;ASP.themes_standard_site_master.__Render__control1(System.Web.UI.HtmlTextWriter, ...       &lt;br /&gt;System.Web.UI.Control.RenderChildrenInternal(System.Web.UI.HtmlTextWriter, ...       &lt;br /&gt;System.Web.UI.Control.RenderChildrenInternal(System.Web.UI.HtmlTextWriter, ...       &lt;br /&gt;System.Web.UI.Page.Render(System.Web.UI.HtmlTextWriter)       &lt;br /&gt;BlogEngine.Core.Web.Controls.BlogBasePage.Render(System.Web.UI.HtmlTextWriter)       &lt;br /&gt;System.Web.UI.Page.ProcessRequestMain(Boolean, Boolean)       &lt;br /&gt;System.Web.UI.Page.ProcessRequest(Boolean, Boolean)       &lt;br /&gt;System.Web.UI.Page.ProcessRequest()       &lt;br /&gt;System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)       &lt;br /&gt;ASP.search_aspx.ProcessRequest(System.Web.HttpContext)       &lt;br /&gt;System.Web.HttpApplication+CallHandlerExecutionStep...       &lt;br /&gt;System.Web.HttpApplication.ExecuteStep(IExecutionStep, Boolean ByRef)       &lt;br /&gt;System.Web.HttpApplication+ApplicationStepManager.ResumeSteps(System.Exception)       &lt;br /&gt;System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest ...       &lt;br /&gt;System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest)       &lt;br /&gt;System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest)       &lt;br /&gt;System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr, Int32)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nous avons le nom de la page éxécutée : &amp;quot;search.aspx”. Elle 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;ASP.&lt;span style="background: yellow; mso-highlight: yellow"&gt;search_aspx&lt;/span&gt;.ProcessRequest(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;p&gt;Comme j’ai le code source sous la main, c’est plus facile ensuite de confirmer :-) : &lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_12.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="Vérification" border="0" alt="Vérification" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb_3.png" width="484" height="266" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La page maitre est &amp;quot;site.master&amp;quot; correspondant au thème &amp;quot;Standard&amp;quot; :    &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;ASP.&lt;span style="background: yellow; mso-highlight: yellow"&gt;themes_standard_site_master&lt;/span&gt;.__Render__control1(System.Web.UI.HtmlTextWriter, System.Web.UI.Control)&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Vérification :-) : &lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/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="Vérification" border="0" alt="Vérification" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/Debogage.NETAvecWinDbgEtSOS_953E/image_thumb.png" width="484" height="266" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Si l’on décortique la pile d’appels, nous obtenons un peu plus en détails. Nous avons l’enchainement des toutes les fonctions appelées. A noter que la lecture se fait de bas en haut (du plus ancien appel au plus récent).&lt;/p&gt;  &lt;p&gt;La pile d’appels nous apprend que l’exécution de la page &amp;quot;search.aspx&amp;quot; a demandé le chargement de la classe &amp;quot;BlogEngine.Core.Web.Controls.BlogBasePage&amp;quot; et l'exécution de sa méthode &amp;quot;Render&amp;quot; : Nous devons être dans le cas d’un classe de base héritée.    &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;ASP.search_aspx.ProcessRequest(System.Web.HttpContext)&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; puis     &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;BlogEngine.Core.Web.Controls.BlogBasePage.Render(System.Web.UI.HtmlTextWriter)&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Nous avons ensuite, la demande de chargement de la page maitre et des contrôles contenus :    &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;ASP.themes_standard_site_master.__Render__control1(System.Web.UI.HtmlTextWriter, ...&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;/p&gt;  &lt;p&gt;Enfin, au moment du débogage, nous étions toujours en dans la phase de génération la page Web :    &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;System.Web.UI.HtmlTextWriter.WriteUTF8ResourceString(IntPtr, ...&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 pas mal pour un début non ? La suite au prochain épisode.&lt;/p&gt;  &lt;p&gt;A bientôt, Sebastien.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt;&amp;gt; Suite : &lt;a title="Debogage .NET avec WinDbg et SOS - Objects" href="http://blogs.msdn.com/sbovo/archive/2009/07/31/debogage-netavecwindbgetsos-objects.aspx"&gt;Debogage .NET avec WinDbg et SOS - Objects&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9809599" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>deployment retail="true" pour ASP.NET</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/07/09/deploymentretailtruepourasp-net.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/07/09/deploymentretailtruepourasp-net.aspx</id><published>2009-07-09T13:16:00Z</published><updated>2009-07-09T13:16:00Z</updated><content type="html">&lt;p&gt;Ce n’est pas une information de première fraicheur :-) mais compte tenu qu’elle n’est pas très documentée, je la relaie dans cette article.&lt;/p&gt;  &lt;p&gt;Depuis ASP.NET 2.0, nous avons l’élément &lt;a href="http://msdn.microsoft.com/en-us/library/ms228298.aspx"&gt;&amp;lt;deployment&amp;gt;&lt;/a&gt; dans &amp;lt;system.web&amp;gt; qui permet de définir à un seul endroit (Machine.config) si les applications ASP.NET présentes sur le serveurs sont en production :&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;&amp;lt;configuration&amp;gt;&lt;/p&gt;              &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt; &lt;/p&gt;              &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;deployment retail=&amp;quot;true&amp;quot;/&amp;gt; &lt;/p&gt;              &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt; &lt;/p&gt;              &lt;p&gt;&amp;lt;/configuration&amp;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;Ce paramétrage a deux effets :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Rétablir les performances optimales d’ASP.NET (Compilation, cache des ressources AXD, gestion mémoire, timeouts des pages) qui étaient réduites par le mode &lt;em&gt;debug&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Et purement et simplement désactiver le debug=true, la trace ASP.NET et les messages d’erreurs ASP.NET complets &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ceci quelque soient les paramétrages mis dans les Web.config. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Je vous conseille d’appliquer ce paramétrage systématiquement dans la production.&lt;/p&gt;  &lt;p&gt;Et justement, par curiosité, avez-vous testé de rechercher si vous aviez du debug=&amp;quot;true&amp;quot; sur vos serveurs ? &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;findstr /S &amp;quot; debug=&amp;quot; *.*&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;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/deploymentRetailTruePourASP.NET_D378/image_2.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="findstr" border="0" alt="findstr" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/deploymentRetailTruePourASP.NET_D378/image_thumb.png" width="519" height="109" /&gt;&lt;/a&gt;A &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A bientôt,&lt;/p&gt;  &lt;p&gt;Sebastien,&lt;/p&gt;  &lt;p&gt;- &lt;/p&gt;  &lt;p&gt;deployment Element - &lt;a title="http://msdn.microsoft.com/en-us/library/ms228298.aspx" href="http://msdn.microsoft.com/en-us/library/ms228298.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms228298.aspx&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font face="Courier New"&gt;When retail is set to true, ASP.NET disables certain configuration settings such as trace output, custom errors, and debug capabilities.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Don’t run production ASP.NET Applications with debug=”true” enabled - &lt;a title="http://weblogs.asp.net/scottgu/archive/2006/04/11/Don_1920_t-run-production-ASP.NET-Applications-with-debug_3D001D20_true_1D20_-enabled.aspx" 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"&gt;http://weblogs.asp.net/scottgu/archive/2006/04/11/Don_1920_t-run-production-ASP.NET-Applications-with-debug_3D001D20_true_1D20_-enabled.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9823867" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx" /><category term=".NET Fx 3.5" scheme="http://blogs.msdn.com/sbovo/archive/tags/.NET+Fx+3.5/default.aspx" /><category term="IIS" scheme="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx" /></entry><entry><title>Premiers pas avec WinDbg</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/06/19/premierpasavecwindbg.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/06/19/premierpasavecwindbg.aspx</id><published>2009-06-19T10:09:00Z</published><updated>2009-06-19T10:09:00Z</updated><content type="html">&lt;p&gt;Pour faciliter la prise en main de cet outil légendaire et pour que vous puissiez tester vous même, je suis parti avec le Starter Kit &amp;quot;BlogEngine” (&lt;a title="http://www.asp.net/community/projects/" href="http://www.asp.net/community/projects/"&gt;http://www.asp.net/community/projects/&lt;/a&gt;) ; Vous pourrez ainsi prendre les dumps, les ouvrir et utiliser WinDbg en suivant les étapes ci-dessous.&lt;/p&gt;  &lt;p&gt;J’ai donc copié les sources du Starter Kit dans le répertoire &amp;quot;C:\inetpub\wwwroot&amp;quot; :&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="BlogEngineDansWWWROOT" border="0" alt="BlogEngineDansWWWROOT" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_thumb_1.png" width="512" height="156" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ensuite, dans la console IIS, j’ai créé une application pour ce répertoire en choisissant le pool d’application &amp;quot;Classic .NET AppPool&amp;quot; :&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/ConvertToApplication_2.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ConvertToApplication" border="0" alt="ConvertToApplication" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/ConvertToApplication_thumb.jpg" width="522" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/ApplicationIIS_4.jpg" 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="ApplicationIIS" border="0" alt="ApplicationIIS" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/ApplicationIIS_thumb_1.jpg" width="391" height="295" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/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="BlogEngineDansLeNavigateur" border="0" alt="BlogEngineDansLeNavigateur" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_thumb_3.png" width="463" height="369" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;C’est bon, l’application tourne, nous pouvons passer aux choses sérieuses…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nous retrouvons le processus w3wp.exe avec le gestionnaire de taches, &amp;quot;process explorer&amp;quot; ou la commande suivante :&lt;/p&gt;  &lt;p&gt;tasklist /FI &amp;quot;IMAGENAME eq w3wp.exe&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/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="TaskList" border="0" alt="TaskList" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_thumb.png" width="466" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La prise de dumps peut se faire facilement avec adplus. Voici toutes les informations pour ce faire - &lt;a title="Billet précédent : Plan d‘action pour la capture des informations lors d’un problème de production IIS" href="http://blogs.msdn.com/sbovo/archive/2009/05/13/plandactioncapturedumpslogsretablissementiis.aspx" target="_blank"&gt;Billet précédent : Plan d‘action pour la capture des informations lors d’un problème de production IIS&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pour nos tests aujourd’hui, je fais un simple clic droit sur processus dans le gestionnaire de taches puis &amp;quot;Create Dump File&amp;quot;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/GestionnaireDeTaches_2.jpg" 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="GestionnaireDeTachesCreteDumpFile" border="0" alt="GestionnaireDeTachesCreteDumpFile" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/GestionnaireDeTaches_thumb.jpg" width="493" height="361" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_17.png"&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/PremierPasAvecWinDbg_8953/image_thumb_6.png" width="244" height="89" /&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_15.png"&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/PremierPasAvecWinDbg_8953/image_thumb_5.png" width="244" height="124" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ouvrons le dump par un &lt;a title="Billet précédent : Deboguer ce dump&amp;quot; dans le menu contextuel de l’explorateur Windows" href="http://blogs.msdn.com/sbovo/archive/2009/05/14/deboguercedumpdanslmenucontextueldelexplorateurwindows.aspx"&gt;double-clic&lt;/a&gt; ou en lançant WinDbg puis un glisser/déplacer du fichier .DMP dans l’interface de WinDbg… Un mot : Magnifique !! &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/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" border="0" alt="WInDbg" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/image_thumb_7.png" width="508" height="462" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Informations disponibles&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/InformationsDansWinDbg_2.jpg" 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="InformationsDansWinDbg" border="0" alt="InformationsDansWinDbg" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/InformationsDansWinDbg_thumb.jpg" width="506" height="105" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nous avons entre les mains une photographie de la mémoire utilisée par le processus. Au premier coup d’oeil, nous avons les informations suivantes&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;La version exacte de Windows : Windows 7, build 7100 en 64bits &lt;/li&gt;    &lt;li&gt;Le jour et l’heure de la prise de dump : jeudi 18 juin à 14h10 &lt;/li&gt;    &lt;li&gt;Le système d’exploitation tourne depuis 2 jours et 23 heures (System Uptime) &lt;/li&gt;    &lt;li&gt;Le processus est démarré depuis 13min et 9 secondes &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Symboles&lt;/h3&gt;  &lt;p&gt;L’une des premières actions à faire est de paramétrer le serveur de symboles. En deux mots : Les symboles sont les fichiers .PDB donnant la correspondance entre les adresses mémoires et les noms des fonctions d’une dll ou d’un exécutable. WinDbg peut les utiliser pour nous afficher les piles d’appels avec les noms des fonctions plutôt que des adresses mémoire brutes : Appréciable est un adjectif faible pour décrire cet avantage :-)&lt;/p&gt;  &lt;p&gt;Dans la zone de texte, en bas de l’interface, il vous suffit d’entrer&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;.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; pour spécifier le serveur public de symboles Microsoft : http://msdl.microsoft.com/symbols/. Dans l’exemple ci-dessus, je donne le crépertoire &amp;quot;c:\symbols&amp;quot; comme emplacement pour une copie locale des ces fichiers de symboles. WinDbg va donc pouvoir télécharger et stocker ces fichiers pour une utilisation déconnectée.&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;.reload&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Permet de charger les symboles et de les rapatrier en local s’il ne sont pas présents.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/SymbolesCaptureDEcran_2.jpg" 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="SymbolesCaptureDEcran" border="0" alt="SymbolesCaptureDEcran" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/SymbolesCaptureDEcran_thumb.jpg" width="517" height="62" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Modules&lt;/h3&gt;  &lt;p&gt;Sans commencer maintenant un débogage poussé, nous pouvons facilement connaitre quelle sont toutes les dlls chargées par le processus et obtenir des informations très précises sur chacune d’elles comme la date de build, le numéro de version, le chemin de la dll, etc…&lt;/p&gt;  &lt;p&gt;L’affichage de toutes les dlls se fait par&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;lm&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/PremierPasAvecWinDbg_8953/Modules_2.jpg" 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="Modules" border="0" alt="Modules" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/Modules_thumb.jpg" width="518" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nous obtenons les informations sur une dll avec&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;lmvm &amp;lt;&amp;lt;NomModule&amp;gt;&amp;gt;&lt;/p&gt;         &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/LMVM_2.jpg" 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="LMVM" border="0" alt="LMVM" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/PremierPasAvecWinDbg_8953/LMVM_thumb.jpg" width="514" height="324" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ce n’est que le début. Nous continuons dans le prochain billet.&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="Debogage .NET avec WinDbg et SOS - Threads" href="http://blogs.msdn.com/sbovo/archive/2009/07/23/debogage-netavecwindbgetsos.aspx"&gt;Debogage .NET avec WinDbg et SOS - Threads&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9698690" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>"Deboguer ce dump" dans le menu contextuel de l’explorateur Windows</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/05/14/deboguercedumpdanslmenucontextueldelexplorateurwindows.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/05/14/deboguercedumpdanslmenucontextueldelexplorateurwindows.aspx</id><published>2009-05-14T15:12:00Z</published><updated>2009-05-14T15:12:00Z</updated><content type="html">&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;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="Debogage" scheme="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx" /><category term="Outils" scheme="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx" /></entry><entry><title>Plan d‘action pour la capture des informations lors d’un problème de production IIS</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/05/13/plandactioncapturedumpslogsretablissementiis.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/05/13/plandactioncapturedumpslogsretablissementiis.aspx</id><published>2009-05-13T17:38:00Z</published><updated>2009-05-13T17:38:00Z</updated><content type="html">&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;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx" /><category term="Debogage" scheme="http://blogs.msdn.com/sbovo/archive/tags/Debogage/default.aspx" /><category term="IIS" scheme="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx" /></entry><entry><title>Déboguer une application en production... Mais pour quoi faire ?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/05/05/debogueruneapplicationenproductionmaispourquoifaire.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/05/05/debogueruneapplicationenproductionmaispourquoifaire.aspx</id><published>2009-05-05T13:31:00Z</published><updated>2009-05-05T13:31:00Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Joli titre non ? En fait, je souhaite vous faire part de mon expérience sur le débogage .NET en production. &amp;quot;Débogage .NET en production&amp;quot; par opposition au débogage pas à pas dans Visual Studio.&lt;/p&gt;  &lt;p&gt;En effet, il n’est pas toujours possible de &amp;quot;dégainer&amp;quot; son Visual Studio dans les environnements comme la recette ou la production. Et même, dans certains cas ce n’est pas adapté car la problématique à déboguer nécessite une certaine charge utilisateurs.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Quels sont les différents environnements ?&lt;/h3&gt;  &lt;p&gt;Chaque environnement a ses caractéristiques propres ; Pour simplifier, nous pouvons dire que nous avons les types suivants :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Développement      &lt;ul&gt;       &lt;li&gt;Pas de charge utilisateurs &lt;/li&gt;        &lt;li&gt;Problèmes unitaires reproductibles &lt;/li&gt;        &lt;li&gt;Serveurs et réseau différents de la production &lt;/li&gt;        &lt;li&gt;Débogage invasif ou pas à pas autorisé &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Test/Recette      &lt;ul&gt;       &lt;li&gt;Pas forcement identique à la production &lt;/li&gt;        &lt;li&gt;Débogage invasif autorisé mais pas utilisable dans tous les cas (exemple : tests de charge) &lt;/li&gt;        &lt;li&gt;Outils de débogage possiblement non autorisés &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Production      &lt;ul&gt;       &lt;li&gt;Environnement à forte charge / disponibilité &lt;/li&gt;        &lt;li&gt;Outils de débogage souvent non autorisés &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Quelles problématiques pouvons-nous rencontrer ?&lt;/h3&gt;  &lt;p&gt;Malgré tous les efforts mis en œuvre dans la phase de développement et de tests, il est possible d’observer des comportements anormaux de l’application mise en production. Voici les plus fréquents :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Apparition de messages d’erreurs aux utilisateurs alors qu’aucune exception n’est loguée (Exceptions non gérées) &lt;/li&gt;    &lt;li&gt;Un état de blocage ou d’attente qui empêche le traitement des requêtes (deadlock ou hang du processus d’exécution W3WP.EXE)      &lt;ul&gt;       &lt;li&gt;Attente sur des ressources externes &lt;/li&gt;        &lt;li&gt;Locks &lt;/li&gt;        &lt;li&gt;Deadlocks &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;100% CPU du processus d’exécution W3WP.EXE      &lt;ul&gt;       &lt;li&gt;Boucle infini &lt;/li&gt;        &lt;li&gt;Serveur surchargé &lt;/li&gt;        &lt;li&gt;Nombre élevé d’exceptions &lt;/li&gt;        &lt;li&gt;Utilisation du processeur par le Garbage Collector &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Un arrêt du processus d’exécution inexpliqué (crash de W3WP.EXE)      &lt;ul&gt;       &lt;li&gt;Exceptions non gérées &lt;/li&gt;        &lt;li&gt;Exceptions internes à la CLR &lt;/li&gt;        &lt;li&gt;Exceptions de composants COM &lt;/li&gt;        &lt;li&gt;Recyclages &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Comment procéder au débogage ?&lt;/h3&gt;  &lt;p&gt;Ces problèmes, n’ont pas forcement été identifiés au préalable lors du développement et de la phase de tests et le plus souvent ne sont pas reproductibles sur une autre plateforme que la production. Comment faire pour investiguer et trouver l’origine du problème ?&lt;/p&gt;  &lt;p&gt;Le plan d’action le plus souvent utilisé est en 3 étapes :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Capture d’informations &lt;/li&gt;    &lt;li&gt;Rétablissement de la production &lt;/li&gt;    &lt;li&gt;Analyse ultérieure &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;&amp;gt;&amp;gt;&amp;gt; Suite : &lt;a href="http://blogs.msdn.com/sbovo/archive/2009/05/06/plandactioncapturedumpslogsretablissementiis.aspx"&gt;Plan d‘action pour la capture des informations lors d’un problème de production IIS&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9575450" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author></entry><entry><title>Gestion des versions des assemblies du GAC par ASP.NET</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/04/30/gestiondesversionsdllgacasp-net.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/04/30/gestiondesversionsdllgacasp-net.aspx</id><published>2009-04-30T09:36:00Z</published><updated>2009-04-30T09:36:00Z</updated><content type="html">&lt;p&gt;Le GAC nous permet de partager des assemblies entre plusieurs applications ASP.NET. La gestion des versions des ces assemblies en est aussi facilitée à condition de bien comprendre la différence entre &lt;strong&gt;Assembly version &lt;/strong&gt;et &lt;strong&gt;File version&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Allez hop... Petite explication !&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Lors de la mise à jour d’une assembly nous avons le choix entre changer l’&lt;strong&gt;Assembly version&lt;/strong&gt; et la &lt;strong&gt;File version&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/image_2.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="ProprieteProjet" border="0" alt="ProprieteProjet" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/image_thumb.png" width="520" height="249" /&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/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="Versions" border="0" alt="Versions" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/image_thumb_1.png" width="308" height="305" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pour illustrer les deux possibilités, prenons l’exemple de plusieurs sites Web utilisant une même assembly dans le GAC (Assembly V1.0.0.0 / File V1.0.0.0). Les Web.config des applications ASP.NET utilisent :&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="Assemblies" border="0" alt="Assemblies" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/image_7.png" width="330" height="107" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Possibilité 1 : Modification mineure = Correctif&lt;/h3&gt;  &lt;p&gt;&lt;em&gt;Nous mettons à jour cette assembly dans la GAC en gardant la même Assembly version mais en changeant la File version (Assembly V1.0.0.0 / &lt;b&gt;&lt;font color="#ff0000"&gt;File V1.1.0.0&lt;/font&gt;&lt;/b&gt;) &lt;/em&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dans la GAC, nous avons maintenant seulement la nouvelle assembly (Assembly V1.0.0.0 / File V1.1.0.0). Cette nouvelle assembly remplace la précédente car nous avons la même Assembly version. En effet, dans la GAC, deux assemblies du même nom ne peuvent pas avoir la même Assembly version &lt;/li&gt;    &lt;li&gt;Les applications en cours d’exécution utilisent toujours la version précédente (Assembly V1.0.0.0 / File V1.0.0.0) car pour elles rien ne leur indique un changement (le web.config n’a pas changé) &lt;/li&gt;    &lt;li&gt;Si l’appDomain redémarre : c'est-à-dire si l’application Web redémarre suite à une modification du Web.config par exemple, la nouvelle version n’est toujours pas chargée car l’ancienne est en mémoire dans le processus W3WP.EXE qui n’a pas redémarré &lt;/li&gt;    &lt;li&gt;Si le processus W3WP.EXE redémarre suite à un recyclage, un crash, alors la CLR va chercher dans le GAC la dll et prend la nouvelle version &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Possibilité 2 : Modification majeure = Nouvelle version&lt;/h3&gt;  &lt;p&gt;&lt;em&gt;Nous mettons à jour cette assembly dans la GAC en changeant le numéro de l’Assembly version (&lt;b&gt;&lt;font color="#ff0000"&gt;Assembly V2.0.0.0&lt;/font&gt;&lt;/b&gt;)&lt;/em&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dans la GAC, nous voyons maintenant les deux assemblies &lt;/li&gt; &lt;/ul&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="GAC" border="0" alt="GAC" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/clip_image002_3.jpg" width="414" height="129" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Les applications en cours d’exécution utiliseront toujours l’Assembly version 1.0.0.0 tant que le web.config n’est pas modifié pour mentionner le changement de version : &lt;/li&gt; &lt;/ul&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="AssemblyVersion" border="0" alt="AssemblyVersion" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/GestionDesVersionsDllGACASP.NET_E3C7/image_10.png" width="328" height="105" /&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Comme modifions le Web.config, l’appDomain redémarre (sans redémarrage du processus W3WP.EXE) et prend en charge la nouvelle version &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conclusion en images :-)&lt;/p&gt;  &lt;p&gt;   &lt;table style="border-bottom-color: black; border-top-color: black; border-right-color: black; border-left-color: black" border="0" cellspacing="0" cellpadding="0" width="460"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td style="background-color: black; color: white" colspan="2"&gt;Changement File version &lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="190"&gt;Redémarrage W3WP.EXE&lt;/td&gt;          &lt;td style="background-color: #339966; color: white" valign="top" width="270"&gt;Prise en compte de la nouvelle version&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="190"&gt;Modification Web.config            &lt;br /&gt;&lt;/td&gt;          &lt;td style="background-color: #cc0000; color: white" valign="top" width="270"&gt;Aucun changement&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;table style="border-bottom-color: black; border-top-color: black; border-right-color: black; border-left-color: black" border="0" cellspacing="0" cellpadding="0" width="460"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td style="background-color: black; color: white" colspan="2"&gt;Changement Assembly version &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="190"&gt;Redémarrage W3WP.EXE&lt;/td&gt;        &lt;td style="background-color: #cc0000; color: white" valign="top" width="270"&gt;Aucun changement&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="190"&gt;Modification Web.config&lt;/td&gt;        &lt;td style="background-color: #339966; color: white" valign="top" width="270"&gt;Prise en compte de la nouvelle version&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;J’espère que ces éclaircissements vous aideront dans vos déploiements en production. A bientôt,&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9562327" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx" /><category term="IIS" scheme="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx" /></entry><entry><title>Utilisez TinyGet pour effectuer rapidement une charge simple sur un serveur Web</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/04/10/utiliseztinygetpoureffectuerrapidementunechargesimplesurunserveurweb.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/04/10/utiliseztinygetpoureffectuerrapidementunechargesimplesurunserveurweb.aspx</id><published>2009-04-10T12:04:00Z</published><updated>2009-04-10T12:04:00Z</updated><content type="html">&lt;p&gt;L’outil &lt;strong&gt;TinyGet&lt;/strong&gt; n’a pas vocation remplacer un outil de test de charge blogs.mais il s’avère extrêmement pratique dans certains cas : Je vous conseille de le garder dans vos outils favoris. Il vous permettra de simuler une charge basique sur une application Web en quelques lignes de commandes.&lt;/p&gt;  &lt;p&gt;Les avantages sont les suivants :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Support du multithread pour effectuer des requêtes simultanées &lt;/li&gt;    &lt;li&gt;Support des itérations &lt;/li&gt;    &lt;li&gt;Paramétrage possible pour le type authentification, la version HTTP, les headers, le contenu de la requête, l’utilisation d’un certificat client &lt;/li&gt;    &lt;li&gt;Attente d’un contenu particulier pour la réponse, le code de retour&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Exemple de trois threads simultanés effectuant dix requêtes chacun&lt;/h3&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;tinyget.exe -srv:sbovo02 -uri:/default.aspx -status:200 -threads:3 -loop:10&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;-threads donne le nombre de threads lancés simultanément.&lt;/p&gt;  &lt;p&gt;-loop indique le nombre d’itérations&lt;/p&gt;  &lt;p&gt;-status représente le code de retour attendu. Si TinyGet n’obtient pas ce code, un message est affiché dans la console&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_5.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ConsoleIISRequests" border="0" alt="ConsoleIISRequests" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb.png" width="534" height="294" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Exemple d’une requête attendant un contenu particulier&lt;/h3&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;tinyget.exe -srv:sbovo02 -uri:/contenu.aspx -testContainString:&amp;quot;Texte&amp;quot;&lt;/p&gt;           &lt;/font&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;-testContainString permet de mentionner quelle chaine (contenu dans le body de la réponse) nous attendons&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_14.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TinyGetTexte" border="0" alt="TinyGetTexte" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_6.png" width="534" height="309" mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_6.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Exemple d’une requête avec l’affichage de la trace TinyGet ou les headers de la réponse&lt;/h3&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;tinyget.exe -srv:sbovo02 -uri:/stylesheet.css -trace&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;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_13.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_13.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TinyGetTrace" border="0" alt="TinyGetTrace" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_5.png" width="534" height="403" mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_5.png" /&gt;&lt;/a&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;tinyget.exe -srv:sbovo02 -uri:/stylesheet.css -headers&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;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_12.png" target="_blank" mce_href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="TinyGetHeaders" border="0" alt="TinyGetHeaders" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_4.png" width="534" height="187" mce_src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/UtilisationdeTinyGetpoureffectuerstresse_A2C9/image_thumb_4.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Pour télécharger l’outil et l’aide associée : IIS 6.0 Resource Kit Tools - &lt;a title="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1352" href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1352" mce_href="http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1352"&gt;http://www.iis.net/downloads/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1352&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je pense que vous avez bien vu l’utilité de cet outil soit pour simuler une charge soit pour vérifier les réponses d’une application Web. &lt;/p&gt;  &lt;p&gt;Bonne utilisation !&lt;/p&gt;  &lt;p&gt;Sebastien.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9535860" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.msdn.com/sbovo/archive/tags/ASP.NET/default.aspx" /><category term="Outils" scheme="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx" /><category term="IIS" scheme="http://blogs.msdn.com/sbovo/archive/tags/IIS/default.aspx" /></entry><entry><title>Comment lister les mises à jour (Hotfixes) Windows ?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/sbovo/archive/2009/04/03/commentlisterlesmisesajour-hotfixes-windows.aspx" /><id>http://blogs.msdn.com/sbovo/archive/2009/04/03/commentlisterlesmisesajour-hotfixes-windows.aspx</id><published>2009-04-03T12:20:00Z</published><updated>2009-04-03T12:20:00Z</updated><content type="html">&lt;p&gt;Bonjour,&lt;/p&gt;  &lt;p&gt;Dans le même esprit que mon &lt;a title="Comment savoir par script si Windows est 32bits ou 64bits ?" href="http://blogs.msdn.com/sbovo/archive/2009/04/02/commentsavoirparscriptsiwindowsest32ou64bits.aspx" target="_blank"&gt;précédent post&lt;/a&gt;, voici comment vous pouvez obtenir la liste des mises à jour ou hotfixes Windows en ligne de commande :&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;systeminfo&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/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image_5.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="systeminfo" border="0" alt="systeminfo" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image_thumb.png" width="504" height="88" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image_12.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ResultatSysteminfo" border="0" alt="ResultatSysteminfo" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image_thumb_2.png" width="504" height="575" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Et ainsi, nous pouvons facilement rechercher si une mise à jour particulière a bien été installé :&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;systeminfo | findstr KB961367&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/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image10_1.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="systeminfo_findstr" border="0" alt="systeminfo_findstr" src="http://blogs.msdn.com/blogfiles/sbovo/WindowsLiveWriter/CommentConnaitreLesMisesAJourHotfixesWin_F6BC/image10_thumb.png" width="504" height="88" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A noter, que &amp;quot;SystemInfo&amp;quot; donne une multitude d’informations supplémentaires qui peuvent vous être utile :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;OS Name&lt;/li&gt;    &lt;li&gt;OS Version&lt;/li&gt;    &lt;li&gt;Processor(s)&lt;/li&gt;    &lt;li&gt;Total Physical Memory&lt;/li&gt;    &lt;li&gt;Available Physical Memory&lt;/li&gt;    &lt;li&gt;Domain&lt;/li&gt;    &lt;li&gt;Logon Server&lt;/li&gt;    &lt;li&gt;etc…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&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=9529302" width="1" height="1"&gt;</content><author><name>sbovo</name><uri>http://blogs.msdn.com/members/sbovo.aspx</uri></author><category term="Outils" scheme="http://blogs.msdn.com/sbovo/archive/tags/Outils/default.aspx" /></entry></feed>