Valgrind

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

Sommaire

Description

Valgrind est un puissant outil de débogage qui permet de détecter des problèmes de mémoire. Il peut trouver des fuites de mémoire (memory leak), mais aussi des accès à de la mémoire non allouée ou désallouée, des désallocations multiples et autres. Si vous avez une erreur de segmentation (segmentation fault), broken pipe ou bus error lorsque vous exécutez votre programme, vous avez vraisemblablement un problème avec l'utilisation de la mémoire.

Valgrind est installé sur la plupart des serveurs de Calcul Québec et est disponible via un module. Pour connaître le nom exact du module, exécutez la commande :

[nom@serveur $] module avail 2>&1 | grep valgrind


Préparer votre programme

Pour extraire de l'information utile avec Valgrind, vous devez d'abord compiler votre code avec les informations de débogage. Avec les compilateurs GNU et Intel, vous devez pour ce faire ajouter l'option « -g » à la compilation. Pour les autres compilateurs, veuillez vérifier leur documentation.

Certaines optimisations très pointues peuvent aussi générer des erreurs lorsque vous exécutez Valgrind. C'est le cas notamment d'opérations effectuées par la bibliothèque MKL. Puisque vous ne voulez pas diagnostiquer des problèmes de mémoire dans la bibliothèque, mais dans votre propre code, nous vous recommandons - pour fins de diagnostic uniquement - de compiler votre code en liant sur une version de base (Netlib) des bibliothèques BLAS et LAPACK plutôt que MKL.

Utiliser Valgrind

Lorsque votre programme est compilé avec les bonnes options, vous l'exécutez dans Valgrind ainsi :

[nom@serveur $] valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./votre_programme


Pour davantage d'informations, nous vous conseillons la page suivante (en anglais).

Quelques conseils

  • Lorsque vous utilisez Valgrind, votre code s'exécute dans une machine virtuelle qui valide tous les accès à la mémoire. Il s'exécutera ainsi beaucoup plus lentement. Choisissez donc une taille de problème beaucoup plus petite que ce que vous exécuteriez normalement.
  • Il n'est pas nécessaire que votre programme se termine avec une erreur de segmentation ou autre afin que Valgrind puisse détecter des erreurs. Très fréquemment, des problèmes d'accès mémoire mineurs - tel que lire un seul élément au-delà des limites d'un tableau - passent inaperçus jusqu'à ce qu'ils deviennent majeurs. Valgrind détectera même le plus petit accès mémoire en dehors des limites déclarées d'un tableau.

Quelques messages typiques

Voici quelques problèmes que Valgrind peut détecter et les messages d'erreur qu'il produit.

Fuites de mémoire

Le message d'erreur pour une fuite de mémoire sera produit à la fin de l'exécution du programme et ressemblera à ceci :

==2116== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2116==    at 0x1B900DD0: malloc (vg_replace_malloc.c:131)
==2116==    by 0x804840F: main (in /home/cprogram/example1)

Utilisation invalide de pointeurs et dépassement de bornes

Si vous tentez d'écrire dans un pointeur non alloué, ou en dehors des bornes de mémoire allouées, le message d'erreur ressemblera à

==9814==  Invalid write of size 1
==9814==    at 0x804841E: main (example2.c:6)
==9814==  Address 0x1BA3607A is 0 bytes after a block of size 10 alloc'd
==9814==    at 0x1B900DD0: malloc (vg_replace_malloc.c:131)
==9814==    by 0x804840F: main (example2.c:5)

Utilisation de variables non initialisées

Si vous utilisez une variable non initialisée, le message d'erreur sera

==17943== Conditional jump or move depends on uninitialised value(s)
==17943==    at 0x804840A: main (example3.c:6)
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager