46 votes

Comment profiler l'utilisation de la mémoire ?

Je connais Valgrind, mais il ne détecte que les problèmes de gestion de la mémoire. Ce que je cherche, c'est un outil qui me donne une vue d'ensemble, quelles parties de mon programme consomment combien de mémoire. Une représentation graphique avec par exemple une carte arborescente (comme KCachegrind le fait pour Callgrind) serait cool.

Je travaille sur une machine Linux, les outils Windows ne me seront donc pas d'une grande aide.

50voto

ismail Points 19146

Utilisez massif qui fait partie des outils Valgrind. massif-visualisateur peut vous aider à représenter graphiquement les données ou vous pouvez simplement utiliser la fonction ms_print commandement.

14voto

Paolo M Points 584

Essayez le profileur de tas livré avec gperftools par Google. Je l'ai toujours construit à partir des sources, mais il est disponible en tant que paquet précompilé sous plusieurs distros Linux.

Son utilisation est aussi simple que de lier une bibliothèque dynamique à vos exécutables et d'exécuter le programme. Il collecte des informations sur chaque allocation de mémoire dynamique (pour autant que j'aie pu le voir) et sauvegarde sur le disque un fichier vidage de la mémoire chaque fois que l'une des situations suivantes se produit :

  • HEAP_PROFILE_ALLOCATION_INTERVAL octets ont été alloués par le programme (par défaut : 1Gb)
  • le point culminant de l'utilisation de la mémoire augmente de HEAP_PROFILE_INUSE_INTERVAL octets (par défaut : 100Mb)
  • HEAP_PROFILE_TIME_INTERVAL secondes se sont écoulées (par défaut : inactif)
  • Vous appelez explicitement HeapProfilerDump() de votre code

La dernière, d'après mon expérience, est la plus utile car vous pouvez contrôler exactement quand avoir un instantané de la utilisation du tas puis comparez deux instantanés différents et voyez ce qui ne va pas.

Enfin, il existe plusieurs formats de sortie possibles, tels que textuel ou graphique (sous la forme d'un graphe dirigé) :

Graph of memory usage

En utilisant cet outil, j'ai pu repérer des utilisations incorrectes de la mémoire que je ne pouvais pas trouver en utilisant Massif.

6voto

Matthieu Brucher Points 18535

Une option "plus récente" est HeapTrack . Contrairement au massif, il s'agit d'une version instrumentée de malloc / free qui stocke tous les appels et génère un journal.

L'interface graphique est agréable (mais nécessite Qt5 IIRC) et les délais des résultats (parce que vous pouvez vouloir suivre le temps aussi) sont moins biaisés que ceux de valgrind (car ils ne sont pas émulés).

-2voto

Rohit Points 106

Utiliser l'option callgrind avec valgrind

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