web-dev-qa-db-fra.com

Comment profiler l'utilisation de la mémoire?

Je connais Valgrind, mais il ne fait que détecter les problèmes de gestion de la mémoire. Ce que je recherche est un outil qui me donne un aperçu des parties de mon programme qui consomment combien de mémoire. Une représentation graphique avec par exemple une arborescence (comme KCachegrind le fait pour Callgrind) serait bien.

Je travaille sur une machine Linux, les outils Windows ne m'aideront donc pas beaucoup.

28
math

Utilisez massif , qui fait partie des outils de Valgrind. massif-visualizer peut vous aider à représenter graphiquement les données ou vous pouvez simplement utiliser la commande ms_print.

29
ismail

Essayez le profileur de tas fourni avec gperftools de Google. Je l'ai toujours construit à partir de sources, mais il est disponible sous forme de paquet précompilé sous plusieurs distributions Linux.

C'est aussi simple à utiliser 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 (autant que je sache) et enregistre sur le disque un vidage de la mémoire chaque fois que l'un des événements suivants se produit:

  • HEAP_PROFILE_ALLOCATION_INTERVAL octets ont été alloués par le programme (par défaut: 1 Go)
  • la marque d'utilisation de la mémoire en eau élevée augmente de HEAP_PROFILE_INUSE_INTERVAL octets (par défaut: 100 Mo)
  • HEAP_PROFILE_TIME_INTERVAL secondes se sont écoulées (par défaut: inactif)
  • Vous appelez explicitement HeapProfilerDump() à partir de votre code

Le dernier, selon mon expérience, est le plus utile, car vous pouvez contrôler le moment exact pour obtenir un instantané de l'utilisation de heap, puis comparer deux instantanés différents et voir ce qui ne va pas.

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

Graph of memory usage

En utilisant cet outil, j'ai pu détecter des utilisations de mémoire incorrectes que je ne pouvais pas utiliser avec Massif.

6
Paolo M

Une option "plus récente" est HeapTrack . Contrairement à massif, il s’agit d’une version instrumentée de malloc/free qui stocke tous les appels et affiche un journal.

La GUI est agréable (mais nécessite Qt5 IIRC) et les résultats (car vous pouvez également vouloir suivre le temps) sont moins biaisés que valgrind (car ils ne sont pas imités).

0
Matthieu Brucher