[Powered by Google Translate] [Valgrind] [Nate Hardison, Harvard Unibertsitatea] Hau CS50 da, CS50.TV] C programak bugs zailenetako batzuk memoria mismanagement etorriko da. Badira moduak gauzak hondatzeko sortu kopuru handi bat, memoria okerreko zenbatekoa esleitzean barne, aldagaiak hasieratu ahaztu, buffer baten amaieran edo aurretik eta ondoren idatziz, eta mantendu memoria hainbat aldiz uzten. Sintomak kraskatzen aldizkako bitartekoa misterioz gainidatzi balioak, askotan, leku eta orain arte jatorrizko errorea kendu aldiz. Ikusitako arazoa Bektorizatu itzuli azpiko root kausa erronka daiteke, baina zorionez, ez deitu Valgrind lagungarria programa bat da asko egin dezake laguntzeko. Valgrind pean programa exekutatu nahiko duzu gaitzeko zabala zeure memoria zuzkiduretan eta sarbideak egiaztatzea. Valgrind arazoren bat detektatzen, ematen du berehalako zuzeneko informazioa ematen dizu, erraz aurkitu eta arazoa konpondu. Valgrind ere, memoria gutxiago hilgarria gaiei buruzko txostenak, hala nola, memoria filtrazioen, zeure memoria esleitzean, eta askatzea ahaztu. Atsegin dut gure konpiladorea, Clang, gure arazketan, GDB, Valgrind software librea da, eta tresnaren instalatu da. Bitarrak exekutagarri on Valgrind bidez, ez. c edo h iturburu-kodea fitxategiak, beraz, ziurtatu konpilatu duzula zure programaren kopia up-to-data Clang erabiliz edo egin. Ondoren, programa exekutatzen Valgrind pean izan daiteke hitza Valgrind programa komando estandarrak aurretik bezain erraza, Valgrind martxan eta programa exekutatzen barruan. Hasita, Valgrind du konplexu batzuk exekutagarriaren memoria egiaztapen konfiguratzeko jiggering beraz, pixka bat hartu ahal izango du, jaiki eta martxan. Orduan programa exekutatu normalean, askoz ere, poliki-poliki, eta noiz bukatzen da, bere memoriaren erabilpena Valgrind laburpen bat inprimatuko ditu. Dena ondo badoa bada, zerbait itxura izango dute: Kasu honetan,. / Clean_program programa exekutatu nahi dut bidea. Eta hau ez du argumenturik hartzen, egin bada Tack ohikoa den bezala komando amaieran nuke. Clean programa programa txiki bat besterik ez silly I sortu da ints bloke bat espazio esleitzen zeure gainean, jarri balio batzuk horien barruan,, eta blokea osoa askatzen. Hau da, ez akatsak eta ihesak ez zaren tiro. Metriko Another garrantzitsua bytes esleitutako kopuru osoa da. Programaren arabera, zure zuzkiduretan megabyte edo handiagoa bada, ziurrenik, zerbait gaizki egiten ari zaren. Dira bikoiztuak alferrik gordetzeko? Erabiltzen ari zeure duzun biltegiratze, hobeto egongo litzateke pila erabili? Beraz, memoria akatsak benetan gaiztoak izan daitezke. Ageriko dira gehiago eragiten ikusgarria kraskatzen, baina gero, oraindik ere zaila apuntatzeko daiteke zer Kraskadurari ekarri zuen. Gehiago insidiously, memoria errore bat programa bat oraindik konpilatu garbian eta oraindik dirudi behar bezala lan egiteko kudeatzen zortea denbora gehiena iritsi delako. Batzuk igaro ondoren "arrakasta emaitza" kraskadura baten ordenagailua Fluke bat da besterik ez pentsatzea, baina ordenagailua ez da inoiz okerra da. Valgrind carrera behera jarraipena memoria ikusgai akatsak kausa baita aurkitu akatsak lurking ez duzu, nahiz eta oraindik ezagutzen. Denbora bakoitzak Valgrind arazoren bat detektatzen, zer behatu buruzko informazioa bistaratzen du. Elementu bakoitzak nahiko laburtuta iturburua konpondu instrukzio-line, zer gai da, eta parte hartzen duten memoria buruzko informazio pixka bat baina askotan informazio nahikoa da zure arreta leku egokian zuzentzeko. Hona hemen, buggy programa exekutatzen Valgrind adibide bat da zeure memoria irakurri baliogabe bat du. Akatsik ez edo abisu konpilazio ikusten dugu. Uh oh, error laburpena dio bi akatsak daudela - baliogabea tamaina 4 bi Irakurketa byte, hau da. Txarra Bi irakurtzen invalid_read.c funtzio nagusia gertatu zen, lehen on line 16 eta 19 on line bigarrena. Dezagun begiratu kodea. Lehenengo deialdian printf saiatzen int bat irakurri gure memoria bloke amaieran, azken Looks like. Dugu atzera Valgrind irteera, Valgrind zigun zehazki dela ikusiko dugu. Helbide irakurri saiatzen ari gara hasten 0 byte tamaina 16 bytes bloke amaieran, azken 32-bit lau ints esleituko dugu. Hau da, helbidea irakurri saiatzen ziren dugu, gure bloke amaieran hasiko da, gure printf txarra dei bezala ikusten dugu. Orain, Irakurketa baliogabea aurre big horrela agian ez dirudi, baina ari zaren datu horiek erabiliz gero, programaren fluxua kontrolatzeko adibidez, baten zati gisa deklarazioa edo begizta - ondoren, gauzak isilean joan txarra. Watch nola invalid_read programa exekutatu ahal izango dut eta ez da ezer gertatzen da ohiko. Scary, eh? Orain, akatsak gehiago mota baliteke zure kodea topo begiratu, eta ikusi nola Valgrind detektatzen dugu. Ikusi besterik ez dugu invalid_read baten adibide bat, beraz, gaur egun utzi check out invalid_write bat. Berriz ere, akatsik ez edo abisu konpilazio. Ados, Valgrind dio ez direla bi programa honetan akatsik eta invalid_write eta invalid_read bat. Dezagun check out kode hau. Looks ditugu got bezala strlen klasiko gehi bat bug instantzia bat. Kodea ez malloc byte espazioa extra / 0 pertsonaia, beraz, kopia str joan idazteko ssubstrlen "cs50 rocks!" 1 byte idatzi gure bloke amaieran iragana. Invalid_read dator gure dei egiten dugu printf. Printf eta ondorioz baliogabe memoria irakurtzen / 0 karakterea irakurtzen , E kate honen amaieran itxura inprimatzeko. Baina hau ez Valgrind ihes egin. Harrapatu duela invalid_write str kopia zati gisa ikusten dugu line 11 nagusia, eta invalid_read printf zati da. Rock, Valgrind. Berriz ere, hori ez aurre handi bat bezala dirudi. Programa hau exekutatu ahal izango dugu, eta gehiago baino gehiagoko Valgrind kanpo eta ez ikus edozein errore sintomak. Hala eta guztiz ere, utzi hau apur aldakuntza begiratu ikusi gauzak nola oso txarra lor daiteke. Beraz, eman, gauzak ari gara abusing bakarrik kode hau pixka bat baino gehiago. Bakarrik ari gara espazio esleitzean zeure gainean bi kateak cs50 arroka luzera, Une honetan, pertsonaia / 0 gogoratzeko. Baina orduan bota super-kate luzea dugu memoriarekin blokea S da seinalatuz. Zer eragina duten memoria blokea T puntu hori? Beno, T memoria puntu besterik S aldameneko bada, ondoren, hurrengo ondoren, T. zati baino gehiago dugu agian idatzi Dezagun kode hau exekutatu. Gertatutakoa behatu. Kateak gordetzen dugu gure zeure bi blokeetan agertu inprimatutako ondo. Ezer ez dirudi oker guztiak. Hala eta guztiz ere, goazen atzera gure kodea sartu eta komentatu line non cs50 arroka kopiatu dugu memoria bigarren bloke batean, t adierazi. Orain, kode hau exekutatzen dugu egin beharko lukete bakarrik ikus memoria lehen blokea edukia inprimatzeko. Tira, nahiz eta ez genuen kopia str zeure bigarren bloke batean edozein karaktere, T by adierazi inprimatu bat lortuko dugu. Izan ere, kate beteak gure lehen blokea gainezkatua lehen bloke eta bigarren bloke batean, dena, badirudi normal egiteko. Valgrind, nahiz eta, egia kontatzen digu istorioa. Bertan dugu. Baliogabe horiek guztiak irakurtzen eta idazten du. Dezagun akats mota beste adibide bat begiratu. Hemen, zerbait zorigaiztoko egiten dugu. Espazio grab dugu zeure e int p -, espazio hori seinalatu eta int erakuslea hasieratu dugu. Hala eta guztiz ere, gure erakuslea da hasieratu, berriz, dela eta seinalatuz datuak besterik ez du, edozein dela ere junk zeure-zatia da. Beraz, datu horiek kargatu dugu int i sartu hasieratu teknikoki i, baina hain egiten dugu junk datuekin. Deialdia, urari handy arazketa makro aldarrikatzeko egokiekin izeneko liburutegian definitu, izango da programa bere test baldintza huts egiten badu bertan behera utzi. Hau da, i ez bada, 0. Zeure espazioa zen arabera, p adierazi Programa hau batzuetan lan egin dezake, eta beste garai batzuetan huts egitea. Lan egiten bada, zortea besterik ari gara lortzean. Konpilatzailea izango da ez harrapatzeko errore hau, baina ziur borondate Valgrind. Errore gure junk datuak erabilera eratorritako ikusiko dugu. Zeure memoria esleitu duzu, baina ez deallocate edo askatzea, leak bat dela deritzo. Txiki, labur-bizi programa doan eta berehala, irteerak, filtrazioen dira nahiko arriskutsua izan daiteke, baina tamaina handiagoa eta / edo bizitza-luzeraren proiektu bat, txiki leak ere zerbait garrantzitsu konposatu. CS50 For, espero ez dugun zaindu zeure memoria esleitu guztiak askatzeaz nahi dugu, gaitasunak eraikitzeko eskuzko prozesua behar bezala kudeatzeko geroztik C. eskatzen Horretarako, programa zehatza izan behar du bat-to-one malloc eta doako deiak arteko korrespondentzia. Zorionez, Valgrind duzu lagun dezake memoria filtrazioak ere. Hemen izeneko leak.c leaky programa bat da bideratzen zeure buruzko espazioa, idazten du, baina ez du libratzeko. Konpilatu dugu egin eta exekutatu Valgrind pean, eta ikusiko dugu, berriz, ez memoria akatsak, dute bat egiten dugu leak. Badira 16 byte behin betiko galdu, memoria horretan erakuslea ez zela esparrua da programa amaitu da zentzua. Orain, Valgrind ez ematen diguten leak buruzko informazioa tona bat, baina jarraituko dugu ohar hau txikia bada ematen dion bere txostenaren behealdeko berrabiarazi - leak-check = full memoria leaked osoa xehetasunak ikusteko, Informazio gehiago lortzeko egingo dugu. Orain, zeure laburpen, Valgrind kontatzen digu non memoria galdu zen, hasieran esleitu zen. Bezala ezagutzen iturburu-kodea bilatzen dugu. Valgrind jakinarazten digu leaked dugun memoria malloc dei on line 8 leak.c esleitu funtzio nagusia. Pretty nifty. Valgrind guztiak sailkatu filtrazioen baldintza hauek erabiliz: Definitely galdu zeure memoria esleitu da duen programa jada ez du erakuslea. Valgrind daki behin erakuslea izan zuen, baina geroztik, pista galdu. Memoria hori behin betiko leaked. Zeharka galdu zeure memoria esleitu da zein da erakusleak bakarra ere galdu egiten dira. Esate baterako, galdu duzu zure lehen nodo zerrenda lotuta erakuslea bada, ondoren, lehen nodo berak behin betiko galdu egingo litzateke, ondorengo nodo edozein zeharka, berriz, galdu. Baliteke galdu zeure memoria esleitu da diren Valgrind ezin izan ziur ea erakuslea edo ez. Oraindik `zeure memoria esleitu da duen programa oraindik erakuslea irtetean, izaten esan nahi du aldagai global bat eta puntu. Filtrazioen horiek egiaztatzeko, aukera ere izango duzu, besteak beste. - Oraindik eskuratu = yes zure Valgrind deitzeko. Kasu hauek estrategia ezberdinak garbiketa sortu behar izatea, baina filtrazioak ezabatu behar. Zoritxarrez, ihesak konpontzen zaila egin daiteke, okerra doako deiak kolpe geroztik zure programa. Esate baterako, invalid_free.c begiratuz gero, memoria txarra deallocation adibide bat ikusiko dugu. Osoa blokea askatzea dei bakar bat izan behar du. memoria int_block by adierazi int tamaina atal bakoitzean askatzea ordez saiakera bat bihurtu memoria banan-banan. Hau catastrophically huts egingo du. Boom! Zer errore bat. Hau da, zalantzarik gabe, eta ez da ona. Zu akats mota hau itsatsita, nahiz eta ez dakizu non begiratu, erori atzera zure lagun berria onena. Asmatu duzu Valgrind. Valgrind, beti bezala, ez daki zehatz-mehatz zer. Esleipenen eta free zenbatzen ez datoz bat sortu. Esleipenen 1 eta 4 askatzen lortu dugu. Eta Valgrind ere kontatzen digu, non lehenengo txarra free dei - aktibatzen blowup bat da datozen line 16. Ikusten den bezala, txarra dei askatzea benetan txarra, beraz, zure programa leak uzteko gomendatzen dugu ari zaren funtzionalitatea zuzena egiten duten bitartean. Hasi filtrazioen bila soilik ondoren zure programa behar bezala "" funtzionatzen, akatsak beste edozein gabe. Eta hori guztia bideo honetan lortu dugu. Orain zer zain zaude? Joan zure programak exekutatu Valgrind oraintxe. Nire izena Nate Hardison da. Hau CS50 da. [CS50.TV]