2017-04-10 1 views
1

Une vidage du tas GC de mon processus géré a révélé qu'il y avait beaucoup, entre autres types, de grands objets string.Comment puis-je suivre une chaîne jusqu'à la ligne de code, le nom de méthode, le nom de classe et l'assembly dans lequel elle a été créée?

Je mis le doigt sur deux d'entre eux.

> dumpheap -type System.String 
> !do <address> 

Cela me dit ce que le contenu de la chaîne sont, entre autres choses que je n'étais pas très intéressé par

Alors, je suivi la chaîne jusqu'à sa racine GC. Mais d'abord, je voulais confirmer que c'était sur LOH.

> !gcwhere <address> 
> !gcroot <address> 

Maintenant, c'est à peu près aussi loin que je pouvais. Je voudrais savoir où (quelle ligne de code l'a créé, de préférence, dumpil de cette ligne) avec la description de la méthode qui l'a créée, le type de déclaration de cette méthode, l'assemblage et l'application domaine dans lequel l'assembly a été chargé

Répondre

1

Le framework .NET n'a pas besoin de ces informations pour que l'application s'exécute, il ne le stocke donc pas. Il n'y a pas non plus de drapeau similaire au paramètre GFlags +ust qui activerait un tel stockage. Ce n'est pas possible avec ce que vous avez comme outils en ce moment (un fichier de vidage ou un débogage en direct). Vous avez besoin d'un profileur de mémoire comme ANTS memory profiler ou JetBrains dotMemory. Même ceux-ci ne collectent pas les données d'allocation par défaut et vous devez l'activer.

Capture d'écran de dotMemory:

dotMemory Screenshot

+0

Thsnk vous. J'ai une licence dotMemory. Je vais utiliser ça. –

+1

dotMemory est capable de collecter des allocations d'objets dès le début, vous devez cocher la case "Collecter l'allocation immédiatement" lors du démarrage de votre application sous profileur. https://www.jetbrains.com/help/dotmemory/2017.1/Configuring_Profiling_Process.html –

+0

Oui, j'ai vu ça. J'utilise actuellement la version d'évaluation en attendant ma clé de licence. La version d'évaluation a la case à cocher ** Check allocation immédiatement ** désactivée et n'a pas le bouton ** Collect Allocations ** que Thomas mentionne dans sa réponse. –