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 :

dso 

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.

WindbgZoneSaisie

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.HttpRequestdo

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édentdo

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édentdostring

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