69 votes

Comment utiliser un fichier de vidage pour diagnostiquer une fuite de mémoire?

J'ai un .NET service avec une normale de travail privé de 80 MO. Lors d'un récent test de charge, le processus a atteint 3,5 GO de mémoire d'utilisation entraînant l'ensemble de la machine pour être faible sur la mémoire physique (3.9 de 4 GO utilisés), et la mémoire n'a pas été publié longtemps après le test de charge a été arrêté. En utilisant le gestionnaire des tâches, j'ai pris un fichier de vidage du processus et l'a ouvert dans Visual Studio 2010 SP1, et je suis en mesure de démarrer le débogage sur elle.

Comment faire pour diagnostiquer le problème de mémoire? J'ai dotTrace de la Mémoire 3.x à ma disposition, prend-il en charge le profilage de la mémoire sur les fichiers de vidage? Sinon, le profilage de la mémoire des fonctionnalités de Visual Studio 2010 Premium de l'aide (j'ai actuellement Professionnel)? Peut WinDbg aider?

Mise à JOUR: Le nouveau Visual Studio 2013 Ultimate peut désormais nativement diagnostiquer des problèmes de mémoire à l'aide de fichiers de vidage. Voir ce billet pour plus de détails.

122voto

wal Points 7092

Installer WinDbg. Vous devez vous assurer que vous obtenez la bonne version x86 ou x64 selon votre dump. Voici un lien direct de téléchargement pour x86.

Sur ce, vous devez vous assurer que vous avez pris le bon dump. Vous pouvez utiliser le Gestionnaire des Tâches pour créer le fichier de vidage (clic droit sur le processus -> Créer un Fichier de Vidage). Si vous êtes en 64 bits et de votre processus x86 utiliser la version 32 bits de Gestionnaire de Tâches (C:\Windows\SysWOW64\taskmgr.exe) afin de prendre le fichier de vidage. Voir mon article pour plus d'informations sur la prise de fichiers de vidage, par exemple, si vous êtes sur XP et que vous devez utiliser windbg pour créer le fichier de vidage.

avertissement il y a une pente assez raide de la courbe d'apprentissage et les choses risquent de ne pas fonctionner exactement comme décrit ici afin de revenir avec tous les problèmes.

Je suis en supposant que vous êtes en utilisant .NET4 donné, vous pouvez ouvrir le dump dans Visual Studio. Voici un très petit guide pour vous aider à travailler avec votre fichier dmp:

1) Exécuter WinDbg, jeu de symboles chemin d'accès (Fichier -> Chemin de Recherche de Symbole) à

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

2) Ouvrir le fichier de vidage sur incident ou faites glisser votre .Fichier DMP sur WinDbg.

3)tapez ceci dans la fenêtre de commande

.loadby sos clr

(Pour info, pour .NET 2, la commande doit être .loadby sos mscorwks)

4) puis tapez ceci

!dumpheap -stat

qui indique le type d'objets et de leur nombre. ressemble à quelque chose comme ceci:

enter image description here

Vous aurez à analyser dans le contexte de votre demande et de voir si quelque chose d'inhabituel.

Il y a beaucoup plus de windbg, google est votre ami.

30voto

Brian Rasmussen Points 68853

En général, si vous avez une fuite dans une application gérée, cela signifie que quelque chose n'est pas collecté. Les sources communes incluent

  • Les gestionnaires d'événements: Si l'abonné n'est pas supprimé l'editeur s'engage à le tenir.

  • La statique

  • Les finaliseurs: le blocage d'Un finaliseur permettra d'éviter le finaliseur fil de courir tous les autres outils de finalisation et ainsi éviter que ces instances soient recueillies.

  • De même, l'impasse thread va tenir à ce que les racines qu'il détient. Bien sûr, si vous avez l'impasse des threads qui affecteront probablement l'application sur plusieurs niveaux.

Pour résoudre ce problème, vous devez vérifier le tas managé. WinDbg + SOS (ou PSSCOR) qui vous permettra de le faire. L' !dumpheap -stat commande répertorie l'ensemble de tas managé.

Vous devez avoir une idée du nombre d'instances de chaque type d'attendre sur le tas. Une fois que vous trouvez quelque chose qui semble étrange, vous pouvez utiliser l' !dumpheap -mt <METHOD TABLE> de la commande à la liste de toutes les instances d'un type donné.

L'étape suivante consiste à analyser les racines de ces instances. Choisissez-en un au hasard et de faire un !gcroot sur qui. Pour montrer comment cette instance est enracinée. Regardez pour les gestionnaires d'événements et épinglé les objets (généralement de représenter les références statiques). Si vous voyez le finaliseur file d'attente de là, vous avez besoin d'examiner ce que le finaliseur thread est en train de faire. Utiliser l' !threads et !clrstack des commandes pour cet.

Si tout semble parfait pour cette instance de passer à une autre instance. Si cela ne donne rien, vous devrez peut-être revenir pour regarder le tas de nouveau et répétez la procédure à partir de là.

D'autres sources de fuites comprennent: les ensembles qui ne sont pas déchargées et de la fragmentation du Tas d'Objets Volumineux. SOS/PSSCOR peut vous aider à localiser ces derniers aussi bien, mais je vais passer les détails pour l'instant.

Si vous voulez en savoir plus je vous recommande de Tess blog. J'ai aussi fait quelques vidéos couvrant comment utiliser WinDbg + SOS (ici et ici).

Si vous avez l'option de débogage du processus alors qu'elle s'exécute, je recommande d'utiliser PSSCOR au lieu de SOS. PSSCOR est essentiellement une branche privé de la SOS sources qui a été amélioré avec des commandes supplémentaires et un grand nombre de commandes SOS ont été améliorés. E. g. le PSSCOR version de l' !dumpheap commande est très utile delta de la colonne, ce qui rend le dépannage des fuites de mémoire beaucoup plus facile.

Pour l'utiliser vous avez besoin pour commencer votre processus, joindre WinDbg et de la charge PSSCOR et faire un !dumpheap -stat. Ensuite, vous laissez le processus d'exécution de nouveau si les allocations sont effectuées. Pause l'exécution et répétez la commande. Maintenant PSSCOR va vous montrer le nombre d'instances qui ont été ajoutés ou supprimés depuis l'inspection précédente.

0voto

Lex Li Points 18214

http://msdn.microsoft.com/en-us/library/ee817660.aspx

Microsoft a un guide ici. Cependant, c'est trop dur pour les débutants.

dotTrace peut générer des graphiques de mémoire visuelle (mieux que WinDbg), mais ne l'utilisez jamais pour des sauvegardes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X