accueil > Environnement & utilitaires > valgrind

valgrind : outil de débogage et de profilage de la mémoire

valgrind est une suite d'outils puissants utilisés pour détecter les erreurs de gestion de la mémoire dans les programmes (par exemple, fuites de mémoire, accès mémoire invalides), identifier les problèmes liés aux threads (conditions de concurrence) et effectuer un profilage des performances. Il est principalement utilisé pour le débogage de programmes C/C++.

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`

Commandes de la même catégorie