Ero sivun ”Valgrind” versioiden välillä
p (katso myös yms) |
|||
(6 välissä olevaa versiota 4 käyttäjän tekeminä ei näytetä) | |||
Rivi 1: | Rivi 1: | ||
{{ Ohjelma | nimi= | {{Ohjelma | ||
| nimi=Valgrind | |||
| kuva= | |||
| kuvateksti= | |||
| lisenssi=[[GPL]] | |||
| käyttöliittymä=teksti | |||
| kotisivu=[http://valgrind.org valgrind.org] | |||
}} | |||
Valgrind on helppokäyttöinen ja hyödyllinen muistidebuggaus- ja profilointityökalu | '''Valgrind''' on helppokäyttöinen ja hyödyllinen muistidebuggaus- ja profilointityökalu Linuxille, joka tukee x86-, AMD64-, ppc- ja ppc64-prosessorityyppejä. | ||
== Asennus == | |||
{{Asenna|Valgrind|valgrind}} | |||
== Käyttö == | == Käyttö == | ||
Rivi 8: | Rivi 18: | ||
valgrind ./ohjelma | valgrind ./ohjelma | ||
Tämän jälkeen | Tämän jälkeen Valgrind tulostaa, oletuksena standarditulostusvirtaan, mm. hyödyllistä tietoa ohjelman muistinkäytön puutteista, jos niitä on. | ||
===Työkalut=== | ===Työkalut=== | ||
Mikäli haluat käyttää jotain muuta työkalua kuin memcheck, käytä valitsinta --tool=<työkalu>. | Mikäli haluat käyttää jotain muuta työkalua kuin memcheck, käytä valitsinta <tt>--tool=<työkalu></tt>. | ||
Valittavana on seuraavat työkalut: | Valittavana on seuraavat työkalut: | ||
* | * memcheck, erinomainen työkalu muistinhallinnan virheiden löytämiseen. | ||
* cachegrind, työkalu, joka kertoo kuinka hyvin ohjelmasi hyödyntää prosessorivälimuistia. | |||
* | * callgrind, työkalu, joka antaa kehittäjälle olennaista tietoa ohjelman eri osien käyttämistä prosessoriresursseista . | ||
* massif, työkalu ohjelman dynaamisesti varattavan muistin käytön profilointiin. | |||
* | * helgrind, synkronointivirheiden etsimiseen POSIX-säikeitä käyttävistä ohjelmista. | ||
* | |||
* | |||
== Tulosteen tulkinta == | == Tulosteen tulkinta == | ||
Rivi 30: | Rivi 36: | ||
Valgrindin tulostamien rivien alussaoleva ==[[PID]]== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. | Valgrindin tulostamien rivien alussaoleva ==[[PID]]== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. | ||
Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää. | Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää. | ||
===tool=memcheck=== | ===tool=memcheck=== | ||
Rivi 38: | Rivi 43: | ||
Merkinnän jälkeen tulostuu kutsupino, joka kertoo, missä virhe tapahtuu. Esimerkiksi: | Merkinnän jälkeen tulostuu kutsupino, joka kertoo, missä virhe tapahtuu. Esimerkiksi: | ||
==12393== at 0x80483FA: main (testi.c:7) | ==12393== at 0x80483FA: main (testi.c:7) | ||
kertoo, että virhe tapahtuu suoritettavan ohjelman kohdassa 0x80483FA, funktiossa main(), lähdekooditiedostossa testi.c ja rivillä 7. | kertoo, että virhe tapahtuu suoritettavan ohjelman kohdassa 0x80483FA, funktiossa <tt>main()</tt>, lähdekooditiedostossa testi.c ja rivillä 7. | ||
==16340== Address 0x416702D is 1 bytes after a block of size 4 alloc'd | ==16340== Address 0x416702D is 1 bytes after a block of size 4 alloc'd | ||
Rivi 47: | Rivi 52: | ||
==18096== Conditional jump or move depends on uninitialised value(s) | ==18096== Conditional jump or move depends on uninitialised value(s) | ||
Tämä virhe syntyy, kun koodissa on käytetty if, for tai while -ohjauslausekkeiden ehtona muuttujaa, jonka muistialue on alustamaton tai jonka muistialueen sisältö ei ole määräytynyt täsmällisesti ohjelman ajon aikana. | Tämä virhe syntyy, kun koodissa on käytetty if-, for- tai while-ohjauslausekkeiden ehtona muuttujaa, jonka muistialue on alustamaton tai jonka muistialueen sisältö ei ole määräytynyt täsmällisesti ohjelman ajon aikana. | ||
Tässä vikana voi olla esimerkiksi unohtunut = NULL -sijoitus olemattomalle oliolle, kun olion ja NULL:n vertailua käytetään ehtona olion käsittelylle. Kannattaa kuitenkin välttää logiikkavirheiden peittämistä mielivaltaisella alustamisella! | Tässä vikana voi olla esimerkiksi unohtunut <tt>= NULL</tt> -sijoitus olemattomalle oliolle, kun olion ja <tt>NULL</tt>:n vertailua käytetään ehtona olion käsittelylle. Kannattaa kuitenkin välttää logiikkavirheiden peittämistä mielivaltaisella alustamisella! | ||
===Yhteenveto ohjelman muistinkäytöstä=== | ===Yhteenveto ohjelman muistinkäytöstä=== | ||
Rivi 60: | Rivi 65: | ||
==8843== checked 53,100 bytes. | ==8843== checked 53,100 bytes. | ||
Käyttämällä valitsinta <tt>--leak-check=full</tt> saadaan tietoa menetetystä muistista: | |||
Käyttämällä valitsinta --leak-check=full saadaan tietoa menetetystä muistista: | |||
==8843== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 | ==8843== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 | ||
Rivi 88: | Rivi 92: | ||
== Aiheesta muualla == | == Aiheesta muualla == | ||
*[http://jumi.lut.fi/~paalanen/htyot/valgrind.html Valgrind - muistidebuggeri] -opas | *[http://jumi.lut.fi/~paalanen/htyot/valgrind.html Valgrind - muistidebuggeri] -opas {{vanhentunut linkki}} | ||
== Katso myös == | == Katso myös == | ||
*[[Gdb]] | *[[Gdb]] | ||
*[[Strace]] | |||
[[Luokka:Kehitystyökalut]] | [[Luokka:Kehitystyökalut]] |
Nykyinen versio 14. elokuuta 2016 kello 12.44
Valgrind | |
---|---|
Käyttöliittymä | teksti |
Lisenssi | GPL |
Kotisivu | valgrind.org |
Valgrind on helppokäyttöinen ja hyödyllinen muistidebuggaus- ja profilointityökalu Linuxille, joka tukee x86-, AMD64-, ppc- ja ppc64-prosessorityyppejä.
Asennus[muokkaa]
Valgrind löytyy useimpien jakeluiden paketinhallinnasta nimellä valgrind. Lisätietoja ohjelmien asentamisesta löytyy artikkelista Ohjelmien asentaminen.
Käyttö[muokkaa]
Valgrind käynnistetään kuten Gdb
valgrind ./ohjelma
Tämän jälkeen Valgrind tulostaa, oletuksena standarditulostusvirtaan, mm. hyödyllistä tietoa ohjelman muistinkäytön puutteista, jos niitä on.
Työkalut[muokkaa]
Mikäli haluat käyttää jotain muuta työkalua kuin memcheck, käytä valitsinta --tool=<työkalu>.
Valittavana on seuraavat työkalut:
- memcheck, erinomainen työkalu muistinhallinnan virheiden löytämiseen.
- cachegrind, työkalu, joka kertoo kuinka hyvin ohjelmasi hyödyntää prosessorivälimuistia.
- callgrind, työkalu, joka antaa kehittäjälle olennaista tietoa ohjelman eri osien käyttämistä prosessoriresursseista .
- massif, työkalu ohjelman dynaamisesti varattavan muistin käytön profilointiin.
- helgrind, synkronointivirheiden etsimiseen POSIX-säikeitä käyttävistä ohjelmista.
Tulosteen tulkinta[muokkaa]
Valgrindin tulostamien rivien alussaoleva ==PID== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää.
tool=memcheck[muokkaa]
==12799== Invalid read of size 4
Edellinen merkintä kertoo, että muistista on luettu alue standardikirjastolta varattujen muistialueiden ulkopuolelta. "of size 4" kertoo tässä, että luvun koko on neljän tavun eli 32 bitin kokoinen. Tämä on ehdottomasti virhe, tarkista esimerkiksi taulukoiden indeksoinnit. Merkinnän jälkeen tulostuu kutsupino, joka kertoo, missä virhe tapahtuu. Esimerkiksi:
==12393== at 0x80483FA: main (testi.c:7)
kertoo, että virhe tapahtuu suoritettavan ohjelman kohdassa 0x80483FA, funktiossa main(), lähdekooditiedostossa testi.c ja rivillä 7.
==16340== Address 0x416702D is 1 bytes after a block of size 4 alloc'd
Kertoo luetun muistiosoitteen ja hyödyllistä tietoa sen sijainnista suhteessa varattuun muistiin.
==17298== Invalid write of size 1
Merkintä kertoo, että muistiin on kirjoitettu alue varattujen muistialueiden ulkopuolelta. Tulkinta on lähes täysin vastaava edelliseen nähden.
==18096== Conditional jump or move depends on uninitialised value(s)
Tämä virhe syntyy, kun koodissa on käytetty if-, for- tai while-ohjauslausekkeiden ehtona muuttujaa, jonka muistialue on alustamaton tai jonka muistialueen sisältö ei ole määräytynyt täsmällisesti ohjelman ajon aikana.
Tässä vikana voi olla esimerkiksi unohtunut = NULL -sijoitus olemattomalle oliolle, kun olion ja NULL:n vertailua käytetään ehtona olion käsittelylle. Kannattaa kuitenkin välttää logiikkavirheiden peittämistä mielivaltaisella alustamisella!
Yhteenveto ohjelman muistinkäytöstä[muokkaa]
==8843== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 7 from 1) ==8843== malloc/free: in use at exit: 4 bytes in 1 blocks. ==8843== malloc/free: 1 allocs, 0 frees, 4 bytes allocated. ==8843== For counts of detected errors, rerun with: -v ==8843== searching for pointers to 1 not-freed blocks. ==8843== checked 53,100 bytes.
Käyttämällä valitsinta --leak-check=full saadaan tietoa menetetystä muistista:
==8843== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==8843== at 0x4021628: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==8843== by 0x80483F1: main (testi.c:7)
Tämä kertoo, että kadotettu 4 tavun kokoinen 1 muistialue (block) varattiin käyttöön testi.c:n rivillä 7. Monimutkaisemmissa tilanteissa tulostuu koko kutsupino, joka aiheutti muistinvaraamisen. Se on kuitenkin tulkittavissa, kuten aiemmin esitettiin.
==8843== LEAK SUMMARY: ==8843== definitely lost: 4 bytes in 1 blocks. ==8843== possibly lost: 0 bytes in 0 blocks. ==8843== still reachable: 0 bytes in 0 blocks. ==8843== suppressed: 0 bytes in 0 blocks. ==8843== Reachable blocks (those to which a pointer was found) are not shown. ==8843== To see them, rerun with: --show-reachable=yes
Tämä kertoo yhteenvedon hukatusta muistista - hyvässä C-kielisessä ohjelmassa tyypillisesti kaikki luvut tässä ovat nollia.
"definitely lost" kertoo, että muistialueen käsittely voidaan varmasti tulkita muistivuodoksi.
"possibly lost" kertoo, että muistialueen käsittely voidaan luultavasti tulkita muistivuodoksi.
"still reachable" kertoo, että varattuun muistialueeseen on säilytetty viittaus ohjelman loppuun asti, mutta sitä ei vapauteta ennen ohjelma päättymistä. Tunnetusti C++:n standardikirjastojen templaattisäilöt eivät vapauta muistia välttämättä käskettäessäkään, vaan säilyttävät varauksen, jotta alue voitaisiin ottaa tarvittaessa uudelleen käyttöön. Tästä ei siis tarvitse välttämättä C++-ohjelmissa huolestua.
Vaihtoehtoiset käyttöliittymät[muokkaa]
Aiheesta muualla[muokkaa]
- Valgrind - muistidebuggeri -opas [vanhentunut linkki]