Valgrind

Z Wikipedie, otevřené encyklopedie
Skočit na navigaci Skočit na vyhledávání
Valgrind
Vývojář Julian Seward
Aktuální verze 3.15.0 (14. dubna 2019)
Operační systém GNU/Linux
macOS
Solaris
Android
Vyvíjeno v C
Typ softwaru programátorský nástroj, memory debugger a svobodný software
Licence GNU General Public License
Web www.valgrind.org
Některá data mohou pocházet z datové položky.

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. 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. 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]