[[Vorlage(archiviert, )]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme kompilieren: Pakete aus dem Quellcode erstellen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(valgrind-logo.png, 88, right)]] [http://valgrind.org/ Valgrind] {en} 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 [https://robgolebiowski.wordpress.com/2016/08/19/valgrind-failing-on-ubuntu/ Blog-Beitrag] {en}. }}} = 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 ''(-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. {{{#!vorlage Paketinstallation valgrind }}} == Aus dem Quellcode == Zur manuellen Installation werden neben den Paketen zum Kompilieren noch folgende Pakete benötigt [1]: {{{#!vorlage Paketinstallation autotools-dev debhelper dpatch gdb libc6-dev gcc-multilib libc6-dbg, empfohlen: verbessert die Ergebnisse von Valgrind }}} Von der [http://valgrind.org/downloads/current.html Valgrind-Homepage] {en} 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 [http://valgrind.org/downloads/variants.html 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 [wikipedia:Race_Condition: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 [wikipedia:Dynamischer_Speicher: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] {{{#!vorlage Befehl valgrind -v --leak-check=yes Programm }}} {{{#!vorlage 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 ```` und ```` 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 {{{#!vorlage Befehl 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 [:man:Manpage] z.B. auf: [http://www.valgrind.org/docs/manual/manual-core.html#manual-core.flags www.valgrind.org] {en} Die wichtigsten Optionen sind: * `--tool=` (Standard: memcheck) Startet das genannte Valgrind-Tool, z.B. Memcheck, Helgrind, Cachegrind usw. {{{#!vorlage Befehl --tool=memcheck --tool=helgrind --tool=cachegrind }}} * `--time-stamp=` (Standard: no) Falls diese Option aktiviert ist, zeigt Valgrind in der Log-Datei einen auf Millisekunden genauen Zeitstempel bei jeder Aktion an. {{{#!vorlage Befehl --time-stamp=yes }}} * `--log-file=` Legt fest, dass Valgrind alle Log-Nachrichten in der angegebenen Datei im '''/home''' Verzeichnis speichert. Eine Ausgabe im Terminal erfolgt dann nicht mehr. Beispiel: {{{#!vorlage Befehl --log-file=valgrind.log }}} * `--log-socket=` 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: {{{#!vorlage Befehl valgrind --tool=callgrind --log-socket=127.0.0.1:1234 }}} * `--leak-check=` (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 [:Fehler_melden: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 {{{#!vorlage Befehl G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind -v --tool=memcheck --leak-check=full --num-callers=40 --log-file=valgrind.log }}} {{{#!vorlage Experten ``G_SLICE`` und ``G_DEBUG`` sind [http://library.gnome.org/devel/glib/stable/glib-running.html Umgebungsvariablen von GLib] {en}, 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 [http://www.launchpad.net Launchpad] {en} in dem Fehlerbericht ("bug report") hochladen und so den Entwicklern zur Verfügung stellen. = Links = == Intern == * [:Fehler melden:] – Allgemeiner Artikel zum Melden von Fehlern in Programmen == Extern == * [ubuntu:Valgrind: Ubuntu Wiki] * [wikipedia:Valgrind: Wikipedia] * [http://valgrind.org/docs/manual/manual.html Valgrind User Manual] {en} * [http://linux.die.net/man/1/valgrind Valgrind-Manpage] mit allen Optionen und Parametern {en} #tag: Programmierung, Debugging