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 --verziaTento 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úbor1Tu 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
int Hlavná ( )
{
char * a = malloc ( 102 ) ;
vrátiť 0 ;
}
Tu je rozpis kódu:
Najprv zahrnieme hlavičkový súbor štandardnej knižnice
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 test2Teraz 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:
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.