Open Source Tools

Code-Analyse mit Valgrind

17.09.2009 | Autor / Redakteur: Christian Pössinger und Wolfram Gettert, Mixed Mode* / Martina Hafner

Valgrind ist sowohl ein flexibles Framework um eigene Werkzeuge zu erstellen als auch eine fertige Toolsammlung. Welche Möglichkeiten bieten die beliebten Werkzeuge?

Valgrind, in der nordischen Mythologie der Haupteingang zur Walhalla (grind = „Gitter“), ist ein spezielles Analyseframework für unixbasierte Embedded Systeme, das als freie Open-Source-Software unter der Gnu Public License verfügbar ist. Zu seinem Einsatzbereich gehören das Auffinden von Speicherlecks, Cacheanalyse, Erstellen von Call-Graphen, Ermitteln des Ressourcenbedarfs und Auffinden von Race-Conditions/Deadlocks auf der POSIX Pthread API aufbauenden Codes.

Erkauft werden diese Vorteile durch stark erhöhte Rechenzeit, bedingt durch die Analyse und Interpretation der Programme. Auch hängt die Codeabdeckung der Analyse stark von den verarbeiteten Daten des Programms ab. Es können nur die Programmteile analysiert werden, die tatsächlich auch durchlaufen werden.

So arbeitet Valgrind

Valgrind ist ein CPU-Simulator für x86, x86_64, ppc32 und ppc64-Systeme. Dabei werden die Maschinenbefehle des zu untersuchenden Codes zuerst analysiert und anschließend auf der CPU ausgeführt. Welcher Teil der Instruktionen analysiert und welcher direkt auf der CPU ausgeführt wird, hängt von der Art der Analyse ab. Folglich kann sich die Ausführung des Codes um den Faktor 10 oder mehr verlangsamen.

Valgrind besteht in sich aus mehreren ausgereiften Tools, die wiederum in verschiedenen Detaillierungsstufen arbeiten können. Auf diese Weise kann der Benutzer Art und technische Tiefe der Analyse exakt vorgeben. Die Funktionsweise von Valgrind basiert unmittelbar auf den Binärdateien der Applikation und ist damit völlig unabhängig von der verwendeten Programmiersprache und dem Compiler bzw. dem Interpreter.

Valgrind ist zwar zur Verwendung mit in C/C++ geschriebenen Anwendungen optimiert, kann aber auch zur Analyse von Ada, Fortran, Java, Perl und Python verwendet werden. Durch diesen Ansatz findet Valgrind sogar Fehler, die erst durch den Compiler oder Interpreter eingeschleppt wurden.

Ergänzendes zum Thema
 

Expertenmeinung zu Valgrind

Der Aufruf eines der Tools aus Valgrind folgt immer einer vorgegebenen Syntax. Dabei wird stets das Präfix valgrind verwendet gefolgt von der Option --tool= , dem der Name des Tools und darauf eventuelle toolspezifische Argumente folgen:

shell> valgrind --tool= ./binary

Valgrind besteht aus fünf Tools zur Codeanalyse:

Speicheranalyse mit Memcheck

Screenshot Memcheck
Screenshot Memcheck

Im Allgemeinen verfügen Embedded Systeme nur über eine begrenzte Speichermenge, weisen aber lange Standzeiten auf. Daher stellen Speicherlecks für sie ein enormes Problem dar: wächst der von einer Applikation verwendete Speicher ohne Rückgabe stetig an, führt das zu einer zunehmenden Verlangsamung und im Extremfall zum Versagen des gesamten Systems.

Das meistverwendete Tool von Valgrind ist der Speicheranalysator Memcheck. Er wertet alle Lese- und Schreibzugriffe auf den Speicher aus und substituiert jedes malloc(), free(), new delete, new[] und delete[] durch eine eigene Implementierung der jeweiligen Funktion, um auf Grundlage dabei erhaltener Daten die Fehleranalysen durchzuführen. Memcheck erkennt potentiell fehlerhafte Zugriffe auf Speicherbereiche, beispielsweise auf solche, die schon freigegeben sind. Die Verwendung von Adreßzeigern mit ungültigem Wert (dangling pointer) wird gemeldet. Bei der Verwendung von memcpy() oder ähnlichen Funktionen prüft Valgrind auf mögliche Überlappung von Quell- und Zielbereich.

Inhalt des Artikels:

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 316521 / Software-Implementierung)