Jak wykryć wycieki pamięci w C/C++ za pomocą Valgrind

Jak Wykryc Wycieki Pamieci W C C Za Pomoca Valgrind



Valgrind to szeroko stosowane narzędzie do debugowania i profilowania programów napisanych głównie w językach C, C++ i innych. Pomaga programistom wykrywać wycieki pamięci, śledzić błędy dostępu do pamięci i profilować wykonywanie ich programów.

Kiedy uruchamiasz program w systemie Valgrind, dynamicznie instrumentuje on plik wykonywalny programu, umożliwiając monitorowanie wykorzystania pamięci i zachowania programu.

Wycieki pamięci w C++

Należy pamiętać, że Valgrind jest przeznaczony głównie dla programów C i C++ i może nie działać tak skutecznie z innymi językami lub we wszystkich scenariuszach. Dodatkowo uruchomienie programu pod Valgrindem może znacznie spowolnić jego wykonanie, dlatego często używa się go podczas programowania i debugowania, a nie w środowiskach produkcyjnych.







Gdy dynamicznie utworzona pamięć nie zostanie prawidłowo zwolniona, może to spowodować wycieki pamięci w C/C++, które powoli spowodują wyczerpanie dostępnych zasobów pamięci. Może to skutkować nadmiernym zużyciem pamięci i obniżoną wydajnością programu.



Instalacja Valgrida

Aby zainstalować Valgrind w systemie Linux, otwórz terminal i zaktualizuj repozytoria pakietów za pomocą menedżera pakietów specyficznego dla Twojej dystrybucji Linuksa. Poniższe polecenie działa w systemach opartych na Ubuntu i Debianie:



$ sudo trafna aktualizacja

Użyj menedżera pakietów, aby zainstalować Valgrind. Ponownie polecenie może się różnić w zależności od dystrybucji Linuksa. Użyj następującego polecenia w systemach opartych na Ubuntu i Debianie:





$ sudo trafny zainstalować bramka wyborcza

Po wyświetleniu monitu wprowadź hasło użytkownika i naciśnij „Enter”. Pamiętaj, że Twoje konto użytkownika wymaga uprawnień administratora, aby zainstalować oprogramowanie. Menedżer pakietów pobiera i instaluje Valgrind wraz ze wszystkimi niezbędnymi zależnościami. Proces może potrwać kilka minut.



Po zakończeniu procesu instalacji możesz potwierdzić pomyślną instalację Valgrind, wykonując następujące polecenie w ramach etapu weryfikacji:

$ bramka wyborcza --wersja

To polecenie wyświetla informacje o wersji Valgrind, jeśli został pomyślnie zainstalowany.

Otóż ​​to! Valgrind powinien być teraz zainstalowany w twoim systemie Linux i możesz go używać do analizowania i debugowania programów C/C++ pod kątem wycieków pamięci i innych problemów.

Tworzenie pliku w Ubuntu

Aby rozpocząć pracę nad programem, musimy najpierw utworzyć plik w Ubuntu. Do tworzenia plików używamy edytora tekstu nano. Dlatego piszemy polecenie na terminalu w następujący sposób:

$ nano plik1

Tutaj nano to nazwa uruchamianego edytora tekstu. Argument „plik1” reprezentuje nazwę pliku, który zamierzasz otworzyć lub utworzyć za pomocą edytora tekstu nano. Nano otwiera plik do edycji, jeśli już istnieje; jeśli nie, generuje nowy plik o podanej nazwie. Ponieważ nie mamy takiego pliku, tworzy nowy dokument o nazwie „plik1”.

Po uruchomieniu polecenia otworzy się edytor nano, udostępniając puste płótno do wprowadzenia lub edycji zawartości pliku „plik1”. Możesz rozpocząć wpisywanie lub wklejanie istniejącej treści do edytora.

Teraz, gdy wszystkie wymagania wstępne zostały spełnione, tworzymy kilka przykładów wykorzystania Valgrind do wykrywania wycieków pamięci w programach C++.

Przykład 1:

Pierwszy podany przez nas przykład demonstruje prosty przykład dynamicznej alokacji pamięci przy użyciu funkcji „malloc” z biblioteki w języku C.

#include

wew główny ( )

{

zwęglać * A = malloc ( 102 ) ;

powrót 0 ;

}

Oto podział kodu:

Najpierw dołączamy standardowy plik nagłówkowy biblioteki , który udostępnia funkcje takie jak malloc do dynamicznej alokacji i dealokacji pamięci.

Linia int main() deklaruje funkcję main. Następnie char *a = malloc(102); deklaruje zmienną wskaźnikową „a” typu char* (wskaźnik na znak). Wykorzystuje funkcję „malloc” do dynamicznego przydzielania pamięci dla tablicy zawierającej 102 elementy znakowe (w sumie 102 bajty). Rozmiar alokacji pamięci, wyrażony w bajtach, jest wysyłany jako dane wejściowe do funkcji malloc, która generuje wskaźnik do świeżo utworzonego bloku pamięci. Wskaźnik char* „a” ma przypisaną tę wartość wskaźnika. Na koniec „powrót 0;” oznacza koniec funkcji głównej.

Krótko mówiąc, ten kod dynamicznie przydziela pamięć dla tablicy 102 elementów znakowych za pomocą „malloc” i przypisuje adres pamięci do wskaźnika „a”. Należy jednak pamiętać, że kod w żaden sposób nie wykorzystuje ani nie manipuluje przydzieloną pamięcią i nie obejmuje cofania alokacji pamięci za pomocą free.

Kiedy uruchomimy ten program przez Valgrind z opcją „–leak-check=full”, wykona on sprawdzenie szczelności pamięci i wyświetli raport wyjściowy.

Raport wyjściowy opracowany przez Valgrid przedstawia się następująco:

Przykład 2:

Na początek tworzymy plik „test2” za pomocą edytora tekstu nano, jak wyjaśniono wcześniej, pisząc polecenie:

$ nano test2

Teraz piszemy program w C++, aby sprawdzić, czy nie ma wycieków pamięci przy użyciu Valgrind:

#include

#include

#include

stała int a_s = 3000 ;

int główny ( ) {

wew * ia = malloc ( rozmiar ( wew ) * Jak ) ;

Do ( int ja = 0 ; I < Jak; ja++ ) {

To [ I ] = ja;

}

srand ( czas ( ZERO ) ) ;

int rn = rand ( ) % Jak;

drukuj ( „to [%d]: %d \N ' , rn, to [ rn ] ) ;

powrót 0 ;

}

Przejdźmy przez program.

Kod zawiera niezbędne pliki nagłówkowe i definiuje stałą zmienną „a_s” o wartości 3000. Wewnątrz funkcji main() deklarowany jest wskaźnik „ia” typu int*, a pamięć jest dynamicznie alokowana za pomocą metody „malloc” funkcjonować. Wyrażenie „sizeof(int) * a_s” określa całkowitą pamięć wymaganą do przechowywania liczby całkowitej „a_s”. Wszystkie elementy tablicy „ia” są inicjowane przez pętlę „for” z odpowiadającą im wartością indeksu. Na przykład ia[0] będzie wynosić 0, ia[1] będzie wynosić 1 i tak dalej.

Generator liczb losowych jest uruchamiany za pomocą funkcji „srand” przy użyciu bieżącego czasu. Dzięki temu przy każdym uruchomieniu program generuje unikalny zestaw losowych liczb całkowitych. Funkcja „Rand” generuje liczbę losową, a „rn” przypisuje się wynik Rand() % a_s. Operator modułu „%” ogranicza zakres liczby losowej do zakresu od 0 do a_s – 1, co odpowiada prawidłowemu indeksowi w tablicy „ia”.

Na koniec program używa funkcji „printf” do wydrukowania wartości pod losowo wybranym indeksem „rn” tablicy „ia” wraz z odpowiadającym mu indeksem.

Kiedy uruchomisz ten program poprzez Valgrind, wygeneruje on następujący raport wyjściowy:

  Zrzut ekranu programu komputerowego. Opis wygenerowany automatycznie

Wniosek

Odkryliśmy wykorzystanie narzędzia Valgrind do wykrywania wycieków pamięci w programie C++. Na początku dostarczana jest instrukcja instalacji Valgrind. Następnie omówiliśmy tworzenie pliku w Ubuntu za pomocą edytora tekstu nano. Na koniec, korzystając z tych wymagań wstępnych, wykonaliśmy dwa przykłady C++, aby sprawdzić występujące w nich wycieki pamięci. Załączony jest również raport wygenerowany przez Valgrind, który pokazuje wycieki pamięci w dostarczonym pliku.