Aperçu
valgrind propose divers 'outils' pour analyser différents types de problèmes. L'outil le plus couramment utilisé est 'Memcheck', qui détecte les erreurs de mémoire à l'exécution. D'autres outils incluent Cachegrind (profilage de cache), Callgrind (profilage d'appels de fonctions), Helgrind/DRD (détection de bugs de threads), Massif (profilage de tas), etc.
Fonctionnalités principales
valgrind offre les fonctionnalités principales suivantes :
- Détection de fuites de mémoire
- Détection d'accès mémoire invalides
- Détection d'utilisation de valeurs non initialisées
- Détection de corruption du tas
- Détection de conditions de concurrence de threads
- Profilage du cache CPU et des appels de fonctions
Installation
valgrind n'est généralement pas inclus par défaut dans la plupart des distributions Linux, il doit donc être installé via le gestionnaire de paquets.
Debian/Ubuntu
sudo apt update
sudo apt install valgrind
Installation à l'aide du gestionnaire de paquets APT.
RHEL/CentOS/Fedora
sudo yum install valgrind # ou sudo dnf install valgrind
Installation à l'aide du gestionnaire de paquets YUM ou DNF.
Options principales
valgrind est utilisé avec divers outils, chacun ayant ses propres options. Ici, nous décrivons les options couramment utilisées avec l'outil Memcheck.
Options générales
Options Memcheck
Commande générée :
Essayez de combiner les commandes.
Description:
`valgrind` Exécute la commande.
Essayez d'exécuter virtuellement les commandes avec l'IA en combinant les options ci-dessus.
Exemples d'utilisation
Divers exemples d'utilisation de valgrind pour analyser un programme. Nous supposons ici l'utilisation d'un fichier exécutable nommé `my_program`.
Vérification de base des erreurs de mémoire
valgrind ./my_program
Utilisation la plus basique pour vérifier les erreurs de mémoire de `my_program`.
Vérification détaillée des fuites de mémoire
valgrind --leak-check=full --show-leak-kinds=all ./my_program
Rapporte en détail toutes les erreurs de mémoire, y compris les fuites, et affiche tous les types de fuites.
Suivi des valeurs non initialisées
valgrind --track-origins=yes ./my_program
Lorsqu'une valeur non initialisée est utilisée, cette commande permet de suivre sa provenance et de la rapporter.
Profilage du cache avec Cachegrind
valgrind --tool=cachegrind ./my_program
Analyse l'utilisation du cache CPU pour trouver les goulots d'étranglement de performance. Les résultats sont enregistrés dans le fichier `cg.out.<pid>`.
Profilage des appels de fonctions avec Callgrind
valgrind --tool=callgrind ./my_program
Analyse le nombre d'appels de fonctions et leur coût. Les résultats sont enregistrés dans le fichier `callgrind.out.<pid>`.
Conseils et précautions
Conseils pour utiliser valgrind efficacement et points à considérer.
Inclusion des symboles de débogage
Pour que valgrind rapporte les noms de fichiers et numéros de ligne corrects, vous devez inclure les symboles de débogage lors de la compilation du programme (par exemple, utiliser l'option `-g` avec GCC/Clang).
- Utiliser l'option `-g` lors de la compilation : `gcc -g my_program.c -o my_program`
Surcharge de performance
valgrind exécute le programme dans une machine virtuelle, il est donc beaucoup plus lent que l'exécution normale (de 5 à plus de 100 fois). Il peut donc ne pas convenir aux tests sensibles aux performances ou aux programmes de longue durée.
- Augmentation du temps d'exécution : 5 à 100 fois plus lent que l'exécution normale
- Prudence lors de l'analyse de grands programmes
Interprétation de la sortie
La sortie de valgrind est détaillée mais peut sembler complexe au début. Lisez attentivement les messages d'erreur et les traces de pile, et concentrez-vous particulièrement sur les messages 'definitely lost' (fuites certaines) pour la résolution.
- Analyse des messages d'erreur et des traces de pile
- Résoudre en priorité les fuites 'definitely lost'
Utilisation d'autres outils
En plus de Memcheck, il existe divers autres outils comme Cachegrind, Callgrind, Massif, etc. Choisissez l'outil approprié en fonction de vos besoins.
- Analyse des performances : `cachegrind`, `callgrind`
- Analyse de l'utilisation du tas : `massif`
- Problèmes de threads : `helgrind`, `drd`