web-dev-qa-db-fra.com

Comment fonctionne valgrind?

Quelqu'un peut-il fournir une explication rapide de haut niveau sur le fonctionnement de Valgrind? Un exemple: comment savoir quand la mémoire est allouée et libérée?

76
extraeee

Valgrind exécute essentiellement votre application dans un "bac à sable". Lors de son exécution dans ce bac à sable, il est capable d'insérer ses propres instructions pour effectuer un débogage et un profilage avancés.

Du manuel:

Votre programme est ensuite exécuté sur un processeur synthétique fourni par le noyau Valgrind. Lorsque le nouveau code est exécuté pour la première fois, le noyau remet le code à l'outil sélectionné. L'outil y ajoute son propre code d'instrumentation et remet le résultat au cœur, qui coordonne l'exécution continue de ce code instrumenté.

Donc, fondamentalement, valgrind fournit un processeur virtuel qui exécute votre application. Cependant, avant que vos instructions d'application ne soient traitées, elles sont transmises à des outils (tels que memcheck). Ces outils sont un peu comme des plugins, et ils sont capables de modifier votre application avant qu'elle ne soit exécutée sur le processeur.

La grande chose à propos de cette approche est que vous n'avez pas du tout à modifier ou à relier votre programme pour l'exécuter dans valgrind. Cela ralentit votre programme, mais valgrind n'est pas destiné à mesurer les performances ou à s'exécuter pendant l'exécution normale de votre application, ce n'est donc pas vraiment un problème.

99
jheddings

Valgrind est un outil d'analyse binaire dynamique (DPA) qui utilise le framework Dynamic Binary Instrumentation (DPI) pour vérifier l'allocation de mémoire, pour détecter les blocages et pour profiler les applications. Le framework DPI possède son propre gestionnaire de mémoire de bas niveau, son ordonnanceur, son gestionnaire de threads et son gestionnaire de signaux. La suite d'outils Valgrind comprend des outils tels que

  1. Memcheck - suit dynamiquement l'allocation de mémoire et signale les fuites de mémoire.
  2. Helgrind - détecte et signale les verrous morts, les courses de données potentielles et les inversions de verrous.
  3. Cachegrind - simule la façon dont l'application interagit avec le cache système et fournit des informations sur les échecs de cache.
  4. Nulgrind - un simple valgrind qui ne fait aucune analyse. Utilisé par les développeurs pour les performances de référence.
  5. Massif - un outil pour analyser l'utilisation de la mémoire de tas de l'application.

L'outil Valgrind utilise un mécanisme de démontage et de resynthèse où il charge l'application dans un processus, désassemble le code d'application, ajoute le code d'instrumentation pour l'analyse, le réassemble et exécute l'application. Il utilise Just Intime Compiler (JIT) pour incorporer l'application avec le code d'instrumentation.

             Valgrind Tool = Valgrind Core + Tool Plugin

Valgrind Core désassemble le code d'application et transmet le fragment de code au plugin d'outil pour l'instrumentation. Le plugin outil ajoute le code d'analyse et le réassemble. Ainsi, Valgrind offre la flexibilité d'écrire notre propre outil au-dessus du framework Valgrind. Valgrind utilise des registres cachés et une mémoire cachée pour instrumenter les instructions de lecture/écriture, les appels système en lecture/écriture, la pile et les allocations de tas.

Valgrind fournit des enveloppes autour de l'appel système et enregistre les rappels avant et après chaque appel système pour suivre la mémoire accédée dans le cadre de l'appel système. Ainsi, Valgrind est une couche d'abstraction du système d'exploitation entre le système d'exploitation Linux et l'application cliente.

Le diagramme illustre les 8 phases de Valgrind:

8 phases of Valgrind

30
Ashok Vairavan

valgrind se trouve en tant que couche entre votre programme et le système d'exploitation, interceptant les appels au système d'exploitation demandant l'allocation (dé) mémoire et enregistrant ce qui est manipulé avant d'allouer réellement la mémoire et de lui renvoyer un équivalent. C'est essentiellement la façon dont la plupart des profileurs de code fonctionnent, sauf à un niveau beaucoup plus bas (appels système au lieu d'appels de fonction de programme).

4
Amber
2
kalad

Valgrind est fondamentalement une machine virtuelle qui exécute votre programme. Il s'agit d'une architecture virtuelle qui intercepte chaque appel pour allouer/libérer de la mémoire.

2
Charles Salvia