Valgrind: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
"chyba o jedna" - google=0, vracím původní odkaz
Řádek 9: Řádek 9:
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.
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 [[Programovací jazyk C|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 [[chyba o jedna|chyb o jedna]] 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í:
Kromě toho [[Memcheck]] nahradí standardní alokátor paměti [[Programovací jazyk C|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
* použití neinicializované paměti

Verze z 10. 3. 2013, 20:40

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

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

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 haldě [zdroj?]. 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;
}

Externí odkazy