2010-10-03 5 views
0

J'ai récemment détecté une fuite de mémoire dans mon application et j'aimerais ajouter un cas de test pour vérifier qu'il reste comme ça. Qu'est-ce que je veux faire est ce:En utilisant Sos (dumpheap etc) du code de test?

int numberOfInstancesBeforeFunction = GetNumberOfInstancesInMemory(typeof(MyClass)); 

PerformFunction(); 

GC.Collect(); 

int numberOfInstancesAfterFunction = GetNumberOfInstancesInMemory(typeof(MyClass)); 

Assert.AreEqual(numberOfInstancesBeforeFunction, numberOfInstancesAfterFunction, "mem leak"); 

Est-ce possible?

Merci,

Euan

+0

Avez-vous déjà trouvé un moyen de contrôler réellement sos à partir du code? Je voudrais être capable de faire plus que simplement compter le comptage ... – PeterJCLaw

Répondre

0

Il y a des conseils sur la façon d'y parvenir en utilisant WeakReference dans la réponse acceptée de Robinson @Adam here.

GetNumberOfInstancesInMemory devrait vérifier un conteneur statique de MyClass objet WeakReference s pour voir combien de retour thisReference.IsAlive = true; (et supprimer toutes celles qui ont isAlive = false.

Toute construction de MyClass ajouterait une référence à lui-même au conteneur statique.

Je pense qu'il ya une manière élégante Linq pour encapsuler la logique nécessaire.

Je ne sais pas s'il y a un moyen de le faire sans y incorporer du code supplémentaire en yo ur MyClass.

+0

Ah, cela fonctionne bien. Merci beaucoup. – Euan

+0

@Euan - super, mais prenez note de la mise en garde de @Hans Passant qui introduit de nouvelles fuites en cours de route. Occasion classique Heisenbug. –

Questions connexes