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.
Vývojář | Julian Seward |
---|---|
Aktuální verze | 3.18.1 (15. října 2021) |
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 |
Některá data mohou pocházet z datové položky. |
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. 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–5krá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
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
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
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
Externí odkazy
- (anglicky) http://valgrind.org – domácí stránka projektu
- http://www.root.cz/serialy/valgrind/ – seriál Valgrind na root.cz