ubuntuusers.de

Valgrind

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

valgrind-logo.png

Valgrind 🇬🇧 ist eine häufig bei der Analyse von Programmfehlern ("bug analysis") verwendete, quelloffene Kommandozeilen-Werkzeugsammlung (mit einigen vorhandenen grafischen Frontends) zum Debuggen, Profilen und zur dynamischen Fehleranalyse von Linux-Programmen.

Eine Anleitung, valgrind aus dem Source-Code zu erstellen findet sich in diesem Blog-Beitrag 🇬🇧. }}}

Funktionsweise

Valgrind startet das zu testende Programm in einer virtuellen Maschine, so dass kein Programm direkt auf der Gast-CPU ausgeführt wird. Stattdessen übersetzt Valgrind das Programm in einen temporären, einfacheren und Plattform-unabhängigen Byte-Code, den sogenannten Ucode. Nach der Konvertierung können verschiedene Valgrind-Hilfsprogramme ("tools") diverse Transformationen vornehmen (z.B. Überwachen des Speichers oder Erstellen eines Ablauf-Profils), bevor Valgrind den neuen Code nimmt, in Maschinencode übersetzt und schließlich ausführt.

Zwar lässt die Konvertierung in den Ucode und zurück ein Programm um ein vielfaches langsamer laufen, dazu addieren sich dann noch die Zeiten der verschiedenen Werkzeuge, jedoch ist der Ucode wesentlich geeigneter für das Debuggen und das Erstellen der Werkzeuge, und die langsame Ausführungszeit ist für die meisten Programme kein Problem. Hinzu kommt der Vorteil, dass das zu prüfende Programm nicht aufbereitet zu werden, ja nicht einmal im Quellcode vorzuliegen braucht.

Valgrind funktioniert am besten mit Programmen, die Debugging-Information enthalten (also mit dem Flag -g in gcc/g++ kompiliert wurden), damit es Probleme zeilengenau aufspüren kann. Unter Ubuntu sollte man daher (falls vorhanden) vor dem Testen mit Valgrind das Debugging-Paket des zu testenden Programms (<Paket>-dbg) installieren, z. B. pidgin-dbg.

Installation

Valgrind kann im Softwarecenter installiert werden, in der Suche "Valgrind" nutzen.

Im Terminal

Valgrind ist in den Ubuntu-Quellen enthalten. Dazu muss folgendes Paket installiert [1] werden.

  • valgrind

Befehl zum Installieren der Pakete:

sudo apt-get install valgrind 

Oder mit apturl installieren, Link: apt://valgrind

Aus dem Quellcode

Zur manuellen Installation werden neben den Paketen zum Kompilieren noch folgende Pakete benötigt [1]:

  • autotools-dev

  • debhelper

  • dpatch

  • gdb

  • libc6-dev

  • gcc-multilib

  • libc6-dbg (empfohlen: verbessert die Ergebnisse von Valgrind)

Befehl zum Installieren der Pakete:

sudo apt-get install autotools-dev debhelper dpatch gdb libc6-dev gcc-multilib libc6-dbg 

Oder mit apturl installieren, Link: apt://autotools-dev,debhelper,dpatch,gdb,libc6-dev,gcc-multilib,libc6-dbg

Von der Valgrind-Homepage 🇬🇧 sollte man sich die aktuelle Version als Quellcode herunterladen und entpacken. Danach wird das Programm gemäß der Debian-Paketierungsmethode kompiliert und installiert [2].

Tools

Valgrind ist ein Programmpaket, welches aus mehreren einzelnen Hilfsprogrammen ("tools") besteht. Es können außerdem mehrere inoffizielle Tools in den Quellcode eingebunden werden, diese sind auf der Valgrind-Homepage aufgelistet. Folgende Hilfsprogramme helfen einem bei der Fehleranalyse:

Memcheck

Das wichtigste Tool ist memcheck, welches folgende Fehler finden kann:

  • Benutzung von nicht initialisiertem Speicher

  • Lese- und Schreibzugriffe auf freigegebenen Speicher

  • Schreiben über die Speichergrenzen hinaus

  • Speicherlecks

Helgrind

Das Werkzeug helgrind hilft bei der Suche nach Race Conditions und erleichtert das Debuggen mit Threads.

Cachegrind

cachegrind ist auf jede Programmiersprache anwendbar und führt den Code 20-100-mal langsamer als normal aus. Es überprüft Fehler im Zugriff auf die Cache-Verwaltung der CPU.

Callgrind

callgrind ermittelt umfangreiche Statistiken über das eingesetzte Programm. Die Zahlen sind auf verschiedenen Systemen direkt miteinander vergleichbar, weil diese nicht die benötigte Ausführungszeit messen, sondern die Anzahl der CPU-Takte. Es gibt auch an, ob Algorithmen besonders schnell im Cache der CPU laufen können und wie oft es zu einem Treffer ("cache hit") oder Nicht-Treffer ("cache miss") kommt. Die Größe der Caches kann man variieren, somit lassen sich verschiedene CPUs simulieren.

Massif

massif zeigt den verwendeten Dynamischen Speicher (Heap-Memory) des Programms an.

Lackey

lackey gibt allgemeine Informationen über die Programmausführung aus.

Benutzung

Im Wesentlichen startet man Valgrind mit dem Befehl und Pfad zur Startdatei [3]

valgrind -v --leak-check=yes Programm 

Hinweis:

Folgendes Beispiel testet ein Programm in /opt:

valgrind --leak-check=yes /opt/Programm/Startdatei

Ein umfassender Prüfaufruf kann wie folgt aussehen:

valgrind -v --tool=callgrind --tool=memcheck --tool=helgrind --tool=cachegrind --tool=lackey --log-file=valgrind.log /opt/Programm/Startdatei

Für <Programm> und <Programm-Optionen> wird das zu debuggende Programm mit den Optionen eingesetzt. Wenn man z.B. das Programm ls mit der Option -l durch callgrind testen möchte, startet man

valgrind --tool=callgrind ls -l 

Programm-Optionen

Valgrind hat sehr viele Optionen, mit denen man das Debuggen steuern, regeln und verbessern kann. Eine vollständige Liste findet sich in der Manpage z.B. auf: www.valgrind.org 🇬🇧

Die wichtigsten Optionen sind:

  • --tool=<toolname> (Standard: memcheck)

Startet das genannte Valgrind-Tool, z.B. Memcheck, Helgrind, Cachegrind usw.

--tool=memcheck --tool=helgrind --tool=cachegrind 
  • --time-stamp=<yes|no> (Standard: no)

Falls diese Option aktiviert ist, zeigt Valgrind in der Log-Datei einen auf Millisekunden genauen Zeitstempel bei jeder Aktion an.

--time-stamp=yes 
  • --log-file=<Dateiname>

Legt fest, dass Valgrind alle Log-Nachrichten in der angegebenen Datei im /home Verzeichnis speichert. Eine Ausgabe im Terminal erfolgt dann nicht mehr. Beispiel:

--log-file=valgrind.log 
  • --log-socket=<Ip-Adresse:Port-Nummer>

Legt fest, dass Valgrind alle Log-Nachrichten an die festgelegte IP-Adresse sendet. Dabei muss der Port nicht zwingend genannt werden, Standard-Port ist 1500. Falls die IP-Adresse nicht erreichbar ist, wählt Valgrind den Standard-Error-Output (stderr). Beispiel:

valgrind --tool=callgrind --log-socket=127.0.0.1:1234 
  • --leak-check=<no|summary|yes|full> (Standard: summary)

Normalerweise gibt Valgrind beim Fund von Speicherlecks ("memory leaks") nur die Meldung aus, dass solche gefunden wurden (plus Anzahl). Falls der Wert auf full steht, gibt es zusätzliche Informationen zum Speicherleck aus. Dies ist nur bei memcheck verwendbar.

Valgrind Ergebnis

Im Terminal kann ein Ergebnis von Problemen so aussehen:

(java:4390): Gdk-WARNING **: 16:27:35.560: The GDK_NATIVE_WINDOWS environment variable is not supported in GTK3.

Valgrind und Launchpad

Wenn man (z.B. mit Hilfe von Apport) einen Fehlerbericht zu einem Programmabsturz bei Launchpad erstellt, kommt es häufig vor, dass die Entwickler mehr Informationen zu dem Absturz ("crash") haben möchten. Deshalb fordern sie mit dem folgenden Text einen Valgrind-Log:

Thank you for taking the time to report this bug and helping to make Ubuntu better. Please try to obtain a valgrind log following the instructions at https://wiki.ubuntu.com/Valgrind and attach the file to the bug report. This will greatly help us in tracking down your problem.

Um eine für die Entwickler brauchbare Log-Datei zu erstellen, startet man Valgrind mit dem folgenden Befehl

G_SLICE=always-malloc G_DEBUG=gc-friendly  valgrind -v --tool=memcheck --leak-check=full --num-callers=40 --log-file=valgrind.log <Programm> <Programm-Optionen> 

Experten-Info:

G_SLICE und G_DEBUG sind Umgebungsvariablen von GLib 🇬🇧, die (in diesem Fall) das Debuggen verbessern bzw. erst ermöglichen.

Nach dem Start sollte man die Schritte durchführen, die nötig sind, um den Fehler oder Absturz zu reproduzieren.

Die Log-Datei valgrind.log befindet sich im /home Ordner, man kann diese nun bei Launchpad 🇬🇧 in dem Fehlerbericht ("bug report") hochladen und so den Entwicklern zur Verfügung stellen.

Intern

  • Fehler melden – Allgemeiner Artikel zum Melden von Fehlern in Programmen

Extern

Diese Revision wurde am 18. Januar 2022 19:20 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: ungetestet, Debugging, Programmierung