Valgrind | |
---|---|
Typ | Profiler , ladicí nástroj pro využití paměti |
Autor | Seward, Julian [1] |
Vývojář | Vývojáři Valgrind |
Zapsáno v | C [3] |
Operační systém | Linux , Mac OS X , Android [2] |
Nejnovější verze | 3.19.0 ( 11. dubna 2022 ) |
Licence | GNU General Public License |
webová stránka | valgrind.org |
Valgrind je nástroj pro ladění využití paměti , zjišťování úniků paměti a profilování . Jméno valgrind je převzato ze severské mytologie , kde je to název hlavního vchodu do Valhally [4] .
Valgrind byl původně vytvořen jako bezplatný nástroj pro ladění využití paměti v operačním systému x86 Linux , ale vyvinul se v obecný rámec pro vytváření nástrojů pro dynamickou analýzu využití paměti, testování bezpečnosti vláken a profilování. Používá se v mnoha projektech založených na Linuxu [5] . Od verze 3.5 Valgrind funguje také pod Mac OS X.
Původním autorem Valgrind byl Julian Seward , který získal v roce 2006 druhou cenu Google - O'Reilly Open Source Award za svou práci na Valgrind [6] [7] . Významně přispěla také řada dalších, včetně Cherion Armor-Brown, Jeremy Fitzhardin, Tom Hughes, Nicholas Nethercoat, Paul Mackerras, Dirk Muller, Bart Van Assch, Joseph Weidendorfer a Robert Walsh [8] .
Valgrind je svobodný software licencovaný pod GPL .
Valgrind je v podstatě virtuální stroj využívající metody kompilace JIT , mezi které patří dynamická rekompilace . To znamená, že původní program není spuštěn přímo na hlavním procesoru . Místo toho Valgrind nejprve převede program do dočasné, jednodušší formy zvané Intermediate Representation (IR), která je sama o sobě nezávislá na procesoru a ve formě SSA . Po převedení může nástroj (viz níže) provést jakoukoli nezbytnou IR konverzi, než Valgrind převede IR zpět do strojového kódu a umožní hlavnímu procesoru, aby jej provedl. Používá se, i když k tomu může být použit dynamický překlad (to znamená, když hlavní a cílový procesor patří do různých architektur). Valgrind překompiluje binární soubor , aby běžel na hlavním a cílovém (nebo jeho simulátoru) procesorech stejné architektury.
Kvůli těmto transformacím je výrazně snížen výkon: kód běžící pod Valgrindem a „prázdným“ (nic nedělajícím) nástrojem obvykle běží 5-10krát pomaleji ve srovnání s přímým spouštěním kódu; a u některých nástrojů až 100krát pomalejší [9] . IR forma je však mnohem přívětivější k instrumentaci než originál a značně zjednodušuje psaní instrumentace a pro většinu projektů nepředstavuje degradace výkonu během ladění významný problém.
Balíček Valgrind obsahuje mnoho nástrojů (některé další nástroje nejsou součástí dodávky). Výchozí (a nejpoužívanější) nástroj je Memcheck . Téměř do všech instrukcí vkládá Memcheck další kód přístrojového vybavení , který sleduje legalitu (všechna nepřidělená paměť je zpočátku označena jako neplatná nebo „neurčitá“, dokud není inicializována do jednoho z definovaných stavů, pravděpodobně z jiné paměti) a adresovatelnost (zda paměť podléhá zadané adresové alokaci, tedy zda je prázdná) paměťových operací, která je uložena v tzv. V- bitech, respektive A-bitech . Jak se data přesouvají a manipuluje s nimi, přístrojový kód sleduje hodnoty A- a V-bitů, takže jsou vždy správné na úrovni jednoho bitu.
Memcheck navíc nahrazuje standardní alokaci paměti C vlastní implementací, která mimo jiné zahrnuje strážce paměti kolem všech alokovaných bloků (které mají A-bity označené jako „neplatné“). Tato funkce umožňuje Memcheck detekovat přetečení vyrovnávací paměti po jednom , ve kterém program čte nebo zapisuje paměť mimo přidělený blok (s malým přetečením). (Dalším způsobem, jak tento problém vyřešit, je implementace hraničních ukazatelů v kompilátoru, což poněkud snižuje pravděpodobnost nezjištěných chyb, zejména v paměti alokované zásobníku spíše než paměti alokované hromadě , ale vyžaduje překompilování všech instrumentovaných binárních souborů.) Problémy, které mohou zjistit Memcheck zahrnuje:
Cenou za to je ztráta výkonu. Programy běžící pod Memcheck mají tendenci běžet 5-12krát pomaleji než když běží bez Valgrind, a také využívají více paměti (kvůli alokaci značné režie paměti). Proto je kód zřídka neustále spuštěn pod Memcheck / Valgrind. Nejběžnější je situace, kdy buď vystopují nějakou konkrétní chybu, nebo zkontrolují, zda v kódu nejsou skryté chyby určitého typu.
Kromě Memcheck má Valgrind i další nástroje.
Podle dokumentace k verzi 3.4.0 podporuje Valgrind Linux pro architektury x86 , x86-64 a PowerPC . Podpora pro Mac OS X byla přidána ve verzi 3.5.0 [11] . Existují neoficiální porty na jiné platformy podobné UNIXu (jako FreeBSD [12] , NetBSD [13] a QNX [14] ).
Kromě omezení výkonu je významným omezením Memcheck jeho neschopnost detekovat hraniční chyby při použití statických nebo skládaných dat [15] . Následující kód úspěšně projde Memcheck bez varování, bez ohledu na uvedené chyby:
int Statické [ 5 ]; int func ( void ) { int Stack [ 5 ]; Statické [ 5 ] = 0 ; /* Chyba - před Static[4] existuje pouze Static[0], Static[5] je mimo pole */ Zásobník [ 5 ] = 0 ; /* Chyba - před Stack[4] existuje pouze Stack[0], Stack[5] je mimo pole */ návrat 0 ; }Potřeba detekovat tento typ chyby je zvláště důležitá kvůli určitým chybám při manipulaci se zásobníkem , které činí software zranitelným vůči klasickému zneužití zásobníku .
Experimentální nástroj SGCheck pro Valgrind je však schopen takové chyby odhalit.
Profilovači | |
---|---|
|