[Powered by Google Translate] [Valgrind] [Nate Hardison, Inivèsite Harvard] Sa a se CS50, CS50.TV] Gen kèk nan bug yo nan C pwogram ki pi difisil soti nan movèz jesyon an nan memwa. Genyen yon kantite gwo a fason yo vis bagay yo, ki gen ladan kantite lajan allocation a mal nan memwa, bliye inisyalize varyab, ekri anvan oswa apre nan fen yon zòn de defans, ak libere kenbe memwa plizyè fwa. Sentòm yo varye ant aksidan tanzantan nan valè Mysteriously efase, souvan nan kote ak lè lwen yo retire nan erè orijinal la. Trase pwoblèm nan yo obsève tounen nan kòz la rasin siyalen yo ka difisil, , men erezman gen nan yon pwogram itil rele Valgrind ki ka fè yon anpil ou kapab ede. Ou kouri nan yon pwogram anba Valgrind yo ki ap pèmèt vaste kont kouran nan alokasyon memwa pil ak akse. Lè Valgrind detekte yon pwoblèm, li ba ou imedya, dirèk enfòmasyon ki pèmèt ou pi fasil jwenn ak ranje pwoblèm nan. Valgrind tou rapò sou pwoblèm ki ka touye moun mwens memwa, tankou fwit memwa, allocation memwa pil wòch, ak bliye libere li. Renmen du nou an, rezone, nan debugjeur nou an, gdb, Valgrind se lojisyèl gratis, epi li enstale sou aparèy la. Valgrind kouri sou ègzèkutabl binè ou a, pa c. ou a oswa. dosye h kòd sous, donk asire w ke ou te konpile yon kopi monte-a-dat nan pwogram ou an lè l sèvi avèk sonnen oswa Fè. Lè sa a,, kouri pwogram ou an anba Valgrind kapab tankou senp kòm jis prefiks yo lòd, ki pwogram estanda ak Valgrind nan mo, ki kòmanse moute Valgrind epi kouri pwogram nan andedan nan li. Lè kòmanse, Valgrind fè kèk konplèks jiggering nan konfigirasyon ègzèkutabl a pou chèk yo memwa, se konsa li ka pran yon ti jan yo ka resevwa leve, li kouri. Pwogram lan pral Lè sa a, egzekite nòmalman, se pou li pi plis dousman, ak lè li fini, Valgrind pral enprime yon rezime de itilizasyon memwa li yo. Si tout bagay ale byen, li pral gade yon bagay tankou sa a: Nan ka sa a,. / Clean_program se chemen an nan pwogram lan mwen vle kouri. E pandan ke yon sèl sa a pa pran okenn agiman, si li te fè m 'D jis fofile yo sou a nan fen yo lòd, ki kòm dabitid. Pwogram Netwaye se jis yon pwogram komik ti kras mwen te kreye ki repati espas pou yon blòk nan antye sou pil wòch la, mete kèk valè andedan nan yo, ak libere blòk nan tout antye. Sa a se sa w ap tire pou li a, pa gen okenn erè e pa gen fwit. Yon lòt metrik enpòtan an se kantite total bytes afekte. Tou depan de pwogram lan, si alokasyon ou yo nan megabit yo oswa pi wo, w ap pwobableman fè yon bagay ki mal. Èske ou san nesesite estoke Doublon? Èske ou lè l sèvi avèk pil wòch la pou l sa konsève, lè li ta pi bon yo sèvi ak chemine a? Se konsa, erè memwa ka vrèman sa ki mal. Yo menm ki pi plis aklè lakòz aksidan espektakilè, men menm lè sa a li ka toujou difisil yo sible ki sa egzakteman te mennen nan kolizyon an. Plis ensidyezman, yon pwogram ki gen yon erè memwa ka toujou konpile propr epi li ka toujou sanble yo travay kòrèkteman paske ou jere yo jwenn chans pi fò nan tan an. Apre plizyè "rezilta pozitif," ou ta ka jis panse ke yon aksidan se yon trematòd nan òdinatè a, men òdinatè a se pa janm sa ki mal. Kouri Valgrind ka ede ou foule anba kòz la nan erè memwa vizib kòm byen ke jwenn kachèt erè ou fè pa menm ankò konnen sou. Chak fwa Valgrind detekte yon pwoblèm, li simagri enfòmasyon sou ki sa li obsève. Chak bagay se jistis lapide - sous liy lan nan enstriksyon chokan an, ki sa pwoblèm nan ye, se ak yon info ti kras sou memwa a ki enplike - men souvan li a ase enfòmasyon yo dirije atansyon ou nan plas la dwat. Isit la se yon egzanp sou Valgrind kouri sou yon pwogram buggy ki fè yon Read envalid nan memwa pil wòch. Nou wè pa gen okenn erè oswa avètisman nan konpilasyon. Uh-oh, rezime a erè di ke gen de erè - de envalid rédiger nan gwosè 4 - bytes, se sa ki. Ni move li te fèt nan fonksyon prensipal invalid_read.c, premye a sou liy 16 ak dezyèm lan sou liy 19. Se pou yo gade nan kòd la. Sanble rele nan premye printf ap eseye li yon int sot pase nan fen blòk memwa nou an. Si nou gade tounen nan pwodiksyon Valgrind a, nou wè ke Valgrind te di nou egzakteman sa. Adrès la nou ap eseye li kòmanse 0 bytes sot pase nan fen blòk la nan gwosè 16 bytes - kat 32-bit antye ke nou resevwa lajan. Sa se, adrès la nou t ap eseye li kòmanse dwa nan fen blòk nou an, menm jan nou wè nan rele move nou printf. Koulye a, envalid rédiger pa ta ka sanble tankou ki gwo de yon kontra, Men, si w ap itilize ki done kontwole koule nan pwogram ou an - pou egzanp, kòm yon pati nan yon si deklarasyon oubyen riban - Lè sa a, bagay sa yo ka an silans ale move. Gade ki jan mwen ka kouri pwogram nan invalid_read e pa gen anyen soti nan òdinè a rive. Pè, huh? Koulye a, kite pou yo gade nan kèk lòt kalite erè ke ou ta ka rankontre nan kòd ou a, epi n ap wè ki jan Valgrind detekte yo. Nou jis te wè yon egzanp yon invalid_read, Se konsa kounye a kite a tcheke deyò yon invalid_write. Yon fwa ankò, pa gen okenn erè oswa avètisman nan konpilasyon. Okay, Valgrind di ke gen de erè nan pwogram sa a - ak invalid_write ak invalid_read yon. Se pou nou tcheke deyò sa a kòd. Sanble nou te gen yon egzanp nan strlèn la klasik plis ensèk yon sèl. Kòd la fè sa ki pa malok yon multiple siplemantè nan espas pou pèsonaj la / 0, Se konsa, lè str kopi ale nan ekri li nan ssubstrlen "cs50 wòch!" li te ekri 1 multiple sot pase nan fen blòk nou an. Invalid_read la vini lè nou fè rele nou an printf. Printf fini moute lekti envalid memwa lè li li / 0 a karaktè kòm li sanble nan fen sa a fisèl E li nan enprime. Men, pa youn nan sa a chape Valgrind. Nou wè ke li kenbe invalid_write a kòm yon pati nan kopi a str sou liy 11 nan prensipal yo, ak invalid_read a se yon pati nan printf. Rock sou li a, Valgrind. Yon fwa ankò, sa a pa ta ka sanble tankou yon kontra gwo. Nou ka kouri pwogram sa a sou yo ak sou deyò nan Valgrind epi yo pa wè nenpòt ki sentòm erè. Sepandan, kite pou yo gade nan yon varyasyon ti tay sa a yo wè ki jan bagay yo ka jwenn reyèlman move. Se konsa, yo akòde, n ap abize bagay sa yo pi plis pase jis yon ti jan nan sa a kòd. Nou ap sèlman allocation espas sou pil wòch la pou de strings longè nan cs50 wòch, tan sa a, sonje / 0 a karaktè. Men, lè sa a nou jete nan yon fisèl super-long nan blòk la memwa ki S se lonje dwèt yo. Ki efè pral ki gen sou blòk la memwa ki pwen T yo? Byen, si pwen T a memwa sa se sèlman adjasan a S, vini jis apre li, Lè sa a, nou ta ka yo te ekri sou yon pati nan T. Se pou nou kouri sa a kòd. Gade nan sa ki te pase. Strings yo nou ki estoke nan blòk pil nou tou de parèt devan yo te soti enprime kòrèkteman. Pa gen anyen sanble sa ki mal nan tout. Sepandan, kite yo ale tounen nan kòd nou yo ak kòmantè soti nan liy kote nou kopye cs50 wòch nan blòk la memwa dezyèm fwa, pwente ke t. Koulye a, lè nou kouri sa a kòd nou ta dwe wè sèlman sa ki nan blòk la memwa premye enprime soti. Ola, menm si nou pa t 'str kopi nenpòt karaktè nan blòk la pil dezyèm fwa, yon sèl la pwente ke T, nou jwenn yon ekri an lèt detache soti. Vreman vre, yo fisèl la nou boure nan blòk premye nou anvai blòk la premye ak nan blòk, dezyèm lan, fè tout bagay sanble nòmal. Valgrind, menm si, di nou istwa a vre. Gen nou ale. Tout moun sa yo valab li epi ekri. Se pou yo gade nan yon egzanp sou yon lòt kalite erè. Isit la nou fè yon bagay olye malere. Nou gen tan pwan espas pou yon int sou pil wòch la, epi nou inisyalize yon konsèy Int - p - nan pwen espas sa a. Sepandan, pandan ke se konsèy nou inisyalizèd, done yo ke li nan montre nan jis te tou sa tenten se nan pati sa a nan pil wòch la. Se konsa, lè nou chaje ki done an int mwen, nou teknikman inisyalize mwen, men nou fè sa avèk done tenten. Apèl la afime, ki se yon macro debogaj sou la men sa defini nan jistèman te rele bibliyotèk la revandike, pral avote pwogram nan si kondisyon tès li yo echwe. Sa se, si mwen se pa 0. Tou depan de ki sa ki te nan espas ki la pil wòch, pwente ke p, pwogram sa a ta ka travay pafwa ak fail nan yon lòt lè. Si li ap travay, nou jis ap resevwa chans. Du a pa pral trape erè sa, men Valgrind asire w volonte. Gen nou wè erè a isu de fason nou itilize nan ki done tenten. Lè ou asiyen memwa pil wòch, men se pa deallocate li oswa libere l ', yo rele yon fwit. Pou yon ti, pwogram kout viv-ki kouri ak imedyatman sòti, fwit yo egalman inofansif, men pou yon pwojè nan pi gwo gwosè ak / oswa lonjevite, menm yon fwit ti ka konpoze nan yon bagay enpòtan yo. Pou CS50, nou espere ou nan pran swen nan libere tout memwa nan pil ke ou asiyen, depi nou ta vle nou vin devlope aptitid yo nan byen okipe pwosesis la manyèl egzije C. Pou fè sa, pwogram ou an ta dwe gen yon egzak yon sèl-a-youn korespondans ant malok ak apèl gratis. Erezman, Valgrind ka ede ou avèk fwit memwa tou. Isit la se yon pwogram ki gen fuit rele leak.c ki rezèvè espas sou pil wòch la, ekri sou li, men se pa libere li. Nou konpile l 'ak Fè epi kouri l' anba Valgrind, e nou wè ke, pandan ke nou pa gen okenn erè memwa, Nou gen yon sèl koule. Gen 16 bytes definitivman pèdi, sa vle di konsèy la ak sa yo ki memwa pa t 'nan dimansyon lè pwogram lan soti nan. Koulye a, Valgrind pa ban nou yon tòn enfòmasyon sou koule a, Men, si nou swiv nòt sa a ti kras ke li bay desann nan direksyon pou anba a nan rapò li yo relance ak - fuit radyasyon-tcheke = plen yo wè detay yo plen ak fwit memwa, nou pral jwenn plis enfòmasyon. Koulye a, nan rezime a pil, Valgrind di nou kote yo te memwa a ki te pèdi okòmansman afekte. Menm jan nou konnen soti nan gade nan kòd la sous, Valgrind enfòme nou ke nou fwit memwa a afekte ak yon apèl nan malok sou liy 8 nan leak.c nan fonksyon prensipal la. Joli debouya. Valgrind classe fwit lè l sèvi avèk tèm sa yo: Definitivman pèdi - sa a se memwa pil wòch afekte yo ki pwogram lan pa gen okenn yon konsèy. Valgrind ki konnen nou yon fwa te gen konsèy la, men depi lè pèdi tras nan li. Sa a memwa definitivman fwit. Endirèkteman pèdi - sa a se memwa pil wòch afekte yo ki pwent yo sèlman nan li tou yo pèdi. Pou egzanp, si ou pèdi konsèy ou nan ne an premye nan yon lis lye, Lè sa a, ta ne nan premye tèt li dwe definitivman pèdi, pandan y ap nenpòt nœuds ki vin apre ta dwe endirèkteman pèdi. Li posib pèdi - sa a se memwa pil wòch afekte yo ki Valgrind pa kapab asire w ke si gen yon konsèy oswa ou pa. Toujou aksesibl se memwa pil wòch afekte yo ki pwogram lan toujou gen yon konsèy nan sòti, ki tipikman vle di ke yon mondyal pwen varyab li. Pou tcheke pou sa yo fwit, ou pral gen tou genyen ladan yo opsyon nan - Toujou-aksesibl = repons lan se wi nan invoké ou nan Valgrind. Ka sa yo diferan ta ka mande pou estrateji diferan pou netwaye yo moute, men fwit yo ta dwe elimine. Malerezman, e fikse fwit ka difisil fè, depi apèl kòrèk gratis ka kònen moute pwogram ou an. Pou egzanp, si nou gade nan invalid_free.c, nou wè yon egzanp sou deallocation memwa move. Ki sa ki ta dwe yon apèl sèl libere blòk la tout antye nan memwa pwente ke int_block, te olye vin tounen yon eseye libere chak seksyon int ki menm gwosè ak nan memwa a endividyèlman. Sa a pral fail catastrophically. Boom! Ki sa ki yon erè. Sa a se definitivman pa bon. Si w ap kole ak sa a kalite erè, menm si, epi ou pa konnen ki kote gade, tonbe sou do yo nouvo zanmi ou pi byen. Ou dvine li - Valgrind. Valgrind, kòm toujou, konnen ekzakteman ki sa a jiska. Konte yo alok ak gratis pa matche ak moute. Nou gen 1 alok ak 4 Delivery. Ak Valgrind di nou tou ki kote premye apèl la move gratis - youn nan ki deklanche blowup la - ap vini soti nan - liy 16. Kòm ou wè la a, apèl mal li libere yo se reyèlman move, se konsa nou rekòmande pou kite koule pwogram ou an pandan w ap travay sou resevwa fonksyonalite ki kòrèk la. Kòmanse ap chèche pou fwit sèlman apre pwogram ou an ap travay byen, san nenpòt ki erè lòt. Epi sa a, tout nou te gen pou videyo sa a. Kounye a ki sa yo ou ap tann? Ale kouri Valgrind sou pwogram ou an kounye a. Non mwen se Nate Hardison. Sa a se CS50. [CS50.TV]