Seite wählen

Memory-Leaks mit Valgrind finden

von | Mrz 22, 2012 | Linux, Technology, Development

Wer in C Programme schreibt, weiss, wie schwierig es ist, per malloc() angeforderten Speicher wieder freizugeben. Allzu leicht vergisst man den entsprechenden free()-Aufruf, was dann zu Memory Leaks führt.
Solche Fehler per Hand zu finden, ist je nach Komplexität des Programms sehr schwierig. Glücklicherweise gibt es eine Reihe von Tools, die bei der Suche von Memory Leaks helfen.
Eines dieser Tools ist Valgrind. Neben Memory Leaks kann es auch eine ganze Reihe anderer Fehler finden (z.B. Buffer Overflows, Benutzung von nicht-initialisiertem Speicher, Benutzung von Speicher, nachdem dieser per free() wieder freigegeben wurde, und vieles mehr).
Wir verwendeten ein kleines Programm mit einem offensichtlichen Memory Leak, um herauszufinden, wie Valgrind arbeitet:

#include <stdlib.h>
int main(int argc, char **argv) {
    malloc(128);
    return 0;
}

Zunächst kompilieren wir unser Programm mit gcc. Wichtig ist hierbei, dass wir Debug-Symbole (-g) aktivieren, da die Ausgabe von Valgrind ansonsten deutlich weniger Details enthält:
$ gcc -g -o leak leak.c
Danach können wir unser Programm mit Valgrind starten. Mit der Option –leak-check=yes geben wir an, dass Valgrind Leaks finden soll. Standardmäßig würde uns Valgrind sonst nur eine Zusammenfassung des verwendeten Speichers ausgeben.
$ valgrind --leak-check=yes ./leak
==9663== Memcheck, a memory error detector
==9663== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==9663== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==9663== Command: ./leak
==9663==
==9663==
==9663== HEAP SUMMARY:
==9663== in use at exit: 128 bytes in 1 blocks
==9663== total heap usage: 1 allocs, 0 frees, 128 bytes allocated
==9663==
==9663== 128 bytes in 1 blocks are definitely lost in loss record 1 of 1
==9663== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==9663== by 0x40050C: main (leak.c:4)
==9663==
==9663== LEAK SUMMARY:
==9663== definitely lost: 128 bytes in 1 blocks
==9663== indirectly lost: 0 bytes in 0 blocks
==9663== possibly lost: 0 bytes in 0 blocks
==9663== still reachable: 0 bytes in 0 blocks
==9663== suppressed: 0 bytes in 0 blocks
==9663==
==9663== For counts of detected and suppressed errors, rerun with: -v
==9663== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)

Valgrind gibt uns für jedes gefundene Memory Leak einen Stacktrace aus, aus dem hervorgeht, wo der Speicher ursprünglich per malloc()/new angefordert wurde:
==9663== 128 bytes in 1 blocks are definitely lost in loss record 1 of 1
==9663== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==9663== by 0x40050C: main (leak.c:4)

Weitere Informationen zu Valgrind gibt es auf der offiziellen Webseite.

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Linux | Technology | Development

Kibana Sicherheits-Updates: CVSS:Critical

Und täglich grüßt das Murmeltier. Nein nicht ganz. Heute ist es  aus der Elastic Stack Werkzeugkiste Kibana, für das es ein wichtiges Sicherheits-Update gibt. Es besteht auf jeden Fall Handlungsbedarf! IMHO auch wenn ihr die "Reporting" Funktion deaktiviert habt. Der...