Како открити цурење меморије у Ц/Ц++ помоћу Валгринд-а

Kako Otkriti Curene Memorije U C C Pomocu Valgrind A



Валгринд је широко коришћен алат за отклањање грешака и профилисање софтверских програма који су првенствено написани на Ц, Ц++ и другим језицима. Помаже програмерима да открију цурење меморије, пронађу грешке у приступу меморији и профилишу извршавање својих програма.

Када покренете програм под Валгринд-ом, он динамички инструментира извршну датотеку програма, омогућавајући му да надгледа употребу меморије програма и понашање при извршавању.

Пропуштање меморије у Ц++

Важно је напоменути да је Валгринд првенствено дизајниран за Ц и Ц++ програме и можда неће радити тако ефикасно са другим језицима или у свим сценаријима. Поред тога, покретање програма под Валгринд-ом може значајно да успори његово извршавање, тако да се често користи током развоја и отклањања грешака, а не у производним окружењима.







Када се динамички креирана меморија не ослободи правилно, то може изазвати цурење меморије у Ц/Ц++ које ће полако исцрпљивати доступне меморијске ресурсе. То може довести до прекомерне потрошње меморије и погоршања перформанси програма.



Валгрид Инсталлатион

Да бисте инсталирали Валгринд на Линук систему, отворите терминал и ажурирајте своје ризнице пакета користећи менаџер пакета који је специфичан за вашу Линук дистрибуцију. Следећа команда ради за Убунту и Дебиан системе:



$ судо апт упдате

Користите менаџер пакета да инсталирате Валгринд. Опет, команда се може разликовати у зависности од ваше Линук дистрибуције. Користите следећу команду за Убунту и Дебиан системе:





$ судо погодан инсталирај изборна капија

Када се од вас затражи, унесите своју корисничку лозинку и притисните „Ентер“. Имајте на уму да су вашем корисничком налогу потребне административне привилегије да бисте инсталирали софтвер. Менаџер пакета преузима и инсталира Валгринд заједно са свим потребним зависностима. Процес може потрајати неколико минута.



Након што је процес инсталације завршен, можете потврдити успешну инсталацију Валгринд-а тако што ћете извршити следећу команду као корак верификације:

$ изборна капија --версион

Ова команда приказује информације о верзији Валгринд-а ако је успешно инсталиран.

То је то! Валгринд би сада требало да буде инсталиран на вашем Линук систему и можете га користити за анализу и отклањање грешака у вашим Ц/Ц++ програмима због цурења меморије и других проблема.

Креирање датотеке у Убунту-у

Да бисмо почели да радимо на програму, прво треба да креирамо датотеку у Убунту-у. За креирање датотека користимо уређивач нано текста. Дакле, пишемо команду на терминалу на следећи начин:

$ нано филе1

Овде је нано име уређивача текста који се извршава. Аргумент „филе1“ представља име датотеке коју намеравате да отворите или креирате помоћу уређивача нано текста. Нано отвара датотеку за уређивање ако већ постоји; ако није, генерише нову датотеку са наведеним именом. Пошто немамо такву датотеку, она креира нови документ са именом „филе1“.

Једном када покренете команду, отвориће се нано едитор, пружајући вам празно платно да унесете или уредите садржај датотеке „филе1“. Можете почети да куцате или лепите постојећи садржај у уређивач.

Сада када су сви предуслови постигнути, креирали смо неколико примера за коришћење Валгринд-а за откривање цурења меморије у Ц++ програмима.

Пример 1:

Први пример који пружамо показује једноставан пример динамичке алокације меморије коришћењем функције „маллоц“ из библиотеке <стдлиб.х> у Ц.

#инцлуде <стдлиб.х>

инт главни ( )

{

цхар * а = маллоц ( 102 ) ;

повратак 0 ;

}

Ево поделе кода:

Прво укључујемо датотеку заглавља стандардне библиотеке <стдлиб.х> која обезбеђује функције као што је маллоц за динамичку алокацију и делокацију меморије.

Инт маин() линија декларише главну функцију. Затим, цхар *а = маллоц(102); декларише променљиву показивача „а“ типа цхар* (показивач на цхар). Користи функцију „маллоц“ да динамички додељује меморију за низ од 102 цхар елемента (укупно 102 бајта). Величина доделе меморије, изражена у бајтовима, шаље се као улаз у маллоц функцију и она даје показивач на свеже креирани меморијски блок. Показивачу цхар* „а” се додељује ова вредност показивача. На крају, „повратак 0;“ означава крај главне функције.

Укратко, овај код динамички додељује меморију за низ од 102 цхар елемента користећи „маллоц“ и додељује меморијску адресу показивачу „а“. Међутим, имајте на уму да код не користи нити манипулише додељеном меморијом ни на који начин и не укључује ослобађање меморије коришћењем слободне.

Када покренемо овај програм кроз Валгринд са опцијом „–леак-цхецк=фулл“, он врши проверу цурења меморије и даје излазни извештај.

Извештај о резултатима који производи Валгрид је дат на следећи начин:

Пример 2:

За почетак са овом илустрацијом, прво креирамо датотеку „тест2“ користећи нано уређивач текста као што је претходно објашњено писањем команде:

$ нано тест2

Сада пишемо Ц++ програм да проверимо да ли постоји цурење меморије користећи Валгринд:

#инцлуде <стдлиб.х>

#инцлуде <стдио.х>

#инцлуде <тиме.х>

цонст инт а_с = 3000 ;

инт маин ( ) {

инт * иа = маллоц ( величина ( инт ) * као ) ;

за ( инт и = 0 ; и < као што; и++ ) {

то [ и ] = и;

}

сранд ( време ( НУЛА ) ) ;

инт рн = ранд ( ) % као што;

принтф ( 'ит[%д]: %д ' , рн, ит [ рн ] ) ;

повратак 0 ;

}

Хајде да прођемо кроз програм.

Код укључује неопходне датотеке заглавља и дефинише константну променљиву „а_с“ са вредношћу од 3000. Унутар функције маин() декларише се показивач „иа“ типа инт* и меморија се динамички додељује помоћу „маллоц“-а функција. Израз 'сизеоф(инт) * а_с' одређује укупну потребну меморију за складиштење 'а_с' броја целих бројева. Сви елементи низа „иа“ иницијализују се петљом „фор“ са одговарајућом вредношћу индекса. На пример, иа[0] ће бити 0, иа[1] ће бити 1 и тако даље.

Генератор случајних бројева се поставља помоћу функције „сранд“ користећи тренутно време. Ово осигурава да програм производи јединствени скуп насумичних целих бројева сваки пут када се изврши. Функција „ранд“ генерише насумични број, а „рн“ се додељује резултатом ранд() % а_с. Оператор модула „%“ ограничава опсег случајног броја између 0 и а_с – 1 што одговара важећем индексу унутар „иа“ низа.

Коначно, програм користи функцију “принтф” за штампање вредности на случајно одабраном индексу “рн” низа “иа”, заједно са одговарајућим индексом.

Када покренете овај програм преко Валгринд-а, он генерише следећи излазни извештај:

  Аутоматски генерисан снимак екрана описа рачунарског програма

Закључак

Открили смо коришћење алата Валгринд за откривање цурења меморије у Ц++ програму. Упутство за инсталацију Валгринд-а је испоручено на почетку. Након тога смо елаборирали креирање датотеке у Убунту-у помоћу нано уређивача текста. На крају, користећи ове предуслове, извршили смо два Ц++ примера да проверимо цурење меморије у њима. Извештај који је генерисао Валгринд је такође приложен који показује цурење меморије у датој датотеци.