[Powered by Google Translate] [Valgrind] [Nate Hardison, Harvard University] See on CS50, CS50.TV] Mõned kõige raskem vigu C programmide pärit halba mälu. Seal on tohutu hulk võimalusi, kuidas keerata asju, sealhulgas eraldades vale mälu, unustades initsialiseerida muutujad, kirjalikult enne või pärast selle lõppu puhver, ja vabastades hoida mälu mitu korda. Sümptomid ulatuvad vahelduva jookseb kuni müstiliselt kirjutatakse väärtused, sageli aset kohtades ja aegadel kaugel originaal viga. Tracing vaadeldav probleemi Tagasi aluseks oleva algpõhjus saab vaidlustada, kuid õnneks on kasulik programm nimega Valgrind et saab teha palju aidata. Sa jooksed programmi raames Valgrind võimaldada ulatuslik kontrollimine hunnik mälu eraldised ja juurdepääsud. Kui Valgrind tuvastab probleemi, see annab teile kohe, otsest teavet, mis võimaldab teil kergemini leida ja probleemi lahendada. Valgrind ka aruandeid vähem surmav mälu probleemid, nagu mälu lekib, eraldades hunnik mälu, , unustades, et vabastada ta. Nagu meie kompilaator, rõkkama, meie siluri GDB, Valgrind on vaba tarkvara, ja see on paigaldatud seade. Valgrind töötab oma binaarsel, ei oma. c või. h lähtekoodi failid, et olla kindel olete koostanud up-to-date koopia oma programmi kasutades rõkkama või teha. Siis töötab oma programmi alusel Valgrind saab nii lihtne, et prefixing standard programmi käsu sõna Valgrind, mis käivitub Valgrind ja käivitab programmi sees on. Kui alustada, Valgrind ei teatud keerulised jiggering seadistada käivitatava mälu kontrolli, nii et see võib võtta natuke, et saada valmis ja töötab. Programm siis täita tavaliselt, olgu see palju aeglasemalt, ja kui ta lõpetab, Valgrind prinditakse kokkuvõte selle mälukasutust. Kui kõik hästi läheb, siis näeb välja umbes selline: Sel juhul. / Clean_program on tee programmi ma tahan joosta. Ja kuigi see ei võta mingeid argumente, kui ta tegi ma lihtsalt kinnitada neid edasi käsu lõppu nagu tavaliselt. Clean programm on lihtsalt rumal väike programm lõin et eraldab ruumi ploki ints kohta hunnik, panna mõned väärtused sees neist, ja vabastab kogu blokeerida. See on see, mida sa pildistada, vigu ja lekked. Teine oluline mõõdik on baitide eraldatud. Sõltuvalt programmist, kui teie eraldised on megabaiti või suurem, oled ilmselt midagi valesti. Kas sa asjatult ladustamiseks duplikaate? Kas kasutate hunnik ladustamise, millal oleks parem kasutada korstnat? Niisiis, mälu vead võivad olla tõeliselt paha. Rohkem väljendunud need põhjustada tähelepanuväärne jookseb, kuid isegi siis võib veel olla raske avastada mida täpselt viinud krahhi. Rohkem salakavalasti, programmi mälu viga saab ikka koostada puhtalt ja saab veel tundub, et töö korrektselt sest sa suutsid saada õnnelik enamiku ajast. Pärast mitu "edukaid tulemusi," võid lihtsalt arvan, et crash on juhus arvuti, kuid arvuti ei ole kunagi vale. Running Valgrind aitab teil tabada põhjus nähtav mälu vead samuti leida peituvad vead sa isegi ei tea veel umbes. Iga kord Valgrind tuvastab probleemi, see prindib info selle kohta, mida järgida. Iga kirje on üsna napisõnaline - allikas liin rikkuva juhendamine, mis on küsimus, ja vähe infot mälu seotud - kuid sageli on see piisavalt teavet, et suunata oma tähelepanu õigesse kohta. Siin on näide Valgrind töötab lollakas programmi mis teeb vale loetud hunnik mälu. Me ei näe vigu või hoiatusi koostamine. Uh-oh, viga kokkuvõte ütleb, et on kaks viga - kaks vale loetud suurus 4 - bytes, et on. Nii halb loeb toimus põhiülesanne invalid_read.c, esimene real 16 ja teine ​​rida 19. Vaatame kood. Paistab esimese osamakse printf üritab lugeda ühe int juba lõppenud meie mälu plokk. Kui me vaatame tagasi Valgrind toodanguna, näeme, et Valgrind rääkis meile just nii. Aadress me üritame lugeda algab 0 baiti Viimase aasta lõpuni ploki suurus 16 baiti - 4 32-bit ints et me eraldatud. See tähendab, aadress püüdsime lugeda algab just lõpus meie blokaad, nagu me näeme meie halb printf kõne. Nüüd kehtetu loetud pruugi tunduda, et suur ja lahendamiseks, aga kui sa kasutad neid andmeid kontrollida voolu oma programmi - näiteks osana, kui avaldus või loop - siis asju saab vaikselt lähe halvaks. Vaata, kuidas ma saan käivitada invalid_read programmi ja midagi ebatavalist juhtub. Hirmutav, ah? Nüüd vaatame mõned rohkem erinevaid vigu, mis võivad tekkida oma koodi, ja me näeme, kuidas Valgrind avastab neid. Me lihtsalt nägime näiteks invalid_read, nii et nüüd lähme tutvu invalid_write. Jällegi, vigu või hoiatusi koostamine. Okei, Valgrind sõnul on kaks viga selles programmis - ja invalid_write ja invalid_read. Olgem tsekkata seda koodi. Paistab, meil näiteks klassikaline strlen pluss üks viga. Kood ei malloc pildi baidi ruumi jaoks / 0 iseloomu, nii et kui str koopia läks seda kirjutada aadressil ssubstrlen "cs50 rocks!" see kirjutas 1 bait juba lõppenud meie blokeerida. Invalid_read tuleb siis, kui me teeme oma üleskutset printf. Printf jõuab lugemine vigane mälu, kui ta loeb / 0 iseloom kui tundub lõpus selle E string on see trükkimiseks. Aga see kõik ei pääsenud Valgrind. Me näeme, et see on püütud invalid_write osana tn koopia on line 11 peamist ja invalid_read on osa printf. Rock, Valgrind. Jällegi, see ei pruugi tunduda suur asi. Me võime käivitada programm ikka ja väljaspool Valgrind ja ei näe mingit viga sümptomid. Kuid vaatame veidi erinevad käesoleva näha kuidas asjad saavad tõesti halb. Niisiis, antud, oleme kuritarvitanud asju rohkem kui lihtsalt natuke seda koodi. Me ainult eraldades ruumi hunnik kaks stringid pikkus cs50 kivid, Sel ajal, meenutades / 0 iseloomu. Aga siis me visata super-pikk string mälu plokk et S osutab. Kuidas mõjutab see olla mälu plokk, mis T punkte? Noh, kui T osutab mälu, et on lihtsalt kõrval S, tulevad just pärast seda, siis oleks võinud kirjutada ka osa T. Olgem käivitada selle koodi. Vaadake, mis juhtus. Stringid me hoida meie hunnik plokke nii paistis olevat trükitud õigesti. Miski tundub vale üldse. Kuid lähme tagasi meie koodi ja kommenteeri välja rida, kus me kopeerida cs50 kivid arvesse teise mälu plokk, osutas t. Nüüd, kui me teeme selle koodi peaksime ainult näha sisu Esimest mälu plokk välja printida. Vau, kuigi me ei tn koopia ühtegi märki arvesse teises hunnik plokk, üks viitas T, saame välja printida. Tõepoolest, string me topitakse meie esimene plokk overran esimene plokk ja sisse teise ploki, teha kõike tundu normaalne. Valgrind, aga ütleb meile tõestisündinud lugu. Nii juba läheb. Kõik need kehtetuks loeb ja kirjutab. Vaatame näiteks teist tüüpi viga. Siin me midagi üsna kahetsusväärne. Me haarata ruumi int kohta hunnik, ja me initsialiseerida int pointer - p - käsk, et ruumi. Kuigi meie osuti käivitub, andmeid, et see osutab vaid on mis iganes rämps on selles osas hunnik. Nii et kui me koormus, et andmed int i, me tehniliselt initsialiseerida i, kuid me teeme seda junk andmeid. Kõne väita, mis on mugav silumine makro määratletud tabavalt nimeks väita raamatukogu, katkestab programmi kui selle katsetingimustes ebaõnnestub. See tähendab, et kui ma ei ole 0. Sõltuvalt sellest, mida oli hunnik ruumi, osutas p, see programm võib töötada mõnikord ja ei suuda muul ajal. Kui see töötab, me lihtsalt saada õnnelik. Kompilaator ei saagi seda viga, kuid Valgrind kindel tahe. Seal näeme viga tuleneb meie kasutamisest, et junk andmeid. Kui eraldada hunnik mälu, kuid ei deallocate see või tasuta see, mida nimetatakse leke. Väikese, lühiajaline programm, mis töötab ja kohe väljapääsu, lekked on üsna valutu, kuid projekti jaoks suurematele ja / või pikaealisust, isegi väike leke võib ühend millekski suureks. Sest CS50, me ootame teid hoolitseda vabastades kõik hunnik mälu, mida eraldavad, kuna me tahame teid ehitada oskusi nõuetekohaselt käitlema käsitsi protsessi nõutud C. Selleks, teie programm peaks olema täpne üks-ühele kirjavahetus malloc ja tasuta kõned. Õnneks Valgrind aitab teil mälu lekkeid ka. Siin on lekkiv programmi nimega leak.c et eraldab ruumi hunnik, kirjutab ta, kuid ei vabasta see. Me kompileerida Mark ja kasutada seda vastavalt Valgrind, ja me näeme, et kuigi meil ei ole mälu vead, meil on üks lekkida. Seal on 16 baiti lõplikult kaotanud, mis tähendab, et kursor, et mälu ei ole ulatuselt kui programm sulgub. Nüüd Valgrind ei anna meile ton teavet leke, aga kui me järgime seda vähe tähele, et see annab alla põhja poole oma aruande kuni uuesti, koos - leke kontrollige = täis näha kõiki üksikasju lekkinud mälu, me saada rohkem informatsiooni. Nüüd, hunnik kokkuvõte, Valgrind ütleb meile, kus mälu, mis oli kadunud oli algselt eraldatud. Nii nagu me teame, vaadates lähtekoodi, Valgrind teatab meile, et me lekkinud mälu eraldamisel kõne malloc real 8 leak.c aastal põhiülesanne. Päris vahva. Valgrind kategoriseerib lekkeid kasutades neid termineid: Kindlasti kadunud - see on hunnik eraldatud mälu mille programm ei ole enam osuti. Valgrind teab, et sa kord oli osuti kuid on nüüdseks kaotanud jälgida seda. See mälu on kindlasti lekkinud. Kaudselt kadunud - see on hunnik eraldatud mälu mille ainus vihjeid Samuti on kadunud. Näiteks, kui olete kaotanud oma kursor esimese sõlme seotud nimekirja, siis esimese sõlme ise oleks kindlasti kaotanud, samas hilisemad sõlmed oleks kaudselt kadunud. Võimalik kadunud - see on hunnik eraldatud mälu mille Valgrind ei saa olla kindel, kas seal on viit või mitte. Ikka kättesaadav on hunnik eraldatud mälu mille programm on veel pointer exit mis tavaliselt tähendab, et globaalne muutuja osutab ta. Et näha neid lekkeid, siis on teil ka lisada võimalus - Endiselt kättesaadav = jah Teie appihüüde Valgrind. Need erinevad juhtumid võivad vajada erinevaid strateegiaid nende puhastamiseks üles kuid lekked tuleb kõrvaldada. Kahjuks millega lekked võivad olla raske teha, kuna ebaõige kõned tasuta saate õhkima oma programmi. Näiteks kui me vaatame invalid_free.c, näeme näiteks halb mälu deallocation. Milline peaks olema üks kõne, et vabastada kogu ploki mälu poolt esile tõstetud int_block, on selle asemel saanud katse vabastada iga int suurusega osa on mälu individuaalselt. See ei katastroofiliselt. Boom! Mis viga. See ei ole kindlasti hea. Kui sa oled ummikus selline viga, küll, ja sa ei tea, kust otsida, toetuda oma uue parima sõbra. Sa arvasid - Valgrind. Valgrind, nagu alati, teab täpselt, mis värk on. Alloc ja vaba arvud ei kattu üles. Meil 1 alloc ja 4 vabastab. Ja Valgrind ka ütleb meile, kus esimene halb tasuta kõne - üks, mis vallandas Plahvatus - on pärit - rida 16. Nagu näete, halb kõned tasuta on tõesti halb, nii et soovitame lasta oma programmi leke kui oled tööd saada funktsionaalsus õige. Start otsin lekkeid alles pärast teie programm töötab korralikult, ilma muid vigu. Ja ongi kõik meil selle video. Nüüd mida sa ootad? Mine jooksma Valgrind oma programme just nüüd. Minu nimi on Nate Hardison. See on CS50. [CS50.TV]