Valgrind
Author
Albert FloresValgrind (výslovnost ) 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.
Přehled
Valgrind je v podstatě virtuální stroj používající JIT (Just-In-Time) techniky, včetně dynamické rekompilace. Při použití Valgrindu se původní program nespouští přímo na procesoru počítače, ale je Valgrindem přeložen do dočasné, jednodušší formy tzv. +more Intermediate reprezentace (IR), která je procesorově neutrální, na základě formy SSA. 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-5krát pomaleji proti normálnímu spuštění. +more 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
Existuje více nástrojů obsažených ve Valgrindu. Výchozí (a nejčastěji používaný) je nástroj Memcheck. +more 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. +more 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. +more2. * 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.
Omezení Memchecku
Kromě významného výkonového omezení není Memcheck schopen zjistit chyby mezí při použití dat alokovaných staticky nebo na zásobníku . 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; }
Reference
Externí odkazy
http://valgrind.org - domácí stránka projektu * http://www.root.cz/serialy/valgrind/ - seriál Valgrind na root.cz