Valgrind
A Valgrind debug feladatokhoz – elsősorban memória debughoz, memóriaszivárgás-érzékeléshez és teljesítményméréshez (profiling) – használatos programozói eszköz. A Valgrind név maga a skandináv mitológiából ered, ott a Valhalla főbejáratát jelöli.[3]
Valgrind | |
Fejlesztő | The Valgrind Developers |
Legfrissebb stabil kiadás | 3.23.0 (stabil verzió, 2024. április 26.)[1] |
Programozási nyelv | C |
Operációs rendszer | GNU/Linux/Mac OS X/Android[2] |
Kategória | Profiler, memoria debugger |
Licenc | GNU General Public License |
A Valgrind weboldala |
A Valgrindet eredetileg ingyenes memória debuggernek tervezték x86 alapú Linux rendszerekhez, de egy általános keretrendszerré fejlődött, amivel dinamikus elemzőeszközök készíthetőek, például profilerek. (Számos eszköz része a keretrendszernek, de felépítéséből eredően bővíthető újabb eszközökkel.) A programot számos Linux alapú projekt használja tesztelésre.[4]
A program eredeti szerzője Julian Seward, aki 2006-ban díjat nyert (Google-O'Reilly Open Source Díj, második hely) a Valgrinden végzett munkájáért.[5][6] Sokan mások is jelentősen hozzájárultak a projekthez, többek közt Cerion Armour-Brown, Jeremy Fitzhardinge, Tom Hughes, Nicholas Nethercote, Paul Mackerras, Dirk Mueller, Josef Weidendorfer és Robert Walsh.[7]
A Valgrind a szabad szoftver GNU General Public License alatt lett terjesztve.
Áttekintés
szerkesztésA Valgrind alapvetően egy virtuális gép, ami futásidejű fordítás (JIT) technikát alkalmaz. Az eredeti (vizsgálandó) program kódjából semmi sem fut közvetlenül a hoszt processzoron, ehelyett a Valgrind először átfordítja a programot egy átmeneti, egyszerűbb formára, ezt köztes reprezentációnak (Intermediate Representation) hívják, ami egy processzor-független forma. Az átfordítás után az eszköz (lásd lentebb) szabadon átalakíthatja ezt a köztes kódot, majd végül a Valgrind visszafordítja az átalakított kódot és futtatja a hoszt processzoron. Ez a kódátfordítás lelassítja a program futását, tipikusan négy-ötször lassabban fut egy Valgrinddel elemzett program az eredetihez képest.
Eszközök
szerkesztésTöbb eszköz is be van építve a Valgrind programba és számos külső eszköz is elérhető. Az alapértelmezett és leggyakrabban használt eszköz a Memcheck. A Memcheck extra utasításokat szúr be lényegében minden utasítás köré, amelyekkel követi a memóriakezelés érvényességét. (Használat előtt inicializálva van-e a memóriaterület, és így tovább.)
A Memcheck lecseréli a szabványos C memória lefoglalót a saját implementációjával, amely minden lefoglalt memória körül „memóriaőröket” tartalmaz. Ez képessé teszi arra, hogy érzékelje, ha a program olvas vagy ír kicsivel a lefoglalt memórián kívül.
A Memcheck által felismert hibák:
- Inicializálatlan memória használata
- Írás/olvasás korábban már felszabadított memóriaterületről
- Írás/olvasás a lefoglalt memórián (kicsivel) kívülről
- Memóriaszivárgás
Az ára mindezeknek a teljesítmény. Egy Memcheckkel futtatott program tipikusan 5-20x lassabban fut, mintha a Valgrind nélkül futna, és több memóriát is használ. Mindezek miatt kevés fejlesztő futtatja a kódját egyfolytában Memcheck alatt, leggyakrabban csak hibakeresés során használják egy-egy adott hiba felderítésére. Ezen felül használják programok érvényesítésére: megnézik, hogy a program nem tartalmaz-e olyan rejtett hibát, amelyet a Memcheck képes érzékelni.
A Memcheck eszközön felül a Valgrind még számos másik eszközt is tartalmaz:
- Massif, egy heap profiler.
- Helgrind, képes érzékelni versenyhelyzeteket többszálú kódban
- Cachegrind, egy cache profiler és a grafikus felülete a GUI KCacheGrind
Még számos külső fejlesztésű eszköz elérhető a Valgrindhez.
Támogatott platformok
szerkesztésA Valgrind 3.3.0 verziója támogatja a Linuxot x86, x86-64 és PowerPC rendszereken. Léteznek nem hivatalos portok más UNIX-szerű rendszerekre (például FreeBSD,[8] NetBSD[9] és Mac OS X[10]). Jelenleg nincs port Microsoft Windows rendszerekre és nincs is a rövid távú tervek közt ilyen, de van egy kísérleti verzió, amely képes a Wine programon keresztül Windows programokat debuggolni Linux rendszereken futtatva.
Korlátok
szerkesztésA teljesítménycsökkenés mellett komoly korlátja a Valgrindnek, hogy nem képes detektálni a statikusan foglalt adatok esetében a tömbhatár-átlépést. A következő kód hiba nélkül át fog jutni a Memcheck eszközön a Valgrindben, a nyilvánvaló hibák ellenére.
int Static[5];
int func(void)
{
int Stack[5];
Static[5] = 0; /* Hiba - Static[0]-tól Static[4]-ig létezik, de Static[5] már kívül van*/
Stack [5] = 0; /* Hiba - Stack[0]-tól Stack[4]-ig létezik, de Stack[5] már kívül van */
return 0;
}
A fontosságát az adja ennek a hiba típusnak, hogy ezek a hibák sebezhetővé teszik a programot puffer túlcsordulásos támadással szemben.
Hivatkozások
szerkesztés- ↑ Valgrind-3.23.0 is available
- ↑ Valgrind release notes
- ↑ Valgrind FAQ
- ↑ valgrind.org's list of users
- ↑ valgrind.org's list of awards
- ↑ Google-O'Reilly Open Source Awards - Hall of Fame
- ↑ A Valgrind fejlesztői
- ↑ Valgrind FreeBSD port. [2008. október 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2009. március 9.)
- ↑ Valgrind NetBSD port. [2006. február 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2009. március 9.)
- ↑ Valgrind Mac OS X port
Külső hivatkozások
szerkesztés- Nicholas Nethercote and Julian Seward: Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation. Proceedings of ACM SIGPLAN 2007 Conference on Programming Language Design and Implementation (PLDI 2007). ACM
- Julian Seward and Nicholas Nethercote: Using Valgrind to detect undefined value errors with bit-precision. Proceedings of the USENIX Annual Technical Conference 2005. USENIX Association
- J. Seward, N. Nethercote, J. Weidendorfer and the Valgrind Development Team. Valgrind 3.3 — Advanced Debugging and Profiling for GNU/Linux applications [archivált változat]. Network Theory Ltd, 164 pages. o. (2008. március 1.). ISBN 0954612051. Hozzáférés ideje: 2009. március 9. [archiválás ideje: 2013. augusztus 18.]