valgrind
Table of Contents
Salut à toi ! Bienvenue dans la bidouille !
Utilise « C-c C-o » (control+c puis control+o) pour suivre les liens (les trucs soulignés en bleu ci-dessous).
1 Valgrind
Outil de programmation libre pour déboguer, effectuer du profilage de code et mettre en évidence des fuites mémoires (cf wikipedia).
Prononciation : [vælɡrɪnd].
1.1 Tools
Utilisation d'un outil avec --tool=<tool>
1.1.1 Memcheck
- Surveille lectures et écritures dans la mémoire pour détecter erreurs
telles que :
- Fuites mémoire
- Accès à des zones interdites
- Mauvaises libérations mémoire
- Utilisations de variables non initialisées
- Exécution lente (10 à 30 fois plus lent)
1.1.2 Cachegrind
- Profileur de cache qui peut indiquer la source des défauts de cache
- Exécution très lente (20 à 100 fois plus lent)
1.1.3 Callgrind
- Extension de Cachegrind qui donne le graphe d'appels
- kcachegrind : outil pour visualiser les traces
- Fonctions appelantes
- Fonctions appelées
- Temps passé dans chaque fonction
1.1.4 Massif
- Profileur de tas et de pile avec prise d'instantanés
- Visualisation avec
ms_print
- Pour petits programmes, changement d'unités avec
-time-unit=B
- Exécution très lente (20 fois plus lent)
1.1.5 Helgrind
- Débogueur de threads pour trouver les problèmes d'accès concurrents
1.2 API
- De nombreuses possibilités d'interagir avec valgrind, pour notamment le guider pour éviter des faux-positifs
1.3 Fichier de suppression
- Permet à valgrind d'ignorer certaines erreurs
- Règles génériques possibles
- Génération du fichir de suppressions pour le processus courant avec
--gen-suppressions=<yes|no|all>
- Utilisation d'un fichier de suppressions avec
--suppressions=<filename>
2 Sanitizer
- Vérifications mémoire comme memcheck : address, leak, undefined
- Google sanitizer intégré dans LLVM, gcc
- Activation dans gcc avec : -fsanitize=address -fsanitize=leak -fsanitize=undefined
3 gdb
On peut coupler ce dévermineur avec d'autres programmes.
3.1 Avec valgrind
- Valgrind arrête le processus à chaque erreur
- Utilisation
valgrind --vgdb-error=0
gdb : target remote | /usr/lib/valgrind/../../bin/vgdb [--pid=<PID>]
3.2 Utilisation du rewind
3.2.1 gdb seul
target record-full
- no support for AVX instructions
3.2.2 rr
gcc -O0 -ggdb3 -o reverse.out -std=c89 -Wextra reverse.c
rr record ./reverse.out
rr replay
- reverse-step, reverse-cont… possibles
4 Exemple pratique : débogage
- valgrind
- valgrind+gdb
gdb
- Point de surveillance
- Désactiver ASLR
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
setarch `uname -m` -R /bin/bash
- sanitizer