Valgrind - open-source memory debugger za x86-GNU/Linux

Valgrind - open-source memory debugger za x86-GNU/Linux

offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23211
  • Gde živiš: Niš

Valgrind je opensource program koji nadgleda rad željenog programa i prijavljuje nepravilnosti u radu programa sa memorijom.

Valgrind je od velike pomoći programerima koji razvijaju softver pod Linux-om jer automatski otkriva sledeće:

- pisanje ili čitanje izvan rezervisanog prostora neke promenljive (tu spada i buffer overflow, tj. prelivanje bafera)
- alociranje memorije za isti pokazivač (pointer) više puta (čime prethodno rezervisani prostor zauvek ostaje zauzet, tzv. memory leak)
- neoslobađanje dinamičke memorije u bloku u kome važi pokazivač na tu memoriju (što takođe dovodi do toga da memorija ostaje zauvek alocirana, jer ne postoji pokazivač (na nju) preko koga bi se memorija oslobodila)
- oslobađanje već oslobođene memorije (što uglavnom dovodi do pucanja programa)
- oslobađanje memorije, koja je alocirana sa new, funkcijom free(), kao i oslobađanje memorije, koja je alocirana funkcijom malloc, operatorom delete.
- pisanje i čitanje po memoriji koja je oslobođena
- čitanje memorije koja nije inicializovana (što dovodi do nepredviđenog ponašanja programa, jer program čita podatke koji su tu slučajno, i na osnovu njih preduzima dalje akcije)
- čitanje i pisanje po nepristupačnoj memoriji (na primer po memoriji koja ne pripada datom programu)
- pisanje po statičkoj memoriji, kao i oslobađanje statičke memorije (koja inače ne može ni da se menja a ni da se oslobodi, jer je statička)
- prosleđivanje pokazivača, na neispravnu memoriju, sistemskim funkcijama (na primer prosleđivanje adrese statičke memorije funkciji koja treba da piše po njoj)
- nepravilno korišćenje POSIX pthreads API-ja Smile

Dakle, valgrind detektuje apsolutno sve greške koje mogu da postoje u radu sa memorijom, a koje programeri mogu da naprave.

Program radi isključivo sa Linux izvršnim fajlovima, što znači da je nemoguće koristiti ga na nekom drugom operativnom sistemu. Valgrind-u nije potreban sors programa koji "ispituje", on jednostavno ispituje izvršni program, transparentno i paralelno, pa tako greške prijavljuje dok je program (koji se ispituje) u run-time modu.
Program (koga valgrind ispituje) ne mora da bude iskompajliran sa debug informacijama, mada ja ipak preporučujem da dodate -g pri kompajliranju jer tako dobijate i tačnu liniju u sors-u u kome se nalazi greška. U suprotnom ćete dobiti samo ime funkcije sa greškom.

Valgrind otkriva samo greške koje se dogode dok program (koji se ispituje) radi, pa je tako moguće da neke greške ne isplivaju odmah na površinu, jer generalno gledano nije došlo do tih grešaka za vreme “pregleda” programa. Zbog toga je preporučljivo svu funkcionalnost programa isprobati za vreme “pregleda”, kako bi sve moguće situacije proverili.

Valgrind daje i spisak funkcija koje su prethodile funkciji u kojoj je greška, pa tako možete da vidite šta je sve prethodilo grešci, tj. odakle je funkcija pozvana. Po default-u program daje spisak 5 funkcija koje su prethodile, ali se ovaj broj može i promeniti, ukoliko želite malo dublje da odete, da vidite iz koje funkcije je sve krenulo.

Ukoliko primeti nepropisno korišćenje alocirane memorije, Valgrind daje i liniju u sorsu u kojoj je alocirana data memorija, kako bi korisnik brže saznao o kojoj promenljivoj je reč.

Valgrind je inače napravljen iz više modula. Najbitniji modul je “memcheck”, koga i opisujemo u ovom članku, ali postoje i drugi moduli, kao što su cache-miss profiler i data-race detector (za pthreads). Module može svako da napiše uz malo truda, tako da je Valgrind potpuno otvoren za nove ideje.

Pošto Valgrind prijavljuje i greške u bibliotekama koje program linkuje, postoji i mogućnost da određene biblioteke i/ili samo određene funkcije iz neke biblioteke stavite u filter, kako bi ih Valgrind ignorisao. Ovo je korisno ako te greške ne želite da gledate jer ne možete da ih ispravite, pa ih jednostavno možete eliminisati i Valgrind ih neće prijavljivati.

U praksi se program pokazao odlično. Meni lično se desilo (dan pre nego što sam čuo za Valgrind) da ceo dan zurim u svoj ogroman sors, tražeći prelivanje bafera, jer je program pucao na banalnim mestima, što je bio siguran znak da negde pišem izvan nekog bafera i tako "gazim" svoj program. Kada sam čuo za Valgrind, skinuo sam ga, iskompajlirao, pokrenuo svoj program sa njim, i Valgrind mi je, gotovo odmah, rekao gde "gazim" memoriju Smile

Od tada ga često koristim, čisto kao proveru mog sorsa, da 100% budem siguran da “ulje negde ne curi”.

Posle oduševljenja, zaprepastio sam se kada sam video koliko ima nepropisnog rukovanja memorijom u bibliotekama koje koristim, a koje važe za najstabilnije biblioteke. Na sreću, greške su uglavnom kod čitanja neinicijalizovane memorije, što nije mnogo strašno (mada može da predstavlja problem u nekim specijalnim situacijama).

Ovaj program bi zaista trebali svi programeri da koriste, jer se uvek, u moru programskog koda, podkradne neka greška, ma koliko programer pazio i ma koliko bio ubeđen da nigde ne greši.
Kada bi svi programeri koristili programe kakav je Valgrind – padanje programa bi bila prošlost!

HomePage Valgrind-a : http://valgrind.org/

Autor članka : Predrag Damnjanović



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 1035 korisnika na forumu :: 51 registrovanih, 4 sakrivenih i 980 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aleksandarbl, babaroga, bigfoot, BlekMen, Bobrock1, bokisha253, BRATORIII, cenejac111, CikaKURE, darkangel, doom83, dragoljub11987, drimer, FOX, goxin, HogarStrashni, ikan, ILGromovnik, Insan, JOntra, Karla, Kibice, kikisp, kjkszpj, kokodakalo, Krvava Devetka, Kubovac, Lucije Kvint, Marko Marković, mercedesamg, Mi lao shu, milenko crazy north, Ne doznajem se u oružje, nemkea71, NoOneEver Dreams, ObelixSRB, operniki, Parker, pavlo, rasok, Ripanjac, RJ, Rogan33, sasa87, Sirius, slonic_tonic, Srle993, stegonosa, suton, YugoSlav