Sådan opdager du hukommelseslækager i C/C++ med Valgrind

Sadan Opdager Du Hukommelseslaekager I C C Med Valgrind



Valgrind er et meget brugt værktøj til at fejlsøge og profilere de softwareprogrammer, der primært er skrevet på C, C++ og andre sprog. Det hjælper udviklerne med at opdage hukommelseslækager, spore hukommelsesadgangsfejlene og profilere udførelsen af ​​deres programmer.

Når du kører et program under Valgrind, instrumenterer det dynamisk programmets eksekverbare, så det kan overvåge programmets hukommelsesbrug og eksekveringsadfærd.

Hukommelseslækager i C++

Det er vigtigt at bemærke, at Valgrind primært er designet til C- og C++-programmer og muligvis ikke fungerer så effektivt med andre sprog eller i alle scenarier. Derudover kan det at køre et program under Valgrind betydeligt bremse dets eksekvering, så det bruges ofte under udvikling og fejlfinding i stedet for i produktionsmiljøer.







Når en dynamisk oprettet hukommelse ikke frigives korrekt, kan det forårsage hukommelseslækager i C/C++, som langsomt vil dræne de tilgængelige hukommelsesressourcer. Dette kan resultere i for stort hukommelsesforbrug og forringet ydeevne af programmet.



Valgrid Installation

For at installere Valgrind på et Linux-system skal du åbne en terminal og opdatere dine pakkedepoter ved hjælp af den pakkehåndtering, der er specifik for din Linux-distribution. Følgende kommando virker til Ubuntu og Debian-baserede systemer:



$ sudo passende opdatering

Brug pakkehåndteringen til at installere Valgrind. Igen kan kommandoen variere afhængigt af din Linux-distribution. Brug følgende kommando til Ubuntu og Debian-baserede systemer:





$ sudo passende installere valgrind

Når du bliver bedt om det, skal du indtaste din brugeradgangskode og trykke på 'Enter'. Bemærk, at din brugerkonto skal have administrative rettigheder for at installere softwaren. Pakkehåndteringen downloader og installerer Valgrind sammen med eventuelle nødvendige afhængigheder. Processen kan tage et par minutter.



Efter installationsprocessen er afsluttet, kan du bekræfte den vellykkede installation af Valgrind ved at udføre følgende kommando som et verifikationstrin:

$ valgrind --version

Denne kommando viser versionsoplysningerne for Valgrind, hvis den er installeret korrekt.

Det er det! Valgrind skulle nu være installeret på dit Linux-system, og du kan bruge det til at analysere og fejlsøge dine C/C++-programmer for hukommelseslækager og andre problemer.

Oprettelse af en fil i Ubuntu

For at begynde at arbejde på programmet skal vi først oprette en fil i Ubuntu. Til filoprettelse bruger vi nano-teksteditoren. Så vi skriver kommandoen på terminalen som følger:

$ nano fil 1

Her er nano navnet på den teksteditor, der udføres. Argumentet 'fil1' repræsenterer navnet på den fil, du har til hensigt at åbne eller oprette ved hjælp af nano-teksteditoren. Nano åbner filen til redigering, hvis den allerede eksisterer; hvis ikke, genererer den en ny fil med det angivne navn. Da vi ikke har sådan en fil, opretter den et nyt dokument med navnet 'fil1'.

Når du har kørt kommandoen, åbnes nano-editoren og giver dig et tomt lærred til at indtaste eller redigere indholdet af filen 'file1'. Du kan begynde at skrive eller indsætte det eksisterende indhold i editoren.

Nu hvor alle forudsætninger er opfyldt, laver vi nogle eksempler på at bruge Valgrind til at opdage hukommelseslækager i C++-programmer.

Eksempel 1:

Det første eksempel, som vi giver, viser et simpelt eksempel på dynamisk hukommelsesallokering ved hjælp af 'malloc'-funktionen fra -biblioteket i C.

#include

int vigtigste ( )

{

char * -en = malloc ( 102 ) ;

Vend tilbage 0 ;

}

Her er en opdeling af koden:

Vi inkluderer først standardbibliotekets header-fil , som giver funktioner som malloc til dynamisk hukommelsesallokering og deallokering.

Linjen int main() erklærer hovedfunktionen. Derefter er char *a = malloc(102); erklærer en pointervariabel 'a' af typen char* (pointer to char). Den bruger 'malloc'-funktionen til dynamisk at allokere hukommelsen til et array af 102 tegnelementer (102 bytes i alt). Hukommelsesallokeringsstørrelsen, udtrykt i bytes, sendes som input til malloc-funktionen, og den udsender en pointer til den nyoprettede hukommelsesblok. Tegn*-markøren 'a' er tildelt denne pointerværdi. Til sidst, 'retur 0;' betegner slutningen af ​​hovedfunktionen.

Kort sagt tildeler denne kode dynamisk hukommelsen til et array af 102 tegnelementer ved hjælp af 'malloc' og tildeler hukommelsesadressen til markøren 'a'. Bemærk dog, at koden ikke bruger eller manipulerer den tildelte hukommelse på nogen måde og ikke inkluderer deallokering af hukommelsen ved hjælp af gratis.

Når vi kører dette program gennem Valgrind med '–leak-check=full', udfører det en hukommelseslækagekontrol og giver en outputrapport.

Outputrapporten, der er produceret af Valgrid, er givet som følger:

Eksempel 2:

Til at begynde med denne illustration opretter vi først en 'test2' fil ved hjælp af nano teksteditoren som forklaret tidligere ved at skrive kommandoen:

$ nano test 2

Nu skriver vi et C++-program for at kontrollere, om der er nogen hukommelseslækage ved hjælp af Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int main ( ) {

int * ia = malloc ( størrelse på ( int ) * som ) ;

til ( int i = 0 ; jeg < som; i++ ) {

det [ jeg ] = i;

}

srand ( tid ( NUL ) ) ;

int rn = rand ( ) % som;

printf ( 'det[%d]: %d \n ' , rn, det [ rn ] ) ;

Vend tilbage 0 ;

}

Lad os komme igennem programmet.

Koden inkluderer de nødvendige header-filer og definerer konstantvariablen 'a_s' med en værdi på 3000. Inde i main()-funktionen erklæres en pointer 'ia' af typen int*, og hukommelsen allokeres dynamisk ved hjælp af 'malloc' fungere. Udtrykket 'sizeof(int) * a_s' bestemmer den samlede nødvendige hukommelse til at gemme 'a_s' antallet af heltal. Alle elementerne i 'ia'-arrayet initialiseres af 'for'-løkken med dens tilsvarende indeksværdi. For eksempel vil ia[0] være 0, ia[1] vil være 1, og så videre.

Tilfældig talgeneratoren seedes ved hjælp af 'srand'-funktionen ved hjælp af det aktuelle tidspunkt. Dette sikrer, at programmet producerer et unikt sæt af tilfældige heltal, hver gang det udføres. Funktionen 'rand' genererer et tilfældigt tal, og 'rn' tildeles resultatet af rand() % a_s. Modulusoperatoren '%' begrænser intervallet for det tilfældige tal til at være mellem 0 og a_s – 1, hvilket svarer til et gyldigt indeks inden for 'ia'-arrayet.

Endelig bruger programmet 'printf'-funktionen til at udskrive værdien ved det tilfældigt valgte indeks 'rn' af 'ia'-arrayet sammen med det tilsvarende indeks.

Når du kører dette program gennem Valgrind, genererer det følgende outputrapport:

  Et skærmbillede af et computerprogram, der genereres automatisk

Konklusion

Vi opdagede brugen af ​​Valgrind-værktøjet til at opdage hukommelseslækager i et C++-program. Installationsvejledningen til Valgrind leveres indledningsvis. Derefter uddybede vi oprettelsen af ​​en fil i Ubuntu ved hjælp af nano-teksteditoren. Til sidst, ved at bruge disse forudsætninger, udførte vi to C++ eksempler for at kontrollere hukommelseslækagen i dem. Rapporten, der er genereret af Valgrind, er også vedhæftet, som viser hukommelseslækagen i den medfølgende fil.