Valgrind | |
---|---|
Típusú | Profiler , memóriahasználat hibakereső |
Szerző | Seward, Julian [1] |
Fejlesztő | Valgrind fejlesztők |
Beírva | C [3] |
Operációs rendszer | Linux , Mac OS X , Android [2] |
legújabb verzió | 3.19.0 ( 2022. április 11. ) |
Engedély | GNU általános nyilvános licenc |
Weboldal | valgrind.org |
A Valgrind egy eszköz a memóriahasználat hibakeresésére , a memóriaszivárgások észlelésére és a profilalkotásra . A valgrind név a skandináv mitológiából származik , ahol Valhalla főbejáratának neve [4] .
A Valgrind eredetileg ingyenes eszközként jött létre az x86 Linux operációs rendszer memóriahasználatának hibakeresésére , de általános keretrendszerré fejlődött a dinamikus memóriahasználat elemzéséhez, a szálbiztonsági teszteléshez és a profilalkotáshoz. Számos Linux alapú projektben használják [5] . A 3.5-ös verzió óta a Valgrind Mac OS X alatt is működik.
A Valgrind eredeti szerzője Julian Seward volt , aki 2006-ban elnyerte a Google második O'Reilly Open Source Award -díját a Valgrind című munkájáért [6] [7] . Sokan mások is jelentős mértékben hozzájárultak, köztük Cherion Armor-Brown, Jeremy Fitzhardin, Tom Hughes, Nicholas Nethercoat, Paul Mackerras, Dirk Muller, Bart Van Assch, Joseph Weidendorfer és Robert Walsh [8] .
A Valgrind egy ingyenes szoftver , amelynek licence a GPL .
A Valgrind lényegében egy virtuális gép , amely JIT fordítási módszereket használ , köztük a dinamikus újrafordítást . Vagyis az eredeti program nem közvetlenül a főprocesszoron fut le . Ehelyett a Valgrind először lefordítja a programot egy ideiglenes, egyszerűbb formára, amelyet Intermediate Representation-nak (IR) neveznek, amely maga is processzorfüggetlen és SSA formában van. A konvertálás után az eszköz (lásd alább) bármilyen szükséges infravörös konverziót végrehajthat, mielőtt a Valgrind visszafordítja az IR-t gépi kódra , és lehetővé teszi a fő processzor számára, hogy végrehajtsa. Akkor is használatos, ha ehhez dinamikus fordítás is használható (vagyis amikor a fő- és a célprocesszor különböző architektúrákhoz tartozik). A Valgrind újrafordítja a bináris fájlt , hogy az azonos architektúrájú fő és cél (vagy szimulátor) processzorokon fusson.
Ezen átalakítások miatt a teljesítmény jelentősen csökken: általában a Valgrind alatt futó kód és egy „üres” (semmit csináló) eszköz 5-10-szer lassabban fut, mint a kód közvetlen végrehajtása; egyes eszközökkel pedig akár 100-szor lassabb [9] . Az IR-forma azonban sokkal műszerbarátabb , mint az eredeti, és nagyban leegyszerűsíti az írásműszerezést, és a legtöbb projektnél nem jelent jelentős problémát a teljesítményromlás a hibakeresés során.
A Valgrind csomag számos eszközt tartalmaz (néhány kiegészítő eszközt nem tartalmaz). Az alapértelmezett (és leggyakrabban használt) eszköz a Memcheck . Szinte az összes utasítás köré a Memcheck további műszerkódot szúr be , amely nyomon követi a legalitást (az összes le nem osztott memória kezdetben érvénytelennek vagy "határozatlannak" van jelölve, amíg inicializálódik a meghatározott állapotok egyikébe, valószínűleg egy másik memóriából) és a címezhetőséget (függetlenül attól, hogy a memória a memóriaműveletek meghatározott címkiosztásának hatálya alá tartozik, vagyis üres-e), amely az úgynevezett V-bitekben , illetve A-bitekben kerül tárolásra . Az adatok mozgatásakor és manipulálásakor a műszerkód nyomon követi az A- és V-bitek értékeit, hogy azok egybites szinten mindig helyesek legyenek.
Sőt, a Memcheck a szabványos C memóriafoglalást saját megvalósítására cseréli, amely többek között memóriavédőket tartalmaz az összes lefoglalt blokk körül (amelyek A bitjei "érvénytelennek" vannak jelölve). Ez a funkció lehetővé teszi a Memcheck számára, hogy észlelje a puffertúlcsordulásokat , amelyekben a program a lefoglalt blokkon kívül olvas vagy ír memóriát (kis túlcsordulás mellett). (A probléma megoldásának másik módja a határmutatók implementálása a fordítóba, ami némileg csökkenti az észleletlen hibák esélyét, különösen a verem által lefoglalt memóriában, nem pedig a kupac lefoglalt memóriában, de ehhez az összes műszeres bináris újrafordítása szükséges.) Memcheck észlelése a következőket tartalmazza:
Ennek ára a teljesítményvesztés. A Memcheck alatt futó programok általában 5-12-szer lassabban futnak, mint a Valgrind nélkül, és több memóriát is használnak (a jelentős többletmemória lefoglalása miatt). Ezért a kód ritkán fut folyamatosan a Memcheck / Valgrind alatt. A leggyakoribb helyzet az, amikor vagy valamilyen konkrét hibát találnak ki, vagy ellenőrzik, hogy nincsenek-e bizonyos típusú rejtett hibák a kódban.
A Memcheck mellett a Valgrind más eszközökkel is rendelkezik.
A 3.4.0-s verzió dokumentációja szerint a Valgrind támogatja a Linuxot x86 , x86-64 és PowerPC architektúrákhoz . A Mac OS X támogatása a 3.5.0-s verzióban jelent meg [11] . Vannak nem hivatalos portok más UNIX-szerű platformokhoz (például FreeBSD [12] , NetBSD [13] és QNX [14] ).
A teljesítménykorlátozás mellett a Memcheck jelentős korlátja, hogy nem képes észlelni a határhibákat statikus vagy halmozott adatok használatakor [15] . A következő kód sikeresen átmegy a Memchecken , minden figyelmeztetés nélkül, függetlenül a jelzett hibáktól:
int Statikus [ 5 ]; int funkció ( érvénytelen ) { int Stack [ 5 ]; Statikus [ 5 ] = 0 ; /* Hiba – csak a Static[0] létezik a Static[4] előtt, a Static[5] a tömbön kívül van */ Verem [ 5 ] = 0 ; /* Hiba - csak a Stack[0] létezik a Verem[4] előtt, a Verem[5] a tömbön kívül van */ return 0 ; }Az ilyen típusú hibák észlelésének szükségessége különösen fontos bizonyos verem-manipulációs hibák miatt, amelyek sebezhetővé teszik a szoftvert a klasszikus veremletöréssel szemben .
A Valgrind kísérleti SGCheck segédprogramja azonban eléggé képes az ilyen hibák észlelésére.
Profilkészítők | |
---|---|
|