Ako zistiť úniky pamäte v C/C++ pomocou Valgrind

Ako Zistit Uniky Pamate V C C Pomocou Valgrind



Valgrind je široko používaný nástroj na ladenie a profilovanie softvérových programov, ktoré sú primárne napísané v C, C++ a iných jazykoch. Pomáha vývojárom odhaliť úniky pamäte, sledovať chyby prístupu k pamäti a profilovať vykonávanie ich programov.

Keď spustíte program pod Valgrind, dynamicky inštruuje spustiteľný súbor programu, čo mu umožňuje monitorovať využitie pamäte programu a správanie pri vykonávaní.

Úniky pamäte v C++

Je dôležité poznamenať, že Valgrind je primárne navrhnutý pre programy C a C++ a nemusí fungovať tak efektívne s inými jazykmi alebo vo všetkých scenároch. Spustenie programu pod Valgrindom môže navyše výrazne spomaliť jeho vykonávanie, takže sa často používa skôr počas vývoja a ladenia než v produkčnom prostredí.







Keď dynamicky vytvorená pamäť nie je správne uvoľnená, môže to spôsobiť úniky pamäte v C/C++, čo pomaly vyčerpá dostupné pamäťové zdroje. To môže mať za následok nadmernú spotrebu pamäte a znížený výkon programu.



Inštalácia Valgrid

Ak chcete nainštalovať Valgrind na systém Linux, otvorte terminál a aktualizujte svoje archívy balíkov pomocou správcu balíkov, ktorý je špecifický pre vašu distribúciu Linuxu. Nasledujúci príkaz funguje pre systémy založené na Ubuntu a Debiane:



$ sudo apt update

Na inštaláciu Valgrind použite správcu balíkov. Príkaz sa opäť môže líšiť v závislosti od vašej distribúcie Linuxu. Pre systémy založené na Ubuntu a Debiane použite nasledujúci príkaz:





$ sudo apt Inštalácia volebná brána

Po zobrazení výzvy zadajte svoje používateľské heslo a stlačte „Enter“. Upozorňujeme, že váš používateľský účet potrebuje na inštaláciu softvéru oprávnenia správcu. Správca balíkov stiahne a nainštaluje Valgrind spolu so všetkými potrebnými závislosťami. Proces môže trvať niekoľko minút.



Po dokončení procesu inštalácie môžete potvrdiť úspešnú inštaláciu Valgrind vykonaním nasledujúceho príkazu ako overovacieho kroku:

$ volebná brána --verzia

Tento príkaz zobrazí informácie o verzii Valgrind, ak je úspešne nainštalovaný.

To je všetko! Valgrind by mal byť teraz nainštalovaný na vašom systéme Linux a môžete ho použiť na analýzu a ladenie programov C/C++ na úniky pamäte a iné problémy.

Vytvorenie súboru v Ubuntu

Aby sme mohli začať pracovať na programe, musíme najprv vytvoriť súbor v Ubuntu. Na vytváranie súborov používame textový editor nano. Takže príkaz napíšeme na terminál takto:

$ nano súbor1

Tu je nano názov textového editora, ktorý sa vykonáva. Argument „file1“ predstavuje názov súboru, ktorý chcete otvoriť alebo vytvoriť pomocou textového editora nano. Nano otvorí súbor na úpravu, ak už existuje; ak nie, vygeneruje nový súbor so zadaným názvom. Keďže takýto súbor nemáme, vytvorí sa nový dokument s názvom „súbor1“.

Po spustení príkazu sa otvorí nano editor, ktorý vám poskytne prázdne plátno na zadanie alebo úpravu obsahu súboru „file1“. Môžete začať písať alebo vkladať existujúci obsah do editora.

Teraz, keď sú splnené všetky predpoklady, vytvárame niekoľko príkladov na použitie Valgrindu na detekciu únikov pamäte v programoch C++.

Príklad 1:

Prvý príklad, ktorý poskytujeme, ukazuje jednoduchý príklad dynamickej alokácie pamäte pomocou funkcie „malloc“ z knižnice v jazyku C.

#include

int Hlavná ( )

{

char * a = malloc ( 102 ) ;

vrátiť 0 ;

}

Tu je rozpis kódu:

Najprv zahrnieme hlavičkový súbor štandardnej knižnice , ktorý poskytuje funkcie ako malloc pre dynamickú alokáciu pamäte a dealokáciu.

Riadok int main() deklaruje funkciu main. Potom znak *a = malloc(102); deklaruje premennú ukazovateľa „a“ typu char* (ukazovateľ na znak). Používa funkciu „malloc“ na dynamické prideľovanie pamäte pre pole 102 znakov (celkovo 102 bajtov). Veľkosť alokácie pamäte, vyjadrená v bajtoch, je odoslaná ako vstup do funkcie malloc a tá odošle ukazovateľ na čerstvo vytvorený pamäťový blok. Ukazovateľ char* „a“ má priradenú hodnotu tohto ukazovateľa. Nakoniec „návrat 0;“ znamená koniec hlavnej funkcie.

Stručne povedané, tento kód dynamicky prideľuje pamäť pre pole 102 znakov pomocou „malloc“ a priraďuje adresu pamäte k ukazovateľu „a“. Všimnite si však, že kód žiadnym spôsobom nevyužíva ani nemanipuluje s pridelenou pamäťou a nezahŕňa dealokáciu pamäte pomocou free.

Keď spustíme tento program cez Valgrind s možnosťou „–leak-check=full“, vykoná kontrolu úniku pamäte a poskytne výstupnú správu.

Výstupná správa, ktorú vytvára Valgrid, je daná takto:

Príklad 2:

Na začiatok s touto ilustráciou najprv vytvoríme súbor „test2“ pomocou textového editora nano, ako bolo vysvetlené vyššie, napísaním príkazu:

$ nano test2

Teraz napíšeme program C++, aby sme skontrolovali, či nedošlo k úniku pamäte pomocou Valgrind:

#include

#include

#include

const int a_s = 3000 ;

int main ( ) {

int * ia = malloc ( veľkosť ( int ) * a_s ) ;

pre ( int i = 0 ; i < a_s; i++ ) {

to [ i ] = i;

}

srand ( čas ( NULOVÝ ) ) ;

int rn = rand ( ) % a_s;

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

vrátiť 0 ;

}

Poďme si prejsť programom.

Kód obsahuje potrebné hlavičkové súbory a definuje konštantnú premennú „a_s“ s hodnotou 3000. Vo vnútri funkcie main() je deklarovaný ukazovateľ „ia“ typu int* a pamäť je dynamicky alokovaná pomocou „malloc“ funkciu. Výraz „sizeof(int) * a_s“ určuje celkovú požadovanú pamäť na uloženie počtu „a_s“ celých čísel. Všetky prvky poľa „ia“ sú inicializované slučkou „for“ so zodpovedajúcou hodnotou indexu. Napríklad ia[0] bude 0, ia[1] bude 1 atď.

Generátor náhodných čísel je nasadený pomocou funkcie „srand“ pomocou aktuálneho času. To zaisťuje, že program vytvára jedinečnú množinu náhodných celých čísel pri každom spustení. Funkcia „rand“ vygeneruje náhodné číslo a „rn“ sa priradí výsledok rand() % a_s. Modulový operátor „%“ obmedzuje rozsah náhodného čísla na hodnotu medzi 0 a a_s – 1, čo zodpovedá platnému indexu v poli „ia“.

Nakoniec program pomocou funkcie „printf“ vytlačí hodnotu pri náhodne zvolenom indexe „rn“ poľa „ia“ spolu s príslušným indexom.

Keď spustíte tento program cez Valgrind, vygeneruje nasledujúcu výstupnú správu:

  Automaticky vygenerovaná snímka obrazovky s popisom počítačového programu

Záver

Objavili sme využitie nástroja Valgrind na detekciu únikov pamäte v programe C++. Inštalačný sprievodca Valgrind je poskytnutý ako prvý. Potom sme rozpracovali vytvorenie súboru v Ubuntu pomocou textového editora nano. Nakoniec sme pomocou týchto predpokladov vykonali dva príklady C++, aby sme skontrolovali úniky pamäte v nich. Priložená je aj správa, ktorú generuje Valgrind, ktorá zobrazuje úniky pamäte v poskytnutom súbore.