Valgrind

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

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.

Přehled[editovat | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 [1]. 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[editovat | editovat zdroj]

  1. Valgrind FAQ

Externí odkazy[editovat | editovat zdroj]