Valgrind

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 29 decembrie 2020; verificările necesită 8 modificări .
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 .

Prezentare generală

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ă.

Instrumente

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.

Platforme acceptate

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] ).

Limitări ale Memcheck

Î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.

Note

  1. http://valgrind.org/info/developers.html
  2. Valgrind: Lansări curente . Consultat la 16 noiembrie 2013. Arhivat din original pe 13 noiembrie 2013.
  3. Proiectul valgrind Open Source pe Open Hub: Pagina de limbi - 2006.
  4. Întrebări frecvente Valgrind . Consultat la 10 decembrie 2009. Arhivat din original la 30 martie 2021.
  5. Lista utilizatorilor la valgrind.org . Consultat la 10 decembrie 2009. Arhivat din original la 14 aprilie 2022.
  6. Lista premiilor pe valgrind.org . Preluat la 10 decembrie 2009. Arhivat din original la 26 iunie 2021.
  7. Premiile Google-O'Reilly Open Source - Hall of Fame . Consultat la 10 decembrie 2009. Arhivat din original pe 7 septembrie 2008.
  8. Dezvoltatorii Valgrind . Consultat la 10 decembrie 2009. Arhivat din original pe 25 noiembrie 2009.
  9. http://valgrind.org/info/about.html Arhivat la 21 august 2012 la Wayback Machine „În funcție de instrumentul pe care îl utilizați, factorul de încetinire poate varia între 5 și 100”.
  10. SGCheck - http://valgrind.org/docs/manual/sg-manual.html Arhivat 25 octombrie 2014 la Wayback Machine
  11. ↑ Port Mac OS X. Consultat la 10 decembrie 2009. Arhivat din original la 31 mai 2009.
  12. Portul Valgrind FreeBSD . Consultat la 10 decembrie 2009. Arhivat din original la 25 iulie 2011.
  13. Port Valgrind NetBSD Arhivat 9 februarie 2006.
  14. Port Valgrind QNX . Preluat la 6 martie 2017. Arhivat din original la 6 martie 2017.
  15. Întrebări frecvente Valgrind . Consultat la 10 decembrie 2009. Arhivat din original la 30 martie 2021.

Link -uri

Surse suplimentare