Kako zaznati puščanje pomnilnika v C/C++ z Valgrindom

Kako Zaznati Puscanje Pomnilnika V C C Z Valgrindom



Valgrind je široko uporabljeno orodje za odpravljanje napak in profiliranje programov, ki so v glavnem napisani v C, C++ in drugih jezikih. Razvijalcem pomaga odkriti puščanje pomnilnika, izslediti napake pri dostopu do pomnilnika in profilirati izvajanje njihovih programov.

Ko zaženete program pod Valgrindom, ta dinamično instrumentira izvršljivo datoteko programa, kar mu omogoča spremljanje uporabe pomnilnika programa in vedenja pri izvajanju.

Puščanje pomnilnika v C++

Pomembno je vedeti, da je Valgrind zasnovan predvsem za programe C in C++ in morda ne bo deloval tako učinkovito z drugimi jeziki ali v vseh scenarijih. Poleg tega lahko zagon programa pod Valgrindom znatno upočasni njegovo izvajanje, zato se pogosto uporablja med razvojem in odpravljanjem napak in ne v produkcijskih okoljih.







Ko dinamično ustvarjen pomnilnik ni pravilno sproščen, lahko povzroči uhajanje pomnilnika v C/C++, kar bo počasi izpraznilo razpoložljive pomnilniške vire. To lahko povzroči prekomerno porabo pomnilnika in poslabšano delovanje programa.



Namestitev Valgrid

Če želite Valgrind namestiti v sistem Linux, odprite terminal in posodobite svoje repozitorije paketov z upraviteljem paketov, ki je specifičen za vašo distribucijo Linuxa. Naslednji ukaz deluje za sisteme Ubuntu in Debian:



$ sudo primerna posodobitev

Za namestitev Valgrinda uporabite upravitelja paketov. Še enkrat, ukaz se lahko razlikuje glede na vašo distribucijo Linuxa. Uporabite naslednji ukaz za sisteme Ubuntu in Debian:





$ sudo apt namestite volilna vrata

Ko ste pozvani, vnesite uporabniško geslo in pritisnite »Enter«. Upoštevajte, da vaš uporabniški račun potrebuje skrbniške pravice za namestitev programske opreme. Upravitelj paketov prenese in namesti Valgrind skupaj z vsemi potrebnimi odvisnostmi. Postopek lahko traja nekaj minut.



Ko je postopek namestitve končan, lahko potrdite uspešno namestitev Valgrinda tako, da kot korak preverjanja izvedete naslednji ukaz:

$ volilna vrata --različica

Ta ukaz prikaže informacije o različici Valgrinda, če je uspešno nameščen.

To je to! Valgrind bi moral biti zdaj nameščen v vašem sistemu Linux in ga lahko uporabite za analizo in odpravljanje napak v programih C/C++ glede uhajanja pomnilnika in drugih težav.

Ustvarjanje datoteke v Ubuntuju

Za začetek dela na programu moramo najprej ustvariti datoteko v Ubuntuju. Za ustvarjanje datotek uporabljamo nano urejevalnik besedil. Torej, napišemo ukaz na terminalu takole:

$ nano datoteka1

Tu je nano ime urejevalnika besedila, ki se izvaja. Argument »file1« predstavlja ime datoteke, ki jo nameravate odpreti ali ustvariti z nano urejevalnikom besedil. Nano odpre datoteko za urejanje, če že obstaja; če ne, ustvari novo datoteko s podanim imenom. Ker nimamo take datoteke, ustvari nov dokument z imenom 'file1'.

Ko zaženete ukaz, se odpre urejevalnik nano, ki vam nudi prazno platno za vnos ali urejanje vsebine datoteke »file1«. Lahko začnete vnašati ali prilepiti obstoječo vsebino v urejevalnik.

Zdaj, ko so izpolnjeni vsi predpogoji, ustvarimo nekaj primerov za uporabo Valgrinda za odkrivanje uhajanja pomnilnika v programih C++.

Primer 1:

Prvi primer, ki ga ponujamo, prikazuje preprost primer dinamičnega dodeljevanja pomnilnika z uporabo funkcije »malloc« iz knjižnice v C.

#include

int glavni ( )

{

char * a = malloc ( 102 ) ;

vrnitev 0 ;

}

Tukaj je razčlenitev kode:

Najprej vključimo standardno datoteko glave knjižnice , ki nudi funkcije, kot je malloc, za dinamično dodeljevanje in sprostitev pomnilnika.

Vrstica int main() deklarira glavno funkcijo. Nato char *a = malloc(102); deklarira spremenljivko kazalca 'a' tipa char* (kazalec na char). Uporablja funkcijo »malloc« za dinamično dodelitev pomnilnika za niz 102 elementov char (skupaj 102 bajtov). Velikost dodelitve pomnilnika, izražena v bajtih, je poslana kot vhod v funkcijo malloc in izpiše kazalec na sveže ustvarjen pomnilniški blok. Kazalcu char* »a« je dodeljena ta vrednost kazalca. Nazadnje, 'vrni 0;' pomeni konec glavne funkcije.

Skratka, ta koda dinamično dodeli pomnilnik za niz 102 elementov char z uporabo 'malloc' in dodeli naslov pomnilnika kazalcu 'a'. Vendar upoštevajte, da koda na noben način ne uporablja ali manipulira z dodeljenim pomnilnikom in ne vključuje sprostitve pomnilnika z uporabo free.

Ko zaženemo ta program prek Valgrinda z možnostjo »–leak-check=full«, izvede preverjanje uhajanja pomnilnika in zagotovi izhodno poročilo.

Izhodno poročilo, ki ga pripravi Valgrid, je podano takole:

Primer 2:

Za začetek te ilustracije najprej ustvarimo datoteko »test2« z nano urejevalnikom besedila, kot je razloženo prej, tako da napišemo ukaz:

$ nano test2

Zdaj napišemo program C++, da preverimo, ali je prišlo do uhajanja pomnilnika z uporabo Valgrinda:

#include

#include

#include

const int a_s = 3000 ;

int main ( ) {

int * ia = malloc ( sizeof ( int ) * a_s ) ;

za ( int i = 0 ; jaz < a_s; i++ ) {

njega [ jaz ] = i;

}

srand ( čas ( NIČ ) ) ;

int rn = rand ( ) % a_s;

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

vrnitev 0 ;

}

Pojdimo skozi program.

Koda vključuje potrebne datoteke glave in definira konstantno spremenljivko »a_s« z vrednostjo 3000. Znotraj funkcije main() je deklariran kazalec »ia« tipa int* in pomnilnik se dinamično dodeli z uporabo »malloc« funkcijo. Izraz »sizeof(int) * a_s« določa skupni potreben pomnilnik za shranjevanje števila celih števil »a_s«. Vse elemente matrike »ia« inicializira zanka »for« z ustrezno vrednostjo indeksa. Na primer, ia[0] bo 0, ia[1] bo 1 in tako naprej.

Generator naključnih števil se zasede s funkcijo »srand« z uporabo trenutnega časa. To zagotavlja, da program vsakič, ko se izvede, ustvari edinstven nabor naključnih celih števil. Funkcija »rand« ustvari naključno število, »rn« pa je dodeljen z rezultatom rand() % a_s. Operator modula »%« omejuje obseg naključnega števila med 0 in a_s – 1, kar ustreza veljavnemu indeksu v matriki »ia«.

Končno program uporabi funkcijo »printf« za tiskanje vrednosti pri naključno izbranem indeksu »rn« matrike »ia« skupaj z ustreznim indeksom.

Ko zaženete ta program prek Valgrinda, ustvari naslednje izhodno poročilo:

  Posnetek zaslona računalniškega programa Opis samodejno ustvarjen

Zaključek

Odkrili smo uporabo orodja Valgrind za odkrivanje puščanja pomnilnika v programu C++. Vodnik za namestitev Valgrinda je na voljo na začetku. Nato smo podrobneje opisali ustvarjanje datoteke v Ubuntuju z uporabo nano urejevalnika besedil. Na koncu smo z uporabo teh predpogojev izvedli dva primera C++, da preverimo uhajanje pomnilnika v njih. Priloženo je tudi poročilo, ki ga ustvari Valgrind in prikazuje uhajanje pomnilnika v predloženi datoteki.