Partenaires



UNIVERSITE

PARIS DESCARTES

MAP5

Pages personnelles

Valgrind Valgrind est une plateforme dédiée à l'analyse dynamique. Elle est composée de différents modules.

Massif

  • Massif est un outil construit pour l'analyse de la mémoire allouée sur le tas. Bien que ce ne soit pas son comportement par défaut il peut aussi mesurer la taille de la pile mémoire du programme.
  • Massif permet donc de confronter l'idée que le développeur se fait de l'utilisation mémoire de son exécutable avec la réalité mesurée sur le terrain.
  • Si MemCheck, le composant Valgrind dédié à l'étude des fuites mémoires permet de les traquer efficacement il ne détecte pas les cas d'allocation de mémoire qui reste inusitée et toujours référencée.
  • Enfin Massif ne se contente pas de dire combien de mémoire est allouée mais où elle l'est.
Dans un premier temps compiler le programme en mode débogage avec l'option -g puis lancer :
valgrind --tool=massif monprog

L'exécution s'en trouve fort ralentie et par défaut un fichier du nom de massif.out.pid est créé où pid est le numéro du processus en cours (changer le nom du fichier avec l'option --massif-out-file option).

Lancer en ligne de commande l'instruction suivante (parfois il est besoin d'activer l'option --time-unit=B) :
ms_print massif.out.pid

Ceci génère un rendu graphique en mode texte décrivant l'évolution de la quantité de mémoire utilisée au fil du temps. Chaque colonne représente un cliché instantané proportionnel à l'usage mémoire fait à cet instant. Noter que l'on peut modifier les échelles en x et y grâce aux option --x et --y.
Pour créer la figure ci-dessus Massif a pris 84 clichés, un par allocation/déallocation dans le tas. Par défaut le nombre maximum de clichés est de 100 et peut être changé avec l'option --max-snapshots. On distingue trois types de clichés :
  • la plupart d'entre eux sont dits normaux et sont représentés par le signe :
  • d'autres sont détaillés et stockent de l'information, ils sont représentés par le caractère @
  • enfin le pic mémoire est signalé par le caractère #


Le tableau ci-dessus donne plusieurs informations pour les huit premiers clichés, le dernier étant détaillé :
  • son numéro
  • le temps auquel le cliché a été pris (grâce à l'option --time-unit=B)
  • le nombre total d'octets utiles alloués dans le tas
  • le nombre total d'extra octets alloués dans le tas
  • la taille de la pile qui n'est pas active par défaut (à changer avec l'option --stacks=yes)

Callgrind

Callgrind est un outil de profilage basé sur l'historique des appels de fonctions qu'il représente sous forme arborescente. Callgrind stocke par défaut :
  • les instructions exécutées et leur relation au code source
  • les relations appelant/appelé entre fonctions, leur coûts et le nombre de ces appels
Compiler le programme en mode débogage avec l'option -g puis lancer :
valgrind --tool=callgrind monprog

L'exécution s'en trouve fort ralentie et par défaut un fichier du nom de callgrind.out.pid est créé où pid est le numéro du processus en cours.
L'interface de visualisation graphique kcachegrind permet de traiter les données, parfois volumineuses, qui sont générées par callgrind et de les compiler sous une forme facilement interprétable.
Afin d'obtenir un tel rendu graphique taper :
kcachegrind callgrind.out.pid

Memcheck

Memcheck est un détecteur d'erreur de mémoire. Il opère sur les programmes C et C++ et met en évidence les problèmes suivants :
  • accès illégal d'une plage mémoire, par exemple qui aurait déjà été libérée
  • utilisation de valeur non définies, typiquement non initialisées ou définies à partir de valeurs elles-mêmes indéfinies
  • utilisation incorrecte des fonctions de déaloccation, par exemple double déallocation de mémoire sur le tas ou non respect des correspondances new/new[ ]/malloc avec delete/delete[ ]/free
  • chevauchement des pointeurs src et dst dans les fonctions memcpy et associées
  • fuites de mémoire
Compiler le programme en mode débogage avec l'option -g puis lancer :
valgrind --tool=memcheck monprog