J'écris une application et je suis surpris de voir que son utilisation totale de mémoire est déjà trop élevée. Je souhaite décrire l'utilisation dynamique de la mémoire de mon application: combien d'objets de chaque type se trouvent dans le tas et quelles fonctions ont créé ces objets? En outre, combien de mémoire est utilisée par chacun des objets?
Y a-t-il un moyen simple de faire cela? Je travaille à la fois sous Linux et Windows, de sorte que les outils de n'importe quelle plate-forme suffiraient.
REMARQUE: les fuites de mémoire ne m'inquiètent pas.
Avez-vous essayé Valgrind ? C'est un outil de profilage pour Linux. Il possède un vérificateur de mémoire (pour les fuites de mémoire et d’autres problèmes de mémoire) appelé Memcheck, mais il possède également un profileur de tas appelé Massif.
Pour des statistiques simples, juste pour savoir où toute la mémoire est utilisée, vous pouvez ajouter un modèle comme celui-ci:
template<class T>
class Stats {
static int instance_count;
public:
Stats() {
instance_count++;
}
~Stats() {
instance_count--;
}
static void print() {
std::cout << instance_count << " instances of " << typeid(T).name() <<
", " << sizeof(T) << " bytes each." << std::endl;
}
};
template<class T>
int Stats<T>::instance_count = 0;
Ensuite, vous pouvez l'ajouter en tant que classe de base aux classes que vous soupçonnez avoir un grand nombre d'instances et imprimer des statistiques sur l'utilisation de la mémoire en cours:
class A : Stats<A> {
};
void print_stats() {
Stats<A>::print();
Stats<B>::print();
...
}
Cela ne vous indique pas dans quelles fonctions les objets ont été alloués et ne donne pas trop de détails, mais cela pourrait me suffire pour localiser les endroits où la mémoire est perdue.
Pour Windows, vérifiez les fonctions dans "crtdbg.h". crtdbg.h contient la version de débogage des fonctions d'allocation de mémoire. Il contient également une fonction permettant de détecter les fuites de mémoire, les corruptions, de vérifier la validité des pointeurs de tas, etc.
Je pense que les fonctions suivantes vous seront utiles.
_CrtMemDumpStatistics _ CrtMemDumpAllObjectsSince
Le lien MSDN suivant répertorie les fonctions de rapport d'état de tas et l'exemple de code http://msdn.Microsoft.com/en-us/library/wc28wkas(VS.80).aspx
Vous pouvez essayer Memory Validator à partir de http://www.softwareverify.com/cpp/memory/index.html
Il s’agit de l’un des meilleurs outils que je connaisse pour établir un profil de l’utilisation de la mémoire. La version d'évaluation de 30 jours est disponible en téléchargement gratuit.
MTuner - un profileur de mémoire libre C/C++. Description ci-dessous:
MTuner est un outil multi-plateforme de profilage de mémoire, de détection de fuites et d'analyse prenant en charge les compilateurs MSVC, GCC et Clang. Les caractéristiques incluent: historique de la mémoire basé sur la chronologie, filtrage puissant, SDK pour instrumentation manuelle avec code source complet, prise en charge de l'intégration continue via l'utilisation de la ligne de commande, détection des fuites de mémoire, etc. Définissez le profil de n'importe quelle plate-forme de logiciel ciblant les compilateurs croisés GCC ou Clang. Fournit un support intégré pour les plates-formes Windows, PlayStation 4 et PlayStation 3 et une plate-forme ciblée par un compilateur croisé basé sur Windows.
Il y a plusieurs choses que vous pouvez faire. Le plus simple est de relier une bibliothèque de débogage malloc; Un certain nombre d'entre eux sont disponibles, en fonction des détails de votre environnement (par exemple, Google pour _malloc_dbg pour Windows.)
Le deuxième choix est que vous pouvez surcharger new et delete en C++; il est possible de surcharger le nouveau de base et de le supprimer avec de nouvelles fonctions qui suivent l’allocation et l’utilisation de la mémoire.
Je viens de publier un profileur de mémoire natif Win32, MemPro, en version bêta gratuite. http://www.puredevsoftware.com/MemPro.htm . Il se connecte à nouveau/supprimer et envoie des données à une application externe où vous pouvez afficher les allocations de différentes manières. J'espère que cela vous aidera.
Le chapitre 1.10 de Programmation de jeux Gems Volume 2 ( Lien Amazon ) détaille un gestionnaire de mémoire de débogage Drop-in simple mais efficace de Peter Dalton, qui fournit un ensemble correct de statistiques lorsque vous videz le journal.
Le chapitre 4.6 de Programmation de jeux Gems Volume 8 (lien de prévisualisation Safari Book) détaille un profileur de mémoire avancé de Ricky Lung qui peut afficher les statistiques d’allocation de manière hiérarchique, tout en prenant en charge le multitâche.
Dans un travail précédent, nous utilisions un outil appelé "Purifier". C'est un produit fabriqué par Rational/IBM. Je ne pense pas que ce soit un outil gratuit, mais je me souviens que c'était plutôt bon. Voici quelques informations:
Je viens de voir sur le site AQtime qu'ils ont un bon support pour "Allocation Profiling".
Essayez le gperftools - il peut:
En outre, cela n’affecte presque pas l’efficacité du programme.