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
tarpt pagrindinis ( )
{
char * a = malloc ( 102 ) ;
grąžinti 0 ;
}
Štai kodo suskirstymas:
Pirmiausia įtraukiame standartinės bibliotekos antraštės failą
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 testas2Dabar 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ą:
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.