Hur man upptäcker minnesläckor i C/C++ med Valgrind

Hur Man Upptacker Minneslackor I C C Med Valgrind



Valgrind är ett flitigt använt verktyg för att felsöka och profilera program som huvudsakligen är skrivna på C, C++ och andra språk. Det hjälper utvecklarna att upptäcka minnesläckor, spåra minnesåtkomstfel och profilera exekveringen av deras program.

När du kör ett program under Valgrind, instrumenterar det dynamiskt programmets körbara filer, vilket gör att det kan övervaka programmets minnesanvändning och körningsbeteende.

Minnesläckor i C++

Det är viktigt att notera att Valgrind främst är designad för C- och C++-program och kanske inte fungerar lika effektivt med andra språk eller i alla scenarier. Dessutom kan körning av ett program under Valgrind avsevärt sakta ner dess exekvering, så det används ofta under utveckling och felsökning snarare än i produktionsmiljöer.







När ett dynamiskt skapat minne inte frigörs korrekt kan det orsaka minnesläckor i C/C++ som långsamt kommer att tömma de tillgängliga minnesresurserna. Detta kan resultera i överdriven minnesförbrukning och försämrad prestanda för programmet.



Valgrid installation

För att installera Valgrind på ett Linux-system, öppna en terminal och uppdatera dina paketförråd med pakethanteraren som är specifik för din Linux-distribution. Följande kommando fungerar för Ubuntu och Debian-baserade system:



$ sudo passande uppdatering

Använd pakethanteraren för att installera Valgrind. Återigen, kommandot kan variera beroende på din Linux-distribution. Använd följande kommando för Ubuntu och Debian-baserade system:





$ sudo benägen Installera valporten

När du uppmanas, ange ditt användarlösenord och tryck på 'Enter'. Observera att ditt användarkonto behöver administratörsbehörighet för att installera programvaran. Pakethanteraren laddar ner och installerar Valgrind tillsammans med alla nödvändiga beroenden. Processen kan ta några minuter.



När installationsprocessen är klar kan du bekräfta att Valgrind har installerats genom att utföra följande kommando som ett verifieringssteg:

$ valporten --version

Detta kommando visar versionsinformationen för Valgrind om den har installerats framgångsrikt.

Det är allt! Valgrind bör nu installeras på ditt Linux-system, och du kan använda det för att analysera och felsöka dina C/C++-program för minnesläckor och andra problem.

Skapa en fil i Ubuntu

För att börja arbeta med programmet måste vi först skapa en fil i Ubuntu. För att skapa filer använder vi nanotextredigeraren. Så vi skriver kommandot på terminalen enligt följande:

$ nano fil1

Här är nano namnet på textredigeraren som körs. Argumentet 'fil1' representerar namnet på filen som du tänker öppna eller skapa med nanotextredigeraren. Nano öppnar filen för redigering om den redan finns; om inte, genererar den en ny fil med det angivna namnet. Eftersom vi inte har en sådan fil skapar den ett nytt dokument med namnet 'fil1'.

När du har kört kommandot öppnas nanoredigeraren och ger dig en tom arbetsyta för att ange eller redigera innehållet i filen 'file1'. Du kan börja skriva eller klistra in det befintliga innehållet i redigeraren.

Nu när alla förutsättningar är uppfyllda skapar vi några exempel för att använda Valgrind för att upptäcka minnesläckor i C++-program.

Exempel 1:

Det första exemplet som vi tillhandahåller visar ett enkelt exempel på dynamisk minnesallokering med funktionen 'malloc' från -biblioteket i C.

#include

int huvud ( )

{

röding * a = malloc ( 102 ) ;

lämna tillbaka 0 ;

}

Här är en uppdelning av koden:

Vi inkluderar först standardbibliotekshuvudfilen som tillhandahåller funktioner som malloc för dynamisk minnesallokering och deallokering.

Linjen int main() deklarerar huvudfunktionen. Sedan är char *a = malloc(102); deklarerar en pekvariabel 'a' av typen char* (pekare till char). Den använder 'malloc'-funktionen för att dynamiskt allokera minnet för en array av 102 teckenelement (102 byte totalt). Minnesallokeringsstorleken, uttryckt i byte, skickas som en ingång till malloc-funktionen och den matar ut en pekare till det nyskapade minnesblocket. Tecken*-pekaren 'a' tilldelas detta pekarvärde. Slutligen, 'retur 0;' betecknar slutet på huvudfunktionen.

Kort sagt, denna kod allokerar minnet dynamiskt för en array av 102 tecken med hjälp av 'malloc' och tilldelar minnesadressen till pekaren 'a'. Observera dock att koden inte använder eller manipulerar det tilldelade minnet på något sätt och inkluderar inte avallokering av minnet med gratis.

När vi kör det här programmet genom Valgrind med alternativet “–leak-check=full” utför det en minnesläckagekontroll och ger en utdatarapport.

Resultatrapporten som produceras av Valgrid ges enligt följande:

Exempel 2:

Till att börja med den här illustrationen skapar vi först en 'test2' -fil med hjälp av nanotextredigeraren som förklarats tidigare genom att skriva kommandot:

$ nano test 2

Nu skriver vi ett C++-program för att kontrollera om det finns någon minnesläcka med Valgrind:

#include

#include

#inkludera

const int a_s = 3000 ;

int main ( ) {

int * ia = malloc ( storlek av ( int ) * som ) ;

för ( int i = 0 ; i < som; i++ ) {

Det [ i ] = i;

}

srand ( tid ( NULL ) ) ;

int rn = rand ( ) % som;

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

lämna tillbaka 0 ;

}

Låt oss ta oss igenom programmet.

Koden innehåller de nödvändiga rubrikfilerna och definierar konstantvariabeln 'a_s' med ett värde på 3000. Inuti main()-funktionen deklareras en pekare 'ia' av typen int* och minnet allokeras dynamiskt med hjälp av 'malloc' fungera. Uttrycket 'sizeof(int) * a_s' bestämmer det totala minnet som krävs för att lagra 'a_s'-talet av heltal. Alla element i 'ia'-matrisen initieras av 'for'-loopen med dess motsvarande indexvärde. Till exempel kommer ia[0] att vara 0, ia[1] kommer att vara 1 och så vidare.

Slumpgeneratorn seedas med 'srand'-funktionen med den aktuella tiden. Detta säkerställer att programmet producerar en unik uppsättning slumpmässiga heltal varje gång det körs. Funktionen 'rand' genererar ett slumptal, och 'rn' tilldelas med resultatet rand() % a_s. Moduloperatorn '%' begränsar intervallet för slumptalet till att vara mellan 0 och a_s – 1, vilket motsvarar ett giltigt index inom 'ia'-matrisen.

Slutligen använder programmet 'printf'-funktionen för att skriva ut värdet vid det slumpmässigt valda indexet 'rn' för 'ia'-matrisen, tillsammans med motsvarande index.

När du kör det här programmet genom Valgrind genererar det följande utdatarapport:

  En skärmdump av ett datorprogram Beskrivning genereras automatiskt

Slutsats

Vi upptäckte användningen av Valgrind-verktyget för att upptäcka minnesläckor i ett C++-program. Installationsguiden för Valgrind tillhandahålls initialt. Efter det utvecklade vi skapandet av en fil i Ubuntu med hjälp av nanotextredigeraren. Till slut, med dessa förutsättningar, körde vi två C++-exempel för att kontrollera minnesläckorna i dem. Rapporten som genereras av Valgrind bifogas också som visar minnesläckorna i den medföljande filen.