web-dev-qa-db-fra.com

Profilage d'allocation de mémoire en C++

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.

38
amit

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. 

14
javier-sanz

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.

9
sth

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

8
Nitin Bhide

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.

5
Canopus

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.

3
mtosic

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.

3
Charlie Martin

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.

2
Stewart Lynch

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.

1
Michael Burr

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.

1
Ricky Lung

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:

http://en.wikipedia.org/wiki/IBM_Rational_Purify

1
Andy White

Je viens de voir sur le site AQtime qu'ils ont un bon support pour "Allocation Profiling". 

0
amit

Essayez le gperftools - il peut:

  • profil des parties spécifiques du code ou le programme entier à la fois.
  • représenter des données via des graphiques dirigés visuels montrant les appels de fonctions exactes et leur héritage.
  • se concentrer sur des régions spécifiques de code dans un graphique visuel.
  • affichez diff entre les décharges.
  • afficher l'espace alloué au lieu d'utiliser - tout cela est fait avec le même vidage.

En outre, cela n’affecte presque pas l’efficacité du programme.

0
abyss.7