J'ai reçu l'adresse d'un grand objet géré dans WinDbg, et ensuite?
-
10-07-2019 - |
Question
J'ai créé un cliché utilisant beaucoup de mémoire et en utilisant! dumpheap -stat et! dumpheap -mt, j'ai reçu l'adresse de deux listes génériques de chaînes volumineuses de 30 Mo chacune.
Je veux en savoir plus sur ces listes. Ce qu’ils contiennent ou quel morceau de code les utilise.
Y a-t-il un moyen de les découvrir?
0: 000 > ! do 2b370038 Nom: System.Object [] MethodTable: 71e240bc Classe CEE: 71c0da54 Taille: 33554448 (0x2000010) octets Matrice: rang 1, nombre d'éléments 8388608, type CLASS Type d'élément: System.Collections.Generic.List`1 [[System.String, mscorlib]] Des champs: Aucun
La solution
Pour obtenir des informations sur les instances de tableau, vous pouvez utiliser la commande ! dumparray
avec l'indicateur -details
. Soyez averti cependant que le vidage d'un tableau entier peut prendre un certain temps et générer beaucoup de texte.
Pour savoir ce qui maintient les instances en vie, utilisez la commande ! gcroot
. Vous pouvez également consulter la commande ! Refs
de sosex.dll.
sosex.dll a également une commande ! gcgen
, qui peut vous indiquer la génération des instances. IIRC, une commande correspondante a été ajoutée à la version CLR 4.0 de sos.dll.
Autres conseils
Je vous recommande d'essayer .Net Memory Profiler ( http://memprofiler.com ) pour explorer les vidages de mémoire gérée. . C'est tellement plus facile que windbg. Une interface graphique agréable que vous pouvez utiliser pour rechercher et explorer des graphiques de références. Vous pouvez également voir les valeurs des champs d'instances.