Debogage .NET avec WinDbg et SOS - Objects
Dans le précédent billet, nous parlions des threads. Continuons… et intéressons-nous aux objets en mémoire.
Objets sur la pile d’appels
!dso |
(pour dump stack objets)
!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 :
Deux informations sont importantes ici :
- La deuxième colonne donne l’adresse mémoire de l’objet - sur 64bits s’il vous plait:-)
- La troisième colonne indique le "type" de l’objet ; c’est à dire sa classe
Voici un extrait du résultat de !dso :
RSP/REG Object Name
...
00000000039ae340 000000013f4655d0 System.String
00000000039ae350 000000013f5df210 System.Web.HttpRequest
00000000039ae358 000000013f5e5920 System.Web.UI.ControlCollection
00000000039ae360 000000013f5e56d0 System.Web.UI.HtmlControls.HtmlForm
00000000039ae370 000000013f4656b0 System.String
00000000039ae388 000000013f5e56d0 System.Web.UI.HtmlControls.HtmlForm
00000000039ae3b8 000000013f5e0de8 ASP.search_aspx
...
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.
Prenons, par exemple, l’objet HttpRequest stocké sur la pile d’appel :
00000000039ae350 000000013f5df210 System.Web.HttpRequest
Analyse d’un objet
!do AdresseMemoire |
(pour dump objet)
!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.
Suivez le guide…
!do 000000013f5df210 |
pour l’objet de type System.Web.HttpRequest
Vous avez repéré l'adresse de la propriété _url ?
!do 000000013f5e9658 |
pour l’objet _url de type System.Uri contenu dans l’objet HttpRequest précédent
Un dernier petit effort pour avoir l’url demandée par cette requête HTTP, voyons voir "m_String" :
!do 000000013f5e95d0 |
pour l’objet m_String de type System.String contenu dans l’objet Uri précédent
Enfin, nous y voila
String: https://localhost:80/BlogEngine/search.aspx?q=BlogEngine
Tout simplement fantastique ! :-) Et ce n’est que le début. "!DumpHeap -stat" vous connaissez ?
Bye, Sebastien.
>>> Suite : Debogage .NET avec WinDbg et SOS - Travaux Pratiques