Valgrind - Valgrind

Valgrind
Valgrind logo.png
Původní autoři Julian Seward
Vývojáři Vývojový tým Valgrind
Stabilní uvolnění 3.16.1 (22. června 2020 ; před 6 měsíci ) [±]  ( 2020-06-22 )
Úložiště Upravte to na Wikidata
Operační systém Linux
macOS
Solaris
Android
Typ Profiler , debugger paměti
Licence GNU General Public License
webová stránka www .valgrind .org

Valgrind ( / V Æ l ɡ r ɪ n d / ) je programovací nástroj pro paměti ladění , únik paměti detekce a profilování .

Valgrind byl původně navržen jako bezplatný nástroj pro ladění paměti pro Linux na x86 , ale od té doby se vyvinul v obecný rámec pro vytváření dynamických analytických nástrojů, jako jsou dáma a profilery.

Jméno Valgrind je odkazem na hlavní vchod Valhally ze severské mytologie. Během vývoje (před vydáním) byl projekt pojmenován Heimdall ; název by však byl v konfliktu s balíčkem zabezpečení.

Přehled

Valgrind je v podstatě virtuální stroj využívající kompilační techniky just-in-time (JIT), včetně dynamické rekompilace . Nic z původního programu se nikdy nespustí přímo na hostitelském procesoru . Místo toho Valgrind nejprve převede program do dočasné, jednodušší formy zvané Intermediate Representation (IR), což je procesorově neutrální forma založená na SSA . Po převodu může nástroj (viz níže) provádět jakékoli transformace, které by na IR chtěl, než Valgrind převede IR zpět do strojového kódu a nechá ho spustit hostitelským procesorem. Valgrind překompiluje binární kód tak, aby běžel na hostitelských a cílových (nebo simulovaných) CPU stejné architektury. Zahrnuje také útržek GDB, který umožňuje ladění cílového programu při jeho spuštění ve Valgrindu, s „příkazy monitoru“, které umožňují dotazovat se na nástroj Valgrind na různé informace.

Při těchto transformacích se ztratí značné množství výkonu (a obvykle kód, který nástroj vloží); obvykle běží kód s Valgrindem a nástroj „none“ (který nedělá nic pro IR) běží na 20% až 25% rychlosti běžného programu.

Nástroje

Memcheck

Valgrind obsahuje několik nástrojů (a několik externích). Výchozím (a nejpoužívanějším) nástrojem je Memcheck . Memcheck vloží další instrumentační kód téměř do všech instrukcí, které sledují platnost (veškerá nepřidělená paměť začíná jako neplatná nebo „nedefinovaná“, dokud není inicializována do deterministického stavu, případně z jiné paměti) a adresovatelnost (ať už adresa paměti v otázka ukazuje na alokovaný, neuvolněný paměťový blok) uložený v takzvaných V bitech, respektive A bitech . Jak se data pohybují nebo manipulují, přístrojový kód sleduje bity A a V, takže jsou vždy správné na jednobitové úrovni.

Kromě toho Memcheck nahrazuje standardní alokátor paměti C vlastní implementací, která zahrnuje také kryty paměti kolem všech alokovaných bloků (s bity A nastavenými na „neplatné“). Tato funkce umožňuje Memchecku detekovat chyby typu off-by-one, kde program čte nebo zapisuje mimo přidělený blok v malém množství. Mezi problémy, které Memcheck dokáže detekovat a varovat, patří:

  • Využití neinicializované paměti
  • Čtení / zápis paměti poté, co bylo free ‚d
  • Čtení / odpis na konci malloc bloků
  • Úniky paměti

Cena za to je ztracený výkon. Programy spuštěné pod Memcheckem běží obvykle 20–30krát pomaleji než běh mimo Valgrind a využívají více paměti (za přidělení je penalizace paměti). Proto málo vývojářů spouští svůj kód pod Memcheckem (nebo jakýmkoli jiným nástrojem Valgrind) po celou dobu. Nejčastěji používají tyto nástroje buď ke sledování určité konkrétní chyby, nebo k ověření, že v kódu nejsou žádné skryté chyby (takové, jaké dokáže zjistit Memcheck).

Další nástroje

Kromě Memchecku má Valgrind několik dalších nástrojů:

  • Žádný , spustí kód na virtuálním stroji bez provedení jakékoli analýzy a má tedy nejmenší možnou režii CPU a paměti ze všech nástrojů. Protože valgrind sám poskytuje trasování zpět od poruchy segmentace , nástroj none poskytuje toto zpětné sledování při minimální režii.
  • Addrcheck , podobný Memchecku , ale s mnohem menší režií CPU a paměti, čímž se zachytí méně typů chyb. Kontrola verzí byla od verze 3.2.0 odstraněna.
  • Massif , halda profiler . Samostatný GUI massif-visualizer vizualizuje výstup z Massif.
  • Helgrind a DRD , detekujte podmínky závodu v multithreadovém kódu
  • Cachegrind , profiler mezipaměti . Samostatné grafické uživatelské rozhraní KCacheGrind vizualizuje výstup z Cachegrind.
  • Callgrind , analyzátor callgrafu vytvořený Josefem Weidendorferem, byl do Valgrindu přidán od verze 3.2.0. KCacheGrind může vizualizovat výstup z Callgrind.
  • DHAT , dynamický nástroj pro analýzu haldy, který analyzuje, kolik paměti je přiděleno a jak dlouho, stejně jako vzorce využití paměti.
  • exp-sgcheck (pojmenovaný exp-ptrcheck před verzí 3.7), experimentální nástroj k vyhledání chyb překročení zásobníku a globálního pole, které Memcheck nemůže najít. Výsledkem některého kódu jsou falešné poplachy z tohoto nástroje.
  • exp-bbv , simulátor výkonu, který extrapoluje výkon z malé ukázkové sady.

K dispozici je také několik externě vyvinutých nástrojů. Jedním z takových nástrojů je ThreadSanitizer, další detektor rasových podmínek .

Podporované platformy

Od verze 3.4.0 podporuje Valgrind Linux na x86 , x86-64 a PowerPC . Podpora pro OS X byla přidána ve verzi 3.5.0. Ve verzi 3.6.0 byla přidána podpora pro Linux na ARMv7 (používá se například v některých smartphonech ). Podpora systému Solaris byla přidána ve verzi 3.11.0. Existují neoficiální porty pro jiné platformy podobné systému UNIX (jako FreeBSD , OpenBSD a NetBSD ). Od verze 3.7.0 byla přidána podpora platformy ARM / Android .

Od verze 3.9.0 je zde podpora pro Linux na MIPS64 malé i velké endian, na MIPS DSP ASE na MIPS32, pro s390x pokyny Desetinné s plovoucí desetinnou čárkou za POWER8 ( Power ISA 2,07 ) instrukce, pro Intel AVX2 instrukce, pro Intel transakční synchronizace rozšíření , RTM i HLE a počáteční podpora pro hardwarovou transakční paměť na POWER.

Historie a vývoj

Je pojmenován po hlavním vstupu do Valhally ve skandinávské mytologii .

Původním autorem Valgrindu je Julian Seward , který v roce 2006 získal za práci na Valgrindovi cenu Google-O'Reilly Open Source Award .

Významně přispělo i několik dalších, například Cerion Armor-Brown, Jeremy Fitzhardinge, Tom Hughes, Nicholas Nethercote, Paul Mackerras, Dirk Mueller, Bart Van Assche, Josef Weidendorfer a Robert Walsh.

Používá jej řada projektů založených na Linuxu.

Omezení Memchecku

Kromě trestu za výkon je důležitým omezením Memchecku jeho neschopnost detekovat všechny případy mezních chyb při použití statických nebo zásobníku přidělených dat. Následující kód předá nástroj Memcheck ve Valgrindu bez incidentů, přestože obsahuje chyby popsané v komentářích:

  int Static[5];
  
  int func(void)
  {
    int Stack[5];
  
    Static[5] = 0;  /* Error - Static[0] to Static[4] exist, Static[5] is out of bounds */
    Stack [5] = 0;  /* Error - Stack[0] to Stack[4] exist, Stack[5] is out of bounds */
    
    return 0;
  }

Pro řešení tohoto omezení v Memchecku byl napsán experimentální nástroj valgrind exp-sgcheck. Bude detekovat chyby přetečení pole za předpokladu, že první přístup k poli je v mezích pole. Všimněte si, že exp-sgcheck nezjistí překročení pole ve výše uvedeném kódu, protože první přístup k poli je mimo hranice, ale zjistí chybu překročení pole v následujícím kódu.

  void func(void)
  {
    int i, Stack[5];

    for (i = 0; i <= 5; i++)
        Stack [i] = 0;        /* Within bounds for i=0..4, out of bounds error when i=5 */
  }

Neschopnost detekovat všechny chyby zahrnující přístup k datům přiděleným zásobníku je obzvláště pozoruhodná, protože některé typy chyb zásobníku způsobují, že software je zranitelný vůči klasickému zneužití zásobníku .

Viz také

Poznámky

Reference

externí odkazy