Question

Comment répertorier tous les objets instanciés dans toutes les applications, à l'aide de FASTMM4 ou du gestionnaire de mémoire par défaut?

Était-ce utile?

La solution

Vous pourriez probablement faire cela avec FastMM4, mais ce serait compliqué. Essayez d’examiner le code de la procédure ScanForMemoryLeaks pour voir comment il fonctionne.

Cette routine vérifie toute la mémoire de mémoire attribuée avec la liste des fuites de mémoire attendues et signale tout ce qui apparaît, y compris un compte et le nom de la classe d'objet s'il trouve des objets. Ce que vous voulez faire est de vérifier toute la mémoire de tas attribuée et de rapporter le nombre et le nom de classe d'objet de tous les objets que vous trouvez. Il s'agit donc d'une tâche très similaire. Oubliez simplement la vérification de la liste des pointeurs enregistrés et filtrez tout ce qui n'est pas un objet.

Autres conseils

Bien, ce n’est ni supporté ni encouragé, mais en fonction de votre situation, vous pourrez peut-être éditer TObject pour créer et détruire des enregistrements - puisque tous les objets sont TObject, cela peut faire l'affaire. Cependant, modifier la VCL est vraiment très mal vu, donc je me demande si vous pouvez utiliser un objet Helper (disponible depuis 2006, je pense) pour faire la même chose. Écrivez dans une autre liste, etc. avec les détails de chaque objet créé.

Un moyen intéressant de mettre en œuvre la suggestion de Tony Allen pourrait être d’accrocher les méthodes de création et de destruction d’objet au moment de l’exécution. Il existe une bibliothèque intéressante sur Google Code faisant partie du projet AsmProfiler (un très joli travail à mon humble avis) qui pourrait faire l'affaire. Voici le lien vers l'unité KOLDetours . qui fait tout le gros du travail.

FWIW J’ai implémenté une structure dans Delphi 4/5 jours qui contenait une classe de base instrumentée qui suivait éventuellement la création / destruction d’objets. Cela a bien fonctionné pour traquer les fuites d'objets et autres, mais a généré une énorme quantité d'informations. FASTMM4 est une bien meilleure option si tout ce que vous avez besoin de savoir, c'est quels objets ont fui lors de l'arrêt.

Vous pouvez changer de gestionnaire de mémoire en appelant SetMemoryManager. Vous pouvez écrire votre propre MM, qui sera un stub simple: il redirigera tous les appels vers l'ancien MM (ce qui est FastMM, vous pouvez l'obtenir en appelant GetMemoryManager) et enregistre toutes les opérations de mémoire quelque part. Vous pouvez détecter la création / destruction d’objets en consultant la pile d’appel: l’appel doit être effectué à partir de la méthode NewInstance de TObject.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top