Kā noteikt atmiņas noplūdes programmā C/C++, izmantojot Valgrind

Ka Noteikt Atminas Nopludes Programma C C Izmantojot Valgrind



Valgrind ir plaši izmantots rīks, lai atkļūdotu un profilētu programmatūras programmas, kas galvenokārt ir rakstītas C, C++ un citās valodās. Tas palīdz izstrādātājiem atklāt atmiņas noplūdes, izsekot atmiņas piekļuves kļūdas un profilēt savu programmu izpildi.

Palaižot programmu zem Valgrind, tā dinamiski instrumentē programmas izpildāmo failu, ļaujot tai pārraudzīt programmas atmiņas lietojumu un izpildes uzvedību.

Atmiņas noplūde programmā C++

Ir svarīgi atzīmēt, ka Valgrind galvenokārt ir paredzēts C un C++ programmām un var nedarboties tik efektīvi ar citām valodām vai visos scenārijos. Turklāt programmas palaišana zem Valgrind var ievērojami palēnināt tās izpildi, tāpēc to bieži izmanto izstrādes un atkļūdošanas laikā, nevis ražošanas vidēs.







Ja dinamiski izveidota atmiņa netiek pareizi atbrīvota, C/C++ var izraisīt atmiņas noplūdes, kas lēnām iztukšo pieejamos atmiņas resursus. Tas var izraisīt pārmērīgu atmiņas patēriņu un pasliktinātu programmas veiktspēju.



Valgrid uzstādīšana

Lai instalētu Valgrind Linux sistēmā, atveriet termināli un atjauniniet pakotņu krātuves, izmantojot pakotņu pārvaldnieku, kas ir raksturīgs jūsu Linux izplatīšanai. Šī komanda darbojas sistēmām, kuru pamatā ir Ubuntu un Debian:



$ sudo piemērots atjauninājums

Lai instalētu Valgrind, izmantojiet pakotņu pārvaldnieku. Atkal komanda var atšķirties atkarībā no jūsu Linux izplatīšanas. Sistēmām, kuru pamatā ir Ubuntu un Debian, izmantojiet šo komandu:





$ sudo apt uzstādīt vēlēšanu vārti

Kad tiek prasīts, ievadiet savu lietotāja paroli un nospiediet 'Enter'. Ņemiet vērā, ka jūsu lietotāja kontam ir nepieciešamas administratora tiesības, lai instalētu programmatūru. Pakešu pārvaldnieks lejupielādē un instalē Valgrind kopā ar visām nepieciešamajām atkarībām. Process var ilgt dažas minūtes.



Kad instalēšanas process ir pabeigts, varat apstiprināt veiksmīgu Valgrind instalēšanu, izpildot šādu komandu kā pārbaudes darbību:

$ vēlēšanu vārti -- versija

Šī komanda parāda Valgrind versijas informāciju, ja tā ir veiksmīgi instalēta.

Tieši tā! Tagad Valgrind ir jāinstalē jūsu Linux sistēmā, un jūs varat to izmantot, lai analizētu un atkļūdotu C/C++ programmas, lai novērstu atmiņas noplūdes un citas problēmas.

Faila izveide Ubuntu

Lai sāktu darbu pie programmas, mums vispirms ir jāizveido fails Ubuntu. Failu izveidei mēs izmantojam nano teksta redaktoru. Tātad, mēs rakstām komandu terminālī šādi:

$ nano fails1

Šeit nano ir teksta redaktora nosaukums, kas tiek izpildīts. Arguments “file1” apzīmē tā faila nosaukumu, kuru plānojat atvērt vai izveidot, izmantojot nano teksta redaktoru. Nano atver failu rediģēšanai, ja tas jau pastāv; ja nē, tas ģenerē jaunu failu ar norādīto nosaukumu. Tā kā mums šāda faila nav, tas izveido jaunu dokumentu ar nosaukumu “file1”.

Kad palaižat komandu, tiks atvērts nano redaktors, nodrošinot jums tukšu audeklu, lai ievadītu vai rediģētu faila “file1” saturu. Varat sākt rakstīt vai ielīmēt esošo saturu redaktorā.

Tagad, kad visi priekšnoteikumi ir sasniegti, mēs izveidojam dažus piemērus, lai izmantotu Valgrind, lai atklātu atmiņas noplūdes C++ programmās.

1. piemērs:

Pirmais mūsu sniegtais piemērs parāda vienkāršu dinamiskās atmiņas piešķiršanas piemēru, izmantojot funkciju “malloc” no bibliotēkas C.

#include

starpt galvenais ( )

{

char * a = malloc ( 102 ) ;

atgriezties 0 ;

}

Šeit ir koda sadalījums:

Vispirms tiek iekļauts standarta bibliotēkas galvenes fails , kas nodrošina tādas funkcijas kā malloc dinamiskai atmiņas piešķiršanai un atdalīšanai.

Int main() rinda deklarē galveno funkciju. Tad char *a = malloc(102); deklarē rādītāja mainīgo “a” tipa char* (norādītājs uz char). Tas izmanto funkciju “malloc”, lai dinamiski piešķirtu atmiņu 102 char elementu masīvam (kopā 102 baiti). Atmiņas sadalījuma lielums, kas izteikts baitos, tiek nosūtīts kā ievade funkcijai malloc, un tas izvada rādītāju uz tikko izveidoto atmiņas bloku. Char* rādītājam “a” tiek piešķirta šī rādītāja vērtība. Visbeidzot, “atgriešanās 0;” apzīmē galvenās funkcijas beigas.

Īsāk sakot, šis kods dinamiski piešķir atmiņu 102 rakstzīmju elementu masīvam, izmantojot “malloc”, un piešķir atmiņas adresi rādītājam “a”. Tomēr ņemiet vērā, ka kods nekādā veidā neizmanto un neapstrādā piešķirto atmiņu un neietver atmiņas atdalīšanu, izmantojot bezmaksas.

Kad mēs palaižam šo programmu caur Valgrind ar opciju “–leak-check=full”, tā veic atmiņas noplūdes pārbaudi un nodrošina izvades atskaiti.

Valgrid sagatavotais izejas ziņojums ir šāds:

2. piemērs:

Lai sāktu ar šo ilustrāciju, mēs vispirms izveidojam “test2” failu, izmantojot nano teksta redaktoru, kā paskaidrots iepriekš, rakstot komandu:

$ nano tests2

Tagad mēs rakstām C++ programmu, lai pārbaudītu, vai nav atmiņas noplūdes, izmantojot Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int galvenais ( ) {

starpt * ia = malloc ( izmērs ( starpt ) * a_s ) ;

priekš ( int i = 0 ; i < a_s; i++ ) {

to [ i ] = i;

}

srand ( laiks ( NULL ) ) ;

int rn = rands ( ) % a_s;

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

atgriezties 0 ;

}

Tiksim cauri programmai.

Kods ietver nepieciešamos galvenes failus un definē konstanto mainīgo “a_s” ar vērtību 3000. Funkcijā main() tiek deklarēts int* tipa rādītājs “ia” un atmiņa tiek dinamiski piešķirta, izmantojot “malloc”. funkciju. Izteiksme 'sizeof(int) * a_s' nosaka kopējo nepieciešamo atmiņu, lai saglabātu 'a_s' veselo skaitļu skaitu. Visus “ia” masīva elementus inicializē “for” cilpa ar tai atbilstošo indeksa vērtību. Piemēram, ia[0] būs 0, ia[1] būs 1 un tā tālāk.

Nejaušo skaitļu ģenerators tiek iesēts, izmantojot funkciju “srand”, izmantojot pašreizējo laiku. Tas nodrošina, ka programma katru reizi, kad tā tiek izpildīta, izveido unikālu nejaušu veselu skaitļu kopu. Funkcija “rand” ģenerē nejaušu skaitli, un “rn” tiek piešķirts ar rand() % a_s rezultātu. Moduļa operators “%” ierobežo nejaušā skaitļa diapazonu no 0 līdz a_s – 1, kas atbilst derīgam indeksam “ia” masīvā.

Visbeidzot, programma izmanto funkciju “printf”, lai drukātu vērtību nejauši izvēlētajā “ia” masīva indeksā “rn” kopā ar atbilstošo indeksu.

Palaižot šo programmu, izmantojot Valgrind, tā ģenerē šādu izvades atskaiti:

  Automātiski ģenerēts datorprogrammas apraksta ekrānuzņēmums

Secinājums

Mēs atklājām Valgrind rīka izmantošanu, lai atklātu atmiņas noplūdes C++ programmā. Sākotnēji tiek nodrošināta Valgrind uzstādīšanas rokasgrāmata. Pēc tam mēs izstrādājām faila izveidi Ubuntu, izmantojot nano teksta redaktoru. Galu galā, izmantojot šos priekšnosacījumus, mēs izpildījām divus C++ piemērus, lai pārbaudītu atmiņas noplūdes tajos. Ir pievienots arī Valgrind ģenerētais ziņojums, kas parāda atmiņas noplūdes sniegtajā failā.