Kihagyás

Memóriakezelés

Valgrind – memóriakezelési hibák felderítése

C nyelvű programokban a memóriakezelés a fejlesztő felelőssége: a malloc()-kal lefoglalt memóriát kézzel kell felszabadítani, és figyelni kell arra, hogy ne írjunk ki a memórián kívülre, és ne használjunk felszabadított területet.

Az ilyen hibák:

  • sokszor nem okoznak azonnali programösszeomlást, csak később, nehezen követhető módon jelennek meg,
  • de nagyon nehéz őket kézi ellenőrzéssel megtalálni.

Ebben segít a Valgrind, amely egy futásidőben futó elemző eszköz, és képes:

  • memóriaszivárgás észlelésére (foglalt, de el nem engedett memória),
  • nem inicializált változók használatának jelzésére,
  • felszabadított memória újrahasználatának detektálására.

Példa

Kis példa segítségével nézzük meg, hogyan is használható a valgrind memória szivárgásos problémák lokalizálására, kezelésére. A példában a dinamikusan allokált memória felszabadítása marad el, ezzel memóriaszivárgást okozva:

1
2
3
4
5
6
7
8
9
//leak.c
#include <stdlib.h>

int main() {
    int *tomb = malloc(10 * sizeof(int));

    tomb[5] = 42;
    return 0;
}

A programot le kell fordítani -g opcióval, hogy a valgrindpontos sorinformációt tudjon adni, majd futtatjuk a valgrind-et:

1
2
gcc -g -o leak leak.c
valgrind --leak-check=full ./leak

A kimenet számunkra érdekes részlete:

1
2
3
==1234== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==1234==    at 0x....: malloc (vg_replace_malloc.c:xxx)
==1234==    by 0x....: main (leak.c:4)

Ebben látjuk, hogy:

  • hány byte veszett el,
  • hol történt az allokáció,
  • melyik sorban található a hiba.

Főbb kapcsolók

Kapcsoló Jelentés
`--leak-check=full summary
--track-origins=yes Megmutatja, hol keletkezett nem inicializált érték
--show-leak-kinds=all Minden típusú szivárgást mutat (definite, indirect, possible, etc.)
--log-file=FILE Naplófájlba írja a jelentést
--log-file-exactly=FILE Nem ad PID-et a fájlnévhez (különösen több párhuzamos példányhoz hasznos)
--errors-for-leak-kinds=definite,possible Meghatározhatod, hogy mely szivárgások számítsanak hibának
--track-fds=yes Fájl leírókat is figyel (szivárgás, nyitva maradt leírók)
--time-stamp=yes Időbélyeg minden sorhoz (hasznos párhuzamos hibakeresésnél)