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 --versionDenne 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 1Her 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
int vigtigste ( )
{
char * -en = malloc ( 102 ) ;
Vend tilbage 0 ;
}
Her er en opdeling af koden:
Vi inkluderer først standardbibliotekets header-fil
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 2Nu 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:
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.