Valgrind | |
---|---|
Tip de | Profiler , depanator de utilizare a memoriei |
Autor | Seward, Julian [1] |
Dezvoltator | Dezvoltatorii Valgrind |
Scris in | C [3] |
Sistem de operare | Linux , Mac OS X , Android [2] |
ultima versiune | 3.19.0 ( 11 aprilie 2022 ) |
Licență | Licență publică generală GNU |
Site-ul web | valgrind.org |
Valgrind este un instrument pentru depanarea utilizării memoriei , detectarea scurgerilor de memorie și profilare . Numele valgrind este preluat din mitologia nordică , unde este numele intrării principale în Valhalla [4] .
Valgrind a fost creat inițial ca un instrument gratuit pentru depanarea utilizării memoriei pe sistemul de operare Linux x86 , dar a evoluat într-un cadru general pentru construirea de instrumente pentru analiza dinamică a utilizării memoriei, testarea siguranței firelor și profilarea. Folosit în multe proiecte bazate pe Linux [5] . Din versiunea 3.5, Valgrind funcționează și sub Mac OS X.
Autorul original al cărții Valgrind a fost Julian Seward , care a câștigat un al doilea premiu Google - O'Reilly Open Source în 2006 pentru munca sa la Valgrind [6] [7] . Numeroși alții au avut, de asemenea, contribuții semnificative, printre care Cherion Armor-Brown, Jeremy Fitzhardin, Tom Hughes, Nicholas Nethercoat, Paul Mackerras, Dirk Muller, Bart Van Assch, Joseph Weidendorfer și Robert Walsh [8] .
Valgrind este un software gratuit licențiat sub GPL .
Valgrind este în esență o mașină virtuală care utilizează metode de compilare JIT , printre care se numără și recompilarea dinamică . Adică, programul original nu este executat direct pe procesorul principal . În schimb, Valgrind traduce mai întâi programul într-o formă temporară, mai simplă, numită Reprezentare intermediară (IR), care este independentă de procesor și în formă SSA . Odată convertit , instrumentul (vezi mai jos) poate efectua orice conversie IR necesară înainte ca Valgrind să traducă IR înapoi în codul mașinii și să permită procesorului principal să-l execute. Este folosit chiar dacă traducerea dinamică poate fi folosită pentru aceasta (adică atunci când procesoarele principale și țintă aparțin arhitecturii diferite). Valgrind recompilează binarul pentru a rula pe procesoarele principale și țintă (sau simulatorul său) din aceeași arhitectură.
Din cauza acestor transformări, performanța este redusă semnificativ: de obicei, codul care rulează sub Valgrind și un instrument „gol” (nu face nimic) rulează de 5-10 ori mai lent în comparație cu executarea directă a codului; iar cu unele unelte, de până la 100 de ori mai lent [9] . Cu toate acestea, forma IR este mult mai prietenoasă cu instrumentarea decât cea originală și simplifică foarte mult instrumentarea de scriere, iar pentru majoritatea proiectelor, degradarea performanței în timpul depanării nu este o problemă semnificativă.
Pachetul Valgrind include multe unelte (unele instrumente suplimentare nu sunt incluse). Instrumentul implicit (și cel mai utilizat) este Memcheck . În aproape toate instrucțiunile, Memcheck inserează cod de instrumentare suplimentar care ține evidența legalității (toată memoria nealocată este inițial marcată ca invalidă sau „nedeterminată” până când este inițializată într-una dintre stările definite, probabil dintr-o altă memorie) și adresabilitate (dacă memoria este supusă alocării adresei specificate, adică dacă este goală) de operații de memorie, care este stocată în așa-numiții biți V și , respectiv , biți A. Pe măsură ce datele sunt mutate și manipulate, codul de instrumentare ține evidența valorilor biților A și V, astfel încât acestea să fie întotdeauna corecte la nivelul unui singur bit.
Mai mult, Memcheck înlocuiește alocarea standard de memorie C cu propria sa implementare, care, printre altele, include garduri de memorie în jurul tuturor blocurilor alocate (care au biții A marcați ca „invalidi”). Această caracteristică permite Memcheck să detecteze depășirile de buffer off-by- one , în care programul citește sau scrie memorie în afara blocului alocat (cu puțină depășire). (O altă modalitate de a rezolva această problemă este de a implementa indicatori de limită în compilator, ceea ce reduce oarecum șansa de erori nedetectate, mai ales în memoria alocată în stivă , mai degrabă decât în memoria alocată în heap , dar necesită recompilarea tuturor binarelor instrumentate.) Probleme care pot detectează Memcheck includ:
Prețul acestui lucru este pierderea performanței. Programele care rulează sub Memcheck tind să ruleze de 5-12 ori mai lent decât atunci când rulează fără Valgrind și, de asemenea, utilizează mai multă memorie (datorită alocării unei supraîncărcări semnificative de memorie). Prin urmare, codul este rareori rulat în mod constant sub Memcheck / Valgrind. Cea mai frecventă situație este atunci când fie urmăresc o anumită eroare, fie verifică dacă nu există erori ascunse de anumite tipuri în cod.
Pe lângă Memcheck, Valgrind are și alte instrumente.
Conform documentației pentru versiunea 3.4.0, Valgrind acceptă Linux pentru arhitecturi x86 , x86-64 și PowerPC . Suportul pentru Mac OS X a fost adăugat în versiunea 3.5.0 [11] . Există porturi neoficiale pentru alte platforme asemănătoare UNIX (cum ar fi FreeBSD [12] , NetBSD [13] și QNX [14] ).
În plus față de limitarea performanței, o limitare semnificativă a Memcheck este incapacitatea sa de a detecta erorile de limită atunci când se utilizează date statice sau stivuite [15] . Următorul cod va trece cu succes Memcheck fără avertismente, indiferent de erorile indicate:
int Static [ 5 ]; int func ( void ) { int Stiva [ 5 ]; Static [ 5 ] = 0 ; /* Eroare - numai Static[0] există înainte de Static[4], Static[5] este în afara matricei */ Stiva [ 5 ] = 0 ; /* Eroare - numai Stack[0] există înainte de Stack[4], Stack[5] este în afara matricei */ returnează 0 ; }Necesitatea de a detecta acest tip de eroare este deosebit de importantă din cauza anumitor erori de manipulare a stivei , ceea ce face ca software-ul să fie vulnerabil la exploitul clasic de distrugere a stivei .
Cu toate acestea, utilitarul experimental SGCheck pentru Valgrind este destul de capabil să detecteze astfel de erori.
Profileri | |
---|---|
|