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

    echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
    setarch `uname -m` -R /bin/bash
    
  • sanitizer

Date: 28 Octobre 2019

Author: Cyril Bordage, Marc Fuentes

Created: 2019-11-15 or. 19:14

Validate