Cum să detectați scurgerile de memorie în C/C++ cu Valgrind

Cum Sa Detectati Scurgerile De Memorie In C C Cu Valgrind



Valgrind este un instrument utilizat pe scară largă pentru a depana și a profila programele software care sunt scrise în principal în C, C++ și alte limbi. Ajută dezvoltatorii să detecteze scurgerile de memorie, să urmărească erorile de acces la memorie și să profileze execuția programelor lor.

Când rulați un program sub Valgrind, acesta instrumentează în mod dinamic executabilul programului, permițându-i să monitorizeze utilizarea memoriei programului și comportamentul de execuție.

Scurgeri de memorie în C++

Este important de reținut că Valgrind este conceput în primul rând pentru programele C și C++ și este posibil să nu funcționeze la fel de eficient cu alte limbi sau în toate scenariile. În plus, rularea unui program sub Valgrind poate încetini semnificativ execuția acestuia, așa că este adesea folosit în timpul dezvoltării și depanării mai degrabă decât în ​​mediile de producție.







Atunci când o memorie creată dinamic nu este eliberată corespunzător, poate cauza scurgeri de memorie în C/C++, care vor epuiza încet resursele de memorie disponibile. Acest lucru poate duce la un consum excesiv de memorie și o performanță degradată a programului.



Instalare Valgrid

Pentru a instala Valgrind pe un sistem Linux, deschideți un terminal și actualizați depozitele de pachete folosind managerul de pachete specific distribuției dvs. Linux. Următoarea comandă funcționează pentru sistemele bazate pe Ubuntu și Debian:



$ sudo actualizare apt

Utilizați managerul de pachete pentru a instala Valgrind. Din nou, comanda poate varia în funcție de distribuția dvs. Linux. Utilizați următoarea comandă pentru sistemele bazate pe Ubuntu și Debian:





$ sudo apt instalare poarta electorală

Când vi se solicită, introduceți parola de utilizator și apăsați „Enter”. Rețineți că contul dvs. de utilizator are nevoie de privilegii administrative pentru a instala software-ul. Managerul de pachete descarcă și instalează Valgrind împreună cu orice dependențe necesare. Procesul poate dura câteva minute.



După finalizarea procesului de instalare, puteți confirma instalarea cu succes a Valgrind executând următoarea comandă ca pas de verificare:

$ poarta electorală --versiune

Această comandă afișează informațiile despre versiunea Valgrind dacă este instalată cu succes.

Asta este! Valgrind ar trebui să fie acum instalat pe sistemul dvs. Linux și îl puteți utiliza pentru a analiza și depana programele dvs. C/C++ pentru scurgeri de memorie și alte probleme.

Crearea unui fișier în Ubuntu

Pentru a începe să lucrăm la program, trebuie mai întâi să creăm un fișier în Ubuntu. Pentru crearea fișierelor, folosim editorul de text nano. Deci, scriem comanda pe terminal după cum urmează:

$ nano fisier1

Aici, nano este numele editorului de text care se execută. Argumentul „fișier1” reprezintă numele fișierului pe care intenționați să îl deschideți sau să îl creați folosind editorul de text nano. Nano deschide fișierul pentru editare dacă acesta există deja; dacă nu, generează un fișier nou cu numele furnizat. Deoarece nu avem un astfel de fișier, acesta creează un nou document cu numele „fișier1”.

Odată ce rulați comanda, editorul nano se va deschide, oferindu-vă o pânză goală pentru a introduce sau edita conținutul fișierului „fișier1”. Puteți începe să tastați sau să lipiți conținutul existent în editor.

Acum că toate condițiile preliminare sunt îndeplinite, creăm câteva exemple pentru a folosi Valgrind pentru a detecta scurgerile de memorie în programele C++.

Exemplul 1:

Primul exemplu pe care îl oferim demonstrează un exemplu simplu de alocare dinamică a memoriei folosind funcția „malloc” din biblioteca din C.

#include

int principal ( )

{

char * A = malloc ( 102 ) ;

întoarcere 0 ;

}

Iată o defalcare a codului:

Mai întâi includem fișierul antet al bibliotecii standard care oferă funcții precum malloc pentru alocarea și dealocarea dinamică a memoriei.

Linia int main() declară funcția principală. Apoi, caracterul *a = malloc(102); declară o variabilă pointer „a” de tip char* (pointer la char). Folosește funcția „malloc” pentru a aloca dinamic memoria pentru o matrice de 102 elemente char (102 octeți în total). Mărimea alocării memoriei, exprimată în octeți, este trimisă ca intrare la funcția malloc și emite un pointer către blocul de memorie proaspăt creat. Pointerului char* „a” i se atribuie această valoare a indicatorului. În sfârșit, „întoarce 0;” semnifică sfârșitul funcției principale.

Pe scurt, acest cod alocă dinamic memoria pentru o matrice de 102 elemente char folosind „malloc” și atribuie adresa de memorie indicatorului „a”. Cu toate acestea, rețineți că codul nu utilizează sau manipulează memoria alocată în niciun fel și nu include dealocarea memoriei folosind free.

Când rulăm acest program prin Valgrind cu opțiunea „–leak-check=full”, acesta efectuează o verificare a scurgerilor de memorie și oferă un raport de ieșire.

Raportul de ieșire care este produs de Valgrid este dat după cum urmează:

Exemplul 2:

Pentru a începe cu această ilustrație, creăm mai întâi un fișier „test2” folosind editorul de text nano, așa cum sa explicat anterior, scriind comanda:

$ nano testul2

Acum, scriem un program C++ pentru a verifica dacă există vreo scurgere de memorie folosind Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int principal ( ) {

int * ia = malloc ( dimensiunea ( int ) * la fel de ) ;

pentru ( int i = 0 ; i < la fel de; i++ ) {

aceasta [ i ] = i;

}

srand ( timp ( NUL ) ) ;

int rn = rand ( ) % la fel de;

printf ( „este[%d]: %d \n ' , rn, it [ rn ] ) ;

întoarcere 0 ;

}

Să trecem prin program.

Codul include fișierele de antet necesare și definește variabila constantă „a_s” cu o valoare de 3000. În interiorul funcției main(), este declarat un pointer „ia” de tip int* și memoria este alocată dinamic folosind „malloc” funcţie. Expresia „sizeof(int) * a_s” determină memoria totală necesară pentru a stoca numărul „a_s” de numere întregi. Toate elementele matricei „ia” sunt inițializate de bucla „for” cu valoarea indexului corespunzătoare. De exemplu, ia[0] va fi 0, ia[1] va fi 1 și așa mai departe.

Generatorul de numere aleatoare este generat folosind funcția „srand” folosind ora curentă. Acest lucru asigură că programul produce un set unic de numere întregi aleatorii de fiecare dată când este executat. Funcția „rand” generează un număr aleator, iar „rn” este alocat cu rezultatul rand() % a_s. Operatorul de modul „%” limitează intervalul numărului aleatoriu să fie între 0 și a_s – 1 care corespunde unui index valid în cadrul matricei „ia”.

În cele din urmă, programul folosește funcția „printf” pentru a imprima valoarea la indexul „rn” selectat aleatoriu al matricei „ia”, împreună cu indexul corespunzător.

Când rulați acest program prin Valgrind, acesta generează următorul raport de ieșire:

  O captură de ecran a unui program de calculator Descriere generată automat

Concluzie

Am descoperit utilizarea instrumentului Valgrind pentru a detecta scurgerile de memorie într-un program C++. Ghidul de instalare al Valgrind este furnizat inițial. După aceea, am detaliat despre crearea unui fișier în Ubuntu folosind editorul de text nano. În cele din urmă, folosind aceste premise, am executat două exemple C++ pentru a verifica scurgerile de memorie din ele. Raportul care este generat de Valgrind este, de asemenea, atașat, care arată scurgerile de memorie din fișierul furnizat.