Valgrind
Valgrind (výslovnost [ˈvælɡrɪnd] IPA) je v informatice program pro unixové systémy, který pomáhá při ladění a profilování programů. Lze ho použít například při hledání úniků paměti, hledání souběhů, nebo také při snaze monitorovat a zlepšit využití cache. Valgrind je open source software šířený pod licencí GPL. Název je odvozen od jména hlavního vchodu do Valhally v severské mytologii.
Obsah |
Přehled [editovat]
Valgrind je v podstatě virtuální stroj používající JIT (Just-In-Time) techniky, včetně dynamické rekompilace. Nic z původního programu nelze spustit přímo na procesoru počítače. Místo toho Valgrind nejprve přeloží program do dočasné, jednodušší formy tzv. Intermediate reprezentace (IR), která je procesorově neutrální, na základě formy SSA.[zdroj?] Valgrind překompiluje binární kód běžící na hostitelském a cílovém (nebo simulovaném) procesoru stejné architektury.
V těchto transformacích se ztrácí značné množství výkonu. Kód běžící s Valgrindem běží 4 až 5 krát pomaleji, proti normálnímu spuštění. Uložení ve formě IR (místo strojového kódu) je však vhodnější pro měření. Usnadňuje psaní nástrojů a pro většinu projektů neznamená zpomalení při ladění velký problém.
Nástroje [editovat]
Existuje více nástrojů obsažených ve Valgrindu. Výchozí (a nejčastěji používaný) je nástroj Memcheck. Memcheck vloží navíc zvláštní kódy okolo téměř všech příkazů, které udržují informaci o platnosti (veškerá nevyužitá paměť začíná jako neplatná nebo nedefinovaná, dokud není inicializována do deterministického stavu, případně z jiných pamětí) a adresovatelnosti (zda adresy bodů v paměti jsou přiděleny, neuvolněnému paměťovému bloku), uložené do takzvaných V-bitů a A-bitů. Manipuluje se s nimi jako s daty a strojový kód udržuje A- a V-bity, takže jsou správně na úrovni jednoho bitu.
Kromě toho Memcheck nahradí standardní alokátor paměti jazyka C svou vlastní implementací, která zahrnuje také hlídání paměti kolem přidělených bloků (s A bity nastavenými na neplatné). Ta funkce umožňuje Memchecku detekci off-by-one chyb v případě, že program zapisuje mimo přidělené množství bloku. Mezi problémy, které dokáže Memcheck detekovat a varovat před nimi patří následující:
- použití neinicializované paměti
- čtení nebo zápis paměti poté, co byla uvolněna
- čtení nebo zápis z konce malloc bloků
- únik paměti
Cenou za výše uvedené možnosti je ztráta výkonu. Programy běžící pod Memcheckem obvykle běží pětkrát až dvacetkrát pomaleji než mimo Valgrind a používají mnohem více paměti.
Kromě Memchecku má Valgrind několik dalších nástrojů:
- Addrcheck – vzdálený bratranec od Memchecku, běží mnohem rychleji a nevyžaduje tolik paměti, ale zachytává méně chyb. Tento nástroj byl odstraněn od verze 3.2.0.
- Massif – profiler haldy
- Helgrind a DRD – nástroje pro ladění souběhů
- Cachegrind – profiler využití cache paměti (existuje grafické rozhraní KCachegrind)
- exp-ptrcheck – experimentální nástroj pro hledání podobných chyb jako Memcheck, ale s odlišným přístupem, která je schopen zjistit i několik dalších typů chyb
Podporované platformy [editovat]
Program pracuje v Linuxu na platformách x86, x86-64 a PowerPC. Ve verzi 3.5.0 je plánována podpora Mac OS X. Neoficiální verze byly zprovozněny i pod FreeBSD a NetBSD.
Omezení Memchecku [editovat]
Kromě významného výkonového omezení není Memcheck schopen zjistit chyby mezí při použití dat alokovaných staticky nebo na haldě [zdroj?]. Následující kód projde nástrojem Memcheck ve Valgrindu bez incidentů, i přes uvedené chyby:
int Static[5]; int func(void) { int Stack[5]; Static[5] = 0; /* chyba - existuje Static[0] až Static[4], avšak Static[5] je mimo možné meze */ Stack [5] = 0; /* chyba - existuje Stack[0] až Stack[4], avšak Stack[5] je mimo možné meze */ return 0; }
Externí odkazy [editovat]
- (anglicky) http://valgrind.org – domácí stránka projektu
- http://www.root.cz/serialy/valgrind/ – seriál Valgrind na root.cz