C Academy · Oppitunti

Miksi Valgrind

Havaitse muistivirheet.

Oppitunti 1/413 vaihetta

Miksi Valgrind on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Mikä Valgrind on

Valgrind on instrumentointikehys, joka suorittaa ohjelmasi synteettisessä suorittimessa ja tarkkailee jokaista muistitoimintoa.

Sen käytetyin työkalu memcheck havaitsee virheet, jotka kaatavat C-ohjelmat vasta tunteja varsinaisen virheen tapahtumisen jälkeen.

  • Muistivuodot
  • Vapautetun tai alustamattoman muistin käyttö
  • Puskurin rajojen ulkopuoliset luku- ja kirjoitusoperaatiot
  • Virheellinen free / yhteensopimattomat varaus- ja vapautusmekanismit

Miksi C tarvitsee sitä

C-kielessä ei ole roskienkeruuta eikä rajatarkistuksia. Kääntäjä luottaa sinuun täysin.

Puskurin ylivuoto tai unohtunut free kääntyy ongelmitta ja saattaa toimia testauksessa hyvin, mutta myöhemmin vioittaa tietoja tai kaataa ohjelman tuotannossa.

Valgrind tarjoaa turvaverkon, jota kieli ei suostu tarjoamaan.

Vuotava ohjelma

Tämä ohjelma varaa muistia eikä koskaan vapauta sitä. Se kääntyy ja suoritetaan ilman ilmoituksia.

malloc-funktiolla varattu lohko katoaa heti, kun main palaa. Pitkään käynnissä olevassa palvelimessa tuhannet tällaiset lohkot kuluttavat kaiken RAM-muistin.

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int *data = malloc(100 * sizeof(int));
    data[0] = 42;
    printf("%d\n", data[0]);
    return 0; /* forgot free(data) */
}

Mitä kääntäjä ei huomaa

Kun suoritat ohjelman komennolla gcc -Wall -Wextra, saat nolla varoitusta.

Kääntäjä päättelee syntaksista ja tyypeistä, ei ajonaikaisesta muistin toiminnasta. Muistivuoto on ajonaikainen tosiasia, joka ei näy käännösaikana.

Juuri tämän aukon Valgrind täyttää.

Miten instrumentointi toimii

Valgrind ei tarvitse lähdekoodiasi tai erityisiä käännösvalitsimia. Se toimii käännetyn binäärin kanssa.

Se kääntää konekoodisi JIT-menetelmällä uudelleen ja lisää tarkistuksia jokaisen luku-, kirjoitus- ja varausoperaation ympärille. Jokaiselle tavulle ylläpidetään varjometatietoja, jotka seuraavat, onko tavu käytettävissä ja määritelty.

Suorittaminen

Peruskutsu tehdään lisäämällä Valgrind normaalin komennon eteen.

--leak-check=full-valitsin pyytää erittelyn jokaisesta vuodosta pinojäljityksineen.

valgrind --leak-check=full ./myprogram arg1 arg2

Käännä selkeitä raportteja varten

Valgrind toimii minkä tahansa binäärin kanssa, mutta sen raporteista on paljon enemmän hyötyä debuggaustietojen kanssa.

Käännä ohjelma valitsimella -g, jotta jäljityksissä näkyvät tiedostojen nimet ja rivinumerot raakaosoitteiden sijaan.

  • -g lisää debuggauksen vaatimat tiedot
  • -O0 estää optimointien uudelleenjärjestelyt, jotka sekoittavat jäljityksiä
gcc -g -O0 -o myprogram myprogram.c

Mitä se maksaa

Instrumentointi ei ole ilmaista. memcheck-ohjelman alla suoritettava ohjelma toimii noin 10–50 kertaa hitaammin ja käyttää enemmän muistia.

Tämä sopii testaukseen ja virheenkorjaukseen, mutta tuotantoon ei koskaan toimiteta binääriä, joka suoritetaan Valgrindin alla. Se on kehitystyökalu.

Työkalukokonaisuus

Valgrind on enemmän kuin memcheck. Muut työkalut jakavat saman ytimen:

  • memcheck — muistivirheet ja vuodot (oletus)
  • cachegrind — välimuistin ja haarautumisten profilointi
  • callgrind — kutsukaavion profilointi
  • helgrind — säikeiden kilpailutilanteiden tunnistus
  • massif — keon profilointi ajan kuluessa

Milloin sitä kannattaa käyttää

Käytä Valgrindia aina, kun havaitset seuraavaa:

  • Salaperäisiä kaatumisia, joiden kohta muuttuu, kun lisäät printf-kutsun
  • Muistinkulutusta, joka kasvaa jatkuvasti
  • Roska-arvoja, jotka muuttuvat suorituskertojen välillä
  • Kaatumisia, jotka ilmenevät vain joillakin syötteillä tai alustoilla

Nämä ovat muistiin liittyvän määrittelemättömän toiminnan tyypillisiä tunnusmerkkejä.

Tunnettavat rajoitukset

Valgrind on tehokas, mutta ei kaikkitietävä:

  • Se ei löydä virheitä koodipoluista, joita testi ei suorita
  • Pino- ja globaalien muuttujien ylivuodot havaitaan epäluotettavammin kuin keon ylivuodot
  • Se on hidas, joten se ei sovellu reaaliaikaisiin työkuormiin

Yhdistä se pehmentäjiin ja testeihin, jotta kattavuus on mahdollisimman hyvä.

Pikatesti

Testaa, miten hyvin ymmärrät Valgrindin vaatimukset.

Kertaus

Nyt tiedät, mikä Valgrind on ja miksi C tarvitsee sitä:

  • C ei tarjoa automaattista muistiturvallisuutta, joten ajonaikaiset virheet voivat ohittaa kääntäjän
  • Valgrind instrumentoi binäärin ja seuraa jokaista muistin käyttöä
  • memcheck havaitsee vuodot, virheelliset käytöt ja alustamattoman muistin lukemiset
  • Käännä valitsimilla -g -O0, jotta raportit ovat selkeitä; varaudu huomattavaan hidastumiseen

Seuraavaksi havaitset todelliset muistivuodot memcheckillä.

Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Miksi Valgrind” ilmainen?

Kyllä – oppitunnin ”Miksi Valgrind” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Miksi Valgrind”?

Havaitse muistivirheet. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Miksi Valgrind”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi Valgrind
  2. Vuotojen havaitseminen
  3. Virheellinen käyttö
  4. Raporttien lukeminen
← Takaisin: C Academy