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 |
|
A programot le kell fordítani -g
opcióval, hogy a valgrind
pontos sorinformációt tudjon adni, majd futtatjuk a valgrind
-et:
1 2 |
|
A kimenet számunkra érdekes részlete:
1 2 3 |
|
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) |