Valgrind | |
---|---|
Tyyppi | Profiler , muistinkäytön debuggeri |
Tekijä | Seward, Julian [1] |
Kehittäjä | Valgrind kehittäjät |
Sisään kirjoitettu | C [3] |
Käyttöjärjestelmä | Linux , Mac OS X , Android [2] |
uusin versio | 3.19.0 ( 11. huhtikuuta 2022 ) |
Lisenssi | GNU yleinen julkinen lisenssi |
Verkkosivusto | valgrind.org |
Valgrind on työkalu muistin käytön virheenkorjaukseen , muistivuotojen havaitsemiseen ja profilointiin . Nimi valgrind on peräisin norjalaisesta mytologiasta , jossa se on Valhallan pääsisäänkäynnin nimi [4] .
Valgrind luotiin alun perin ilmaisena työkaluna muistinkäytön virheenkorjaukseen x86 Linux -käyttöjärjestelmässä , mutta siitä on kehittynyt yleinen kehys työkalujen rakentamiseen dynaamisen muistin käytön analysointiin, säikeiden turvallisuustestaukseen ja profilointiin. Käytetään monissa Linux-pohjaisissa projekteissa [5] . Versiosta 3.5 lähtien Valgrind toimii myös Mac OS X :ssä.
Valgrindin alkuperäinen kirjoittaja oli Julian Seward , joka voitti toisen Google - O'Reilly Open Source -palkinnon vuonna 2006 työstään Valgrind [6] [7] . Lukuisat muut tekivät myös merkittävän panoksen, mukaan lukien Cherion Armor-Brown, Jeremy Fitzhardin, Tom Hughes, Nicholas Nethercoat, Paul Mackerras, Dirk Muller, Bart Van Assch, Joseph Weidendorfer ja Robert Walsh [8] .
Valgrind on ilmainen ohjelmisto , jolla on GPL -lisenssi .
Valgrind on pohjimmiltaan virtuaalikone, joka käyttää JIT - kääntämismenetelmiä, joihin kuuluu dynaaminen uudelleenkääntäminen . Toisin sanoen alkuperäistä ohjelmaa ei suoriteta suoraan pääprosessorissa . Sen sijaan Valgrind ensin kääntää ohjelman väliaikaiseen, yksinkertaisempaan muotoon nimeltä Intermediate Representation (IR), joka itse on prosessorista riippumaton ja SSA - muodossa. Kun työkalu (katso alla) on muunnettu, se voi suorittaa minkä tahansa tarvittavan IR-muunnoksen, ennen kuin Valgrind kääntää IR:n takaisin konekoodiksi ja antaa pääprosessorin suorittaa sen. Sitä käytetään, vaikka tähän voidaan käyttää dynaamista käännöstä (eli kun pää- ja kohdeprosessorit kuuluvat eri arkkitehtuureihin). Valgrind kääntää binaarin uudelleen toimimaan saman arkkitehtuurin pää- ja kohdeprosessoreissa (tai sen simulaattorissa).
Näiden muunnosten ansiosta suorituskyky heikkenee merkittävästi: yleensä Valgrindin alla ajettava koodi ja "tyhjä" (ei tee mitään) työkalu toimii 5-10 kertaa hitaammin kuin koodin suorittaminen suoraan; ja joillakin työkaluilla jopa 100 kertaa hitaampi [9] . IR-muoto on kuitenkin paljon instrumentointiystävällisempi kuin alkuperäinen, ja se yksinkertaistaa huomattavasti instrumentoinnin kirjoittamista, ja useimmissa projekteissa suorituskyvyn heikkeneminen virheenkorjauksen aikana ei ole merkittävä ongelma.
Valgrind-paketti sisältää monia työkaluja (jotkin lisätyökalut eivät sisälly). Oletustyökalu (ja eniten käytetty) on Memcheck . Melkein kaikkiin käskyihin Memcheck lisää instrumentointikoodia , joka seuraa laillisuutta (kaikki allokoimaton muisti merkitään alun perin virheelliseksi tai "määrittämättömäksi", kunnes se alustetaan johonkin määritellyistä tiloista, luultavasti toisesta muistista) ja osoitettavuutta (riippumatta siitä, onko muisti on määrätyn osoitteen allokoinnin alainen, eli onko se tyhjä) muistioperaatioista, jotka on tallennettu ns. V-bitteihin ja vastaavasti A-bitteihin . Kun dataa siirretään ja manipuloidaan, instrumentointikoodi pitää kirjaa A- ja V-bittien arvoista, jotta ne ovat aina oikein yksibittisellä tasolla.
Lisäksi Memcheck korvaa standardin C - muistin allokoinnin omalla toteutuksellaan, joka sisältää muun muassa muistisuojat kaikkien allokoitujen lohkojen ympärillä (joissa A-bitit on merkitty "invalidiksi"). Tämän ominaisuuden avulla Memcheck voi havaita puskurin ylivuodot , joissa ohjelma lukee tai kirjoittaa muistia varatun lohkon ulkopuolella (vähän ylivuodolla). (Toinen tapa ratkaista tämä ongelma on toteuttaa rajaosoittimia kääntäjässä, mikä vähentää havaitsemattomien virheiden mahdollisuutta jonkin verran, erityisesti pinovaratussa muistissa mieluummin kuin pinossa varatussa muistissa, mutta se vaatii kaiken instrumentoidun binaarin uudelleenkääntämistä .) Ongelmat, jotka voivat havaitse Memcheck sisältää:
Tämän hinta on suorituskyvyn menetys. Memcheckillä ajettavat ohjelmat toimivat yleensä 5-12 kertaa hitaammin kuin ilman Valgrindia, ja ne käyttävät myös enemmän muistia (johtuen huomattavan ylimääräisen muistin varaamisesta). Siksi koodia ajetaan harvoin jatkuvasti Memcheck / Valgrind alla. Yleisin tilanne on, kun he joko jäljittävät jonkin tietyn virheen tai tarkistavat, ettei koodissa ole tietyntyyppisiä piilovirheitä.
Memcheckin lisäksi Valgrindilla on myös muita työkaluja.
Version 3.4.0 dokumentaation mukaan Valgrind tukee Linuxia x86- , x86-64- ja PowerPC - arkkitehtuureille . Mac OS X :n tuki lisättiin versioon 3.5.0 [11] . Muihin UNIX-tyyppisiin alustoihin (kuten FreeBSD [12] , NetBSD [13] ja QNX [14] ) on epävirallisia portteja .
Suorituskykyrajoituksen lisäksi Memcheckin merkittävä rajoitus on sen kyvyttömyys havaita rajavirheitä käytettäessä staattista tai pinottua dataa [15] . Seuraava koodi läpäisee Memcheckin ilman varoituksia ilmoitetuista virheistä huolimatta:
int Staattinen [ 5 ]; int func ( tyhjä ) { int Pino [ 5 ]; Staattinen [ 5 ] = 0 ; /* Virhe - vain Static[0] on olemassa ennen Static[4], Static[5] on taulukon ulkopuolella */ Pino [ 5 ] = 0 ; /* Virhe - vain pino[0] on olemassa ennen pinoa[4], pino[5] on matriisin ulkopuolella */ paluu 0 ; }Tarve havaita tämäntyyppisiä virheitä on erityisen tärkeä tiettyjen pinonkäsittelyvirheiden vuoksi, mikä tekee ohjelmistosta haavoittuvan klassiselle pinon katkaisulle .
Valgrindin kokeellinen SGCheck- apuohjelma pystyy kuitenkin havaitsemaan tällaiset virheet.
Profiloijat | |
---|---|
|