Kaip aptikti atminties nutekėjimą C/C++ naudojant Valgrind

Kaip Aptikti Atminties Nutekejima C C Naudojant Valgrind



„Valgrind“ yra plačiai naudojamas įrankis programinės įrangos programoms, kurios daugiausia parašytos C, C++ ir kitomis kalbomis, derinti ir profiliuoti. Tai padeda kūrėjams aptikti atminties nutekėjimą, atsekti prieigos prie atminties klaidas ir profiliuoti savo programų vykdymą.

Kai paleisite programą naudodami „Valgrind“, ji dinamiškai įtaiso programos vykdomąjį failą, leidžiantį stebėti programos atminties naudojimą ir vykdymo elgseną.

Atminties nutekėjimas C++

Svarbu pažymėti, kad „Valgrind“ pirmiausia sukurta C ir C++ programoms ir gali neveikti taip efektyviai su kitomis kalbomis arba visais scenarijais. Be to, programos vykdymas naudojant Valgrind gali žymiai sulėtinti jos vykdymą, todėl ji dažnai naudojama kuriant ir derinant, o ne gamybinėje aplinkoje.







Kai dinamiškai sukurta atmintis nėra tinkamai atlaisvinta, gali atsirasti atminties nutekėjimo C/C++, kuris lėtai išeikvos turimus atminties išteklius. Dėl to gali sunaudoti per daug atminties ir pablogėti programos veikimas.



Valgrid montavimas

Norėdami įdiegti „Valgrind“ „Linux“ sistemoje, atidarykite terminalą ir atnaujinkite paketų saugyklas naudodami paketų tvarkyklę, kuri būdinga jūsų „Linux“ paskirstymui. Ši komanda veikia Ubuntu ir Debian sistemoms:



$ sudo tinkamas atnaujinimas

Norėdami įdiegti „Valgrind“, naudokite paketų tvarkyklę. Vėlgi, komanda gali skirtis priklausomai nuo jūsų Linux platinimo. Naudokite šią komandą Ubuntu ir Debian pagrįstoms sistemoms:





$ sudo apt diegti rinkimų vartai

Kai būsite paraginti, įveskite savo vartotojo slaptažodį ir paspauskite „Enter“. Atminkite, kad norint įdiegti programinę įrangą, jūsų vartotojo abonementui reikia administratoriaus teisių. Paketų tvarkyklė atsisiunčia ir įdiegia „Valgrind“ kartu su visomis būtinomis priklausomybėmis. Procesas gali trukti kelias minutes.



Baigę diegimo procesą, galite patvirtinti sėkmingą „Valgrind“ diegimą vykdydami šią komandą kaip patvirtinimo veiksmą:

$ rinkimų vartai -- versija

Ši komanda rodo „Valgrind“ versijos informaciją, jei ji sėkmingai įdiegta.

Viskas! „Valgrind“ dabar turėtų būti įdiegtas jūsų „Linux“ sistemoje, ir jūs galite jį naudoti norėdami analizuoti ir derinti C/C++ programas dėl atminties nutekėjimo ir kitų problemų.

Failo kūrimas Ubuntu

Norėdami pradėti dirbti su programa, pirmiausia turime sukurti failą Ubuntu. Failų kūrimui naudojame nano teksto rengyklę. Taigi, mes rašome komandą terminale taip:

$ nano failas1

Čia nano yra vykdomo teksto rengyklės pavadinimas. Argumentas „file1“ reiškia failo, kurį ketinate atidaryti arba sukurti naudodami nano teksto rengyklę, pavadinimą. Nano atidaro failą redaguoti, jei jis jau yra; jei ne, jis sugeneruoja naują failą pateiktu pavadinimu. Kadangi tokio failo neturime, jis sukuria naują dokumentą pavadinimu „file1“.

Kai paleisite komandą, atsidarys nano redaktorius, kuris suteiks jums tuščią drobę, kad galėtumėte įvesti arba redaguoti failo „file1“ turinį. Galite pradėti vesti arba įklijuoti esamą turinį į redaktorių.

Dabar, kai įvykdytos visos būtinos sąlygos, sukuriame keletą pavyzdžių, kaip naudoti „Valgrind“ atminties nutekėjimui C++ programose aptikti.

1 pavyzdys:

Pirmas mūsų pateiktas pavyzdys rodo paprastą dinaminės atminties paskirstymo, naudojant funkciją „malloc“ iš C bibliotekos , pavyzdį.

#include

tarpt pagrindinis ( )

{

char * a = malloc ( 102 ) ;

grąžinti 0 ;

}

Štai kodo suskirstymas:

Pirmiausia įtraukiame standartinės bibliotekos antraštės failą , kuriame pateikiamos tokios funkcijos kaip malloc dinaminiam atminties paskirstymui ir atskyrimui.

Int main() eilutė deklaruoja pagrindinę funkciją. Tada simbolis *a = malloc(102); deklaruoja žymeklio kintamąjį 'a', kurio tipas yra char* (rodiklis į char). Jis naudoja funkciją „malloc“, kad dinamiškai paskirstytų atmintį 102 simbolių elementų masyvei (iš viso 102 baitai). Atminties paskirstymo dydis, išreikštas baitais, siunčiamas kaip įvestis į malloc funkciją ir išveda rodyklę į naujai sukurtą atminties bloką. Char* žymekliui „a“ priskiriama ši rodyklės reikšmė. Galiausiai „grįžta 0;“ reiškia pagrindinės funkcijos pabaigą.

Trumpai tariant, šis kodas dinamiškai paskirsto atmintį 102 simbolių elementų masyvei naudodamas „malloc“ ir priskiria atminties adresą žymekliui „a“. Tačiau atminkite, kad kodas jokiu būdu nenaudoja ir netvarko paskirtos atminties ir neapima atminties atskyrimo naudojant laisvą.

Kai paleidžiame šią programą per „Valgrind“ su parinktimi „–leak-check=full“, ji atlieka atminties nutekėjimo patikrinimą ir pateikia išvesties ataskaitą.

„Valgrid“ parengta produkcijos ataskaita pateikiama taip:

2 pavyzdys:

Norėdami pradėti nuo šios iliustracijos, pirmiausia sukuriame „test2“ failą naudodami nano teksto rengyklę, kaip paaiškinta anksčiau rašant komandą:

$ nano testas2

Dabar rašome C++ programą, kad patikrintume, ar nėra atminties nutekėjimo naudojant Valgrind:

#include

#include

#include

const int a_s = 3000 ;

tarp pagrindinis ( ) {

tarpt * ia = malloc ( dydis ( tarpt ) * a_s ) ;

dėl ( int i = 0 ; i < a_s; i++ ) {

jam [ i ] = i;

}

srand ( laikas ( NULL ) ) ;

int rn = rand ( ) % a_s;

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

grąžinti 0 ;

}

Peržvelkime programą.

Kodas apima reikalingus antraštės failus ir apibrėžia „a_s“ pastovų kintamąjį, kurio reikšmė yra 3000. Funkcijos main() viduje deklaruojama int* tipo rodyklė „ia“ ir atmintis dinamiškai paskirstoma naudojant „malloc“. funkcija. Išraiška „sizeof(int) * a_s“ nustato bendrą reikalingą atmintį „a_s“ sveikųjų skaičių skaičiui išsaugoti. Visi „ia“ masyvo elementai inicijuojami „for“ cikle su atitinkama indekso reikšme. Pavyzdžiui, ia[0] bus 0, ia[1] bus 1 ir pan.

Atsitiktinių skaičių generatorius sėjamas naudojant funkciją „srand“, naudojant dabartinį laiką. Taip užtikrinama, kad programa kiekvieną kartą vykdant sukurs unikalų atsitiktinių sveikųjų skaičių rinkinį. Funkcija „rand“ generuoja atsitiktinį skaičių, o „rn“ priskiriamas rand() % a_s rezultatui. Modulio operatorius „%“ riboja atsitiktinio skaičiaus diapazoną nuo 0 iki a_s – 1, kuris atitinka galiojantį indeksą „ia“ masyve.

Galiausiai programa naudoja funkciją „printf“, kad išspausdintų reikšmę atsitiktinai pasirinktame „ia“ masyvo indekse „rn“ kartu su atitinkamu indeksu.

Kai paleidžiate šią programą per Valgrind, ji generuoja šią išvesties ataskaitą:

  Automatiškai sugeneruota kompiuterio programos aprašymo ekrano kopija

Išvada

Mes atradome Valgrind įrankio panaudojimą atminties nutekėjimui aptikti C++ programoje. Iš pradžių pateikiamas Valgrind montavimo vadovas. Po to mes išsamiai aptarėme failo sukūrimą Ubuntu naudodami nano teksto rengyklę. Galų gale, naudodami šias būtinas sąlygas, atlikome du C++ pavyzdžius, kad patikrintume atminties nutekėjimą juose. Taip pat pridedama „Valgrind“ sugeneruota ataskaita, kurioje rodomi atminties nutekėjimai pateiktame faile.