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é) :
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.