2009-01-31 10 views
14

Lorsque vous utilisez la commande windbg et la commande! Dumpheap pour voir les adresses d'objets, comment pouvez-vous limiter un nombre spécifique d'objets. La seule façon que j'ai trouvé était en utilisant CTRL + BREAK et une ligne de commande sur un blog http://dotnetdebug.net/2005/07/04/dumpheap-parameters-and-some-general-information-on-sos-help-system/Limiter! Dumpheap (windbg) à n objets

-l X - Imprime seulement X éléments de chaque tas au lieu de tous les objets.

ne semble plus en existe -l SOS.dll

+1

Je sais que c'est une vieille question, mais avez-vous réussi à trouver une réponse? –

Répondre

5

Que recherchez-vous en fait pour? Avant de regarder des objets individuels, il est habituel de réduire la zone d'intérêt.

Le commutateur -stat affiche un résumé, par type d'objets sur le tas.

dumpheap [-stat] [-min] [- max] [-thinlock] [-MT] [type] [démarrer [end]]

  • L'option -stat restreint la sortie au résumé de type statistique.
  • L'option -min ignore les objets inférieurs au paramètre size, spécifié en octets.
  • L'option -max ignore les objets dont la taille est supérieure au paramètre de taille spécifié en octets.
  • L'option -thinlock signale ThinLocks. Pour plus d'informations, voir la commande SyncBlk.
  • L'option -mt répertorie uniquement les objets qui correspondent à la structure MethodTable spécifiée.
  • L'option -type répertorie uniquement les objets dont le nom de type est une correspondance de sous-chaîne de la chaîne spécifiée.

Le paramètre de démarrage commence la liste à partir de l'adresse spécifiée. Le paramètre de fin arrête la liste à l'adresse spécifiée.

Ref.

+0

Je cherche des objets individuels. -stat -min 100 -max 150 me montre 150K + petits objets. –

+9

SUppose que vous avez 150k entrées de la même taille et du même type (comme dans mon cas) - comment diable pouvez-vous trouver une seule adresse de l'un d'entre eux? Si vous imprimez la liste complète Vous êtes en train il y a maintenant condamné moyen d'interrompre l'inscription pour les 30 prochaines minutes (sauf tuer le processus) – bitbonk

6

Selon quels critères souhaitez-vous limiter le nombre de sorties? L'option -l limite simplement la sortie en fonction des numéros de ligne. C'est inutile: disons qu'il ne montre que les 10 premiers objets, peut-être que l'objet que vous cherchez n'est même pas listé.

Si la sortie est trop longue pour la fenêtre de sortie WinDbgs, utilisez .logopen pour vider les objets dans un fichier, puis passez en revue le fichier avec un éditeur de texte.

Si vous avez d'autres idées comment votre objet ressemble, vous pouvez effectuer une boucle sur tous les objets

.foreach (obj { !dumpheap -short -type MyType}) 

puis déterminer avec .if si votre objet correspond à ce critère. Par exemple, je cherchais une aiguille dans une botte de foin. Je cherchais une Hashtable spécifique dans un programme avec plus de 3000 Hashtables sur le tas. La commande que j'ai essayé d'utiliser était

.foreach (obj { !dumpheap -short -type Hashtable }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} } 

1C est le décalage de l'organe de comptage du Hashtable.

100 est le nombre d'éléments Hashtable devait avoir au moins.

Malheureusement, cela n'a pas fonctionné pour Hashtables immédiatement, parce que !dumpheap -type a également énuméré HashtableEnumerators qui s'est écrasé en quelque sorte le débogueur.

Pour de vidage hashtables uniquement, exécutez !dumpheap -stat et figure sur la table des méthodes de hashage et exécutez la commande avec -mt <methodtable> au lieu de -type <classname>, qui donne

.foreach (obj { !dumpheap -short -mt <MT of Hashtable> }) {.if (poi(poi(${obj}+1c)) > 100) {!do ${obj}} } 
+1

Pour les futurs lecteurs: vous devriez être en mesure d'utiliser '-mt' avec l'adresse de table de la méthode de 'HashTable'. Vous obtenez cette information en exécutant '! Dumpheap -stat', puis recherchez' HashTable' pour l'adresse de la table de méthodes. – xxbbcc

+0

@xxbbcc: Vous avez raison. En attendant, j'utilise ça aussi. Mise à jour de la réponse –

+0

Merci pour la mise à jour. Votre réponse a été très utile pour dépister une fuite de mémoire. – xxbbcc

Questions connexes