J'ai quelques millions d'objets qui traînent en mémoire. Je veux trouver les gcroots pour eux donc j'ai besoin d'une adresse d'objet. ! DumpHeap saute cependant tous les objets qui prennent plus de temps que j'ai eu la patience d'attendre. Comment puis-je limiter sa sortie à une seule adresse d'objet? J'utilise Visual Studio 2008 btw.Comment vider uniquement l'adresse du premier objet avec! DumpHeap (.load sos)
Répondre
Jason Evans a raison. Ma version ne possède pas l'option -l, alors voici la solution que j'utilise: J'utilise le paramètre final pour limiter la sortie à une plage d'adresses comme ceci:
!dumpheap -mt 0794f29c 0 04000000
La dernière adresse est l'adresse la plus élevée je permets . En augmentant l'adresse en petites étapes, j'ai finalement frappé les premiers objets.
Découvrez this page. Il semble que vous pouvez utiliser
-l X
pour limiter le nombre d'éléments affichés.
Le meilleur point de départ est l'argument -stat. Cela va vider un résumé de la table d'objet en direct par opposition à chaque objet dans le système. Il vous donnera une bonne idée sur ce que les objets en particulier sont à l'origine les plus frais généraux
!dumpheap -stat
Je voudrais aussi Recomend jeter un oeil sur les articles de blog suivants, car ils sont destinés à aider les gens à utiliser WinDbg pour traquer ce genre du problème
Merci, je sais déjà quel type d'objet est à l'origine parce que j'ai déjà fait cela.Je dois maintenant savoir où ces objets sont référencés – usr
!dumpheap -type System.String -short
Est-ce que vider l'adresse des objets
Merci Cela ne semble pas limiter la taille de sortie en termes de nombres de lignes Avec un million d'objets, cela prend encore trop de temps. – usr
Cette option semble être inconnu à Visual Studio. Peut-être que je dois utiliser WinDbg. – usr
Je n'ai pas pu confirmer cela, mais il est possible que la version de SOS.dll que vous utilisez n'ait pas cette option. Il existe actuellement deux versions de SOS.dll flottant - pour .NET Framework 1.1 et 2.0. Ma conjecture est que la version 1.1 a l'option -l et peut-être la version 2.0 ne l'a pas. Si tel est le cas, alors vous pourriez utiliser la version 2.0, donc ma suggestion n'est pas viable pour vous. Gutted :( –