C++ Academy · Lektion

Grundlæggende om Valgrind

Find leaks og fejl

Lektion 4 af 413 trin

Grundlæggende om Valgrind er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad er Valgrind

Valgrind er et instrumenteringsrammeværk. Standardværktøjet Memcheck registrerer hukommelseslækager og -fejl uden omkompilering ved at køre programmet på en simuleret CPU.

Kørsel af Memcheck

Start dit program via Valgrind. Byg først med -g for at få linjenumre.

g++ -g main.cpp -o app
valgrind --leak-check=full ./app

Registrering af lækager

Memcheck rapporterer hukommelse, der stadig er allokeret ved afslutningen, og klassificerer den som definitivt tabt, indirekte tabt eller stadig tilgængelig.

#include <cstdlib>

int main() {
    int* p = (int*)malloc(40); // never freed -> definitely lost
    return 0;
}

Lækagekategorier

Forstå rapportens kategorier.

  • Definitivt tabt: ingen pointer er tilbage; en reel lækage
  • Indirekte tabt: kan kun nås via en tabt blok
  • Stadig tilgængelig: en pointer findes ved afslutningen (ofte ufarligt)

Ugyldige læsninger og skrivninger

Memcheck registrerer adgang til ikke-allokeret eller frigivet hukommelse og rapporterer adressen og størrelsen.

#include <cstdlib>

int main() {
    int* a = (int*)malloc(2 * sizeof(int));
    a[5] = 1; // invalid write past the block
    free(a);
    return 0;
}

Ikke-initialiserede værdier

Memcheck advarer, når en betingelse eller et resultat afhænger af en ikke-initialiseret værdi, hvilket ofte er en kilde til ikke-deterministiske fejl.

#include <iostream>

int main() {
    int x;            // uninitialized
    if (x == 42)      // use of uninitialized value
        std::cout << "hi\n";
    return 0;
}

Læsning af outputtet

Hver fejlblok viser handlingen, det fejlbehæftede stakspor og (for heap-blokke) hvor hukommelsen blev allokeret. HEAP SUMMARY summerer allokeringer og lækager.

Nyttige flag

Almindelige indstillinger:

  • --leak-check=full: detaljer om hver lækage
  • --show-leak-kinds=all
  • --track-origins=yes: spor ikke-initialiserede værdier tilbage til deres kilde
  • --error-exitcode=1: få CI til at fejle ved fejl

Valgrind sammenlignet med ASan

Begge finder hukommelsesfejl, men med forskellige afvejninger.

  • Valgrind: kræver ingen omkompilering, er langsommere (10-50 gange) og er god til at finde ikke-initialiserede læsninger
  • ASan: kræver omkompilering, er meget hurtigere og er bedre til at registrere stakoverløb

Undertrykkelse af kendte problemer

Tredjepartsbiblioteker kan skabe støj. Generér og anvend en undertrykkelsesfil med --gen-suppressions=all og --suppressions=file for at skjule kendte, ufarlige rapporter.

Hvornår skal du bruge Valgrind

Brug Valgrind, når du ikke kan omkompilere med sanitizere, har brug for præcis sporing af ikke-initialiserede værdier eller ønsker en ekstra vurdering. Ellers er ASan normalt hurtigere til almindelig CI.

Hurtigt tjek

Husk lækagekategorierne.

Opsummering

Du har lært det grundlæggende om Valgrind.

  • Memcheck finder lækager, ugyldig adgang og ikke-initialiserede læsninger uden omkompilering
  • Kør med --leak-check=full --track-origins=yes
  • Lækagetyper: definitivt eller indirekte tabt, stadig tilgængelig
  • Langsommere end ASan, men fremragende til fejl med ikke-initialiserede værdier
Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Grundlæggende om Valgrind” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Grundlæggende om Valgrind”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Grundlæggende om Valgrind”?

Find leaks og fejl Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Grundlæggende om Valgrind”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Brug af gdb og lldb
  2. AddressSanitizer
  3. UBSan og TSan
  4. Grundlæggende om Valgrind
← Tilbage til C++ Academy