[Powered by Google Translate] [Valgrind] [Nate Hardison, Prifysgol Harvard] Mae hyn yn CS50, CS50.TV] Mae rhai o'r bygiau mwyaf anodd mewn rhaglenni C dod o gamreoli cof. Mae yna nifer fawr o ffyrdd i sgriw pethau i fyny, gan gynnwys dyrannu y swm anghywir o gof, anghofio ymgychwyn newidynnau, ysgrifenedig cyn neu ar ôl diwedd y byffer, a rhyddhau amser yn cadw cof lluosog. Mae'r symptomau yn amrywio o ddamweiniau ysbeidiol i werthoedd rhyfedd overwritten, yn aml mewn mannau ac amseroedd bell oddi wrth y camgymeriad gwreiddiol. Olrhain y broblem a welwyd yn ôl at wraidd ei achosion sylfaenol Gall fod yn heriol, ond yn ffodus mae rhaglen ddefnyddiol o'r enw Valgrind all wneud llawer i helpu. Rydych yn rhedeg rhaglen o dan Valgrind i alluogi gwirio helaeth o ddyraniadau cof domen a mynedfeydd. Pan Valgrind yn canfod problem, mae'n rhoi i chi ar unwaith, gwybodaeth uniongyrchol sy'n eich galluogi i yn haws dod o hyd ac yn datrys y broblem. Valgrind adroddiadau hefyd ar faterion llai o gof marwol, megis gollwng cof, dyrannu cof domen, ac anghofio i ryddhau ei. Fel ein compiler, Clang, yn ein debugger, GDB, Valgrind yn feddalwedd rhad ac am ddim, ac mae'n cael ei osod ar y peiriant. Valgrind yn rhedeg ar eich gweithredadwy binary, nad yw eich. c neu. h ffeiliau cod ffynhonnell, felly gwnewch yn siŵr eich bod wedi llunio copi i fyny-i-dyddiad eich rhaglen defnyddio Clang neu Gwneud. Yna, gall rhedeg eich rhaglen o dan Valgrind fod yn mor syml â dim ond prefixing 'r archa rhaglen safonol gyda'r Valgrind gair, sy'n cychwyn i fyny Valgrind ac yn rhedeg y rhaglen y tu mewn iddo. Wrth ddechrau, Valgrind gwneud peth cymhleth jiggering i ffurfweddu y cyflawnadwy ar gyfer y gwiriadau cof, fel y gall gymryd rhan i fynd i fyny ac yn rhedeg. Bydd y rhaglen wedyn gweithredu fel arfer, bydd yn llawer arafach, a phan mae'n gorffen, bydd Valgrind argraffu crynodeb o'i chof chynefod. Os bydd popeth yn mynd yn dda, bydd yn edrych rhywbeth fel hyn: Yn yr achos hwn,. / Clean_program yw'r llwybr at y rhaglen yr wyf am ei redeg. Ac er nad yw hyn yn un yn cymryd unrhyw ddadleuon, os oedd fy mod wedi dim ond tac iddynt ar ddiwedd y gorchymyn fel arfer. Rhaglen Glân yn unig yw rhaglen bach gwirion yr wyf yn creu sy'n dyrannu lle ar gyfer bloc o ints ar y domen, yn rhoi rhai gwerthoedd y tu mewn ohonynt, ac yn rhyddhau y bloc cyfan. Mae hyn yn beth ydych yn saethu ar gyfer unrhyw wallau a dim gollyngiadau. Arall metrig bwysig yw cyfanswm nifer y bytes a ddyrannwyd. Yn dibynnu ar y rhaglen, os yw eich dyraniadau yn y megabeit neu uwch, mae'n debyg eich bod yn gwneud rhywbeth o'i le. A ydych yn ddiangen storio dyblygu? A ydych yn defnyddio'r domen ar gyfer storio, pryd y byddai'n well defnyddio'r pentwr? Felly, gall camgymeriadau cof fod yn wir ddrwg. Mae'r rhai mwy agored yn achosi damweiniau ysblennydd, ond hyd yn oed wedyn gall fod yn dal yn anodd i binbwyntio beth yn union arweiniodd at y ddamwain. Mwy llechwraidd, rhaglen gyda gwall cof dal i lunio lân Gall ac yn dal i ymddangos i weithio'n gywir oherwydd eich bod yn llwyddo i gael lwcus rhan fwyaf o'r amser. Ar ôl nifer o "ganlyniadau llwyddiannus," efallai y byddwch yn meddwl bod damwain yn hap a damwain y cyfrifiadur, ond nid yw'r cyfrifiadur yn anghywir. Gall rhedeg Valgrind eich helpu i ddod o hyd i'r achos o wallau cof gweladwy yn ogystal â dod o hyd i llechu camgymeriadau nad ydych yn hyd yn oed eto yn gwybod amdanynt. Bob tro y Valgrind yn canfod problem, bydd yn argraffu gwybodaeth am yr hyn y mae'n arsylwyd. Mae pob eitem yn eithaf swta - y llinell ffynhonnell y cyfarwyddyd troseddu, beth yw'r mater, a gwybodaeth ychydig am y cof dan sylw - ond yn aml mae'n digon o wybodaeth i gyfeirio eich sylw at y lle iawn. Dyma enghraifft o Valgrind rhedeg ar raglen buggy hwnnw sy'n gwneud darllen annilys o gof domen. Rydym yn gweld unrhyw wallau neu rybuddion yn casglu. Uh-oh, y crynodeb gwall yn dweud bod yna ddau wall - 2 yn darllen annilys o faint 4 - bytes, hynny yw. Mae'r ddau ddrwg yn darllen yn digwydd yn y prif swyddogaeth invalid_read.c, y cyntaf ar llinell 16 a'r ail ar llinell 19. Gadewch i ni edrych ar y cod. Edrych fel y galwad cyntaf i printf ceisio i ddarllen un int heibio diwedd ein bloc cof. Os ydym yn edrych yn ôl ar Valgrind allbwn, rydym yn gweld bod Valgrind dweud wrthym yn union hynny. Y cyfeiriad yr ydym yn ceisio ei darllen yn dechrau 0 bytes heibio diwedd y bloc o faint 16 bytes - 4 32-bit ints ein bod wedi dyrannu. Hynny yw, y cyfeiriad yr ydym yn ceisio ei darllen yn dechrau gywir ar ddiwedd ein bloc, yn union fel y gwelwn yn ein galwad drwg printf. Nawr, efallai na fydd annilys yn darllen yn ymddangos fel 'na fawr o gytundeb, ond os ydych yn defnyddio'r data i reoli llif eich rhaglen - er enghraifft, fel rhan o ddatganiad neu os ddolen - yna gall pethau dawel mynd yn ddrwg. Gwyliwch sut y gallaf redeg y rhaglen invalid_read a dim byd allan o'r cyffredin yn digwydd. Scary, huh? Nawr, gadewch i ni edrych ar fathau rhai yn fwy o gamgymeriadau y gallech ddod ar eu traws yn eich cod, a byddwn yn gweld sut Valgrind sylwi arnynt. Rydym yn unig yn gweld enghraifft o invalid_read, felly, yn awr gadewch i ni edrych allan invalid_write. Unwaith eto, nid oes unrhyw wallau neu rybuddion yn casglu. Iawn, Valgrind yn dweud bod yna ddau wall yn y rhaglen hon - a invalid_write a invalid_read. Gadewch i ni edrych ar y cod hwn. Edrych fel rydym wedi cael yn enghraifft o'r strlen clasurol ac un bug. Nid yw'r cod yn malloc yn beit ychwanegol o le ar gyfer y cymeriad / 0, felly pan str copi yn mynd i ysgrifennu yn ssubstrlen "cs50 creigiau!" iddo ysgrifennu 1 beit heibio diwedd ein bloc. Mae'r invalid_read yn dod pan rydym yn gwneud ein galwad i printf. Printf dod i ben i fyny darllen cof annilys pan fydd yn darllen y / 0 gymeriad gan ei fod yn edrych ar ddiwedd y llinyn E mae'n argraffu. Ond does dim o ddianc Valgrind. Rydym yn gweld ei bod yn dal y invalid_write fel rhan o'r copi str ar linell 11 o brif, ac mae'r invalid_read yn rhan o printf. Rock ar, Valgrind. Unwaith eto, efallai na fydd hyn yn ymddangos fel llawer fawr. Gallwn redeg y rhaglen hon drosodd a throsodd y tu allan i Valgrind ac ydynt yn gweld unrhyw symptomau wall. Fodd bynnag, gadewch i ni edrych ar amrywiad bychan o hyn i weld sut y gall pethau fynd yn wael iawn. Felly, a roddwyd, rydym yn cam-drin pethau mwy na dim ond ychydig yn y cod hwn. Rydym yn unig yn dyrannu lle ar y domen am ddau linyn hyd cs50 creigiau, y tro hwn, gan gofio y / 0 cymeriad. Ond yna rydym yn taflu mewn llinyn super-hir i mewn i'r bloc cof bod S yn pwyntio i. Pa effaith a gaiff hynny ar y bloc cof bod pwyntiau T i? Wel, os pwyntiau T i gof bod dim ond ger S, dod yn union ar ei ôl, yna efallai y byddwn wedi ysgrifennu dros ran o T. Gadewch i ni redeg y cod hwn. Edrychwch ar yr hyn a ddigwyddodd. Mae'r llinynnau ydym yn ei storio yn ein blociau domen yn ymddangos bod wedi argraffu yn gywir. Nid oes dim yn ymddangos o'i le o gwbl. Fodd bynnag, gadewch i ni fynd yn ôl i mewn ein cod a sylwadau ar y llinell lle rydym yn copïo cs50 creigiau i mewn i'r bloc cof ail, yn tynnu sylw at y t. Nawr, pan fyddwn yn rhedeg y cod dylem ond yn gweld cynnwys y bloc cof cyntaf argraffu. Pwy yw, er nad ydym yn gwneud str copi unrhyw gymeriadau i mewn i'r bloc domen ail, yr un sylw ato gan T, rydym yn cael allbrint. Yn wir, y llinyn rydym yn stwffio i mewn i'n bloc cyntaf wedi goresgyn y bloc cyntaf ac i mewn i'r ail floc, gwneud popeth yn ymddangos yn normal. Valgrind, fodd bynnag, yn dweud wrthym stori wir. Dyna ni. Mae pob un o'r rhai annilys darllen ac ysgrifennu. Gadewch i ni edrych ar enghraifft o fath arall o wall. Yma rydym yn gwneud rhywbeth braidd yn anffodus. Rydym yn cydio lle ar gyfer int ar y domen, ac rydym yn ymgychwyn i pwyntydd int - p - i gyfeirio at y gofod. Fodd bynnag, er ein pwyntydd yn cael ei hymgychwyn, y data ei fod yn pwyntio i ychydig wedi beth bynnag sothach yn y rhan honno o'r domen. Felly, pan fyddwn yn llwytho y data i mewn int i, rydym yn dechnegol ymgychwyn i, ond rydym yn gwneud hynny gyda data sothach. Mae'r alwad i fynnu, sy'n macro debugging defnyddiol ddiffinnir yn y enwir aptly fynnu llyfrgell, yn atal y rhaglen os yw ei gyflwr yn methu prawf. Hynny yw, os nad fi yw 0. Yn dibynnu ar yr hyn oedd yn y gofod domen, yn cyfeirio at y p, Efallai y rhaglen hon yn gweithio weithiau, ac yn methu ar adegau eraill. Os bydd yn gweithio, rydym yn unig yn cael lwcus. Ni fydd y casglwr dal y gwall hwn, ond Valgrind ewyllys yn siwr. Dyna ni weld y camgymeriad yn deillio o'n defnydd o'r data hwnnw sothach. Pan fyddwch yn dyrannu cof domen, ond nid ydynt yn deallocate neu ei rhyddhau iddo, sy'n cael ei alw'n yn gollwng. Am bach, byr-byw raglen sy'n rhedeg ac yn union allanfeydd, gollyngiadau yn gymharol ddiniwed, ond ar gyfer prosiect o faint mwy a / neu hirhoedledd, gall hyd yn oed yn gollwng bach waethygu'r i fod yn rhywbeth mawr. Am CS50, rydym yn disgwyl i chi cymryd gofal o ryddhau holl cof domen eich bod yn dyrannu, ers i ni eisiau i chi feithrin y sgiliau i briodol trin y broses â llaw sy'n ofynnol gan C. Er mwyn gwneud hynny, dylai eich rhaglen gael union un-i-un rhwng malloc a galwadau am ddim. Yn ffodus, gall Valgrind eich helpu gyda gollyngiadau cof hefyd. Dyma raglen sy'n gollwng o'r enw leak.c bod yn dyrannu gofod ar y domen, yn ysgrifennu iddo, ond nid yw'n rhyddhau ei. Rydym yn casglu gyda Gwnewch a'i redeg o dan Valgrind, a gwelwn, er bod gennym wallau cof na, oes gennym un gollyngiad. Mae 16 o bytes colli yn bendant, golygu nad oedd y pwyntydd i'r cof oedd o ran cwmpas pan fydd y rhaglen gadael. Nawr, nid Valgrind yn rhoi i ni tunnell o wybodaeth am y gollyngiad, ond os ydym yn dilyn y nodyn bach fod yn rhoi i lawr tua gwaelod ei adroddiad i ailgynnal gyda - gollwng-wirio = llawn i weld y manylion llawn y cof gollwng, byddwn yn cael rhagor o wybodaeth. Yn awr, yn y crynodeb domen, Valgrind dweud wrthym lle y cof a gollwyd ei ddyrannu'n wreiddiol. Yn union fel y gwyddom o edrych yn y cod ffynhonnell, Valgrind rhoi gwybod i ni ein bod yn gollwng y cof dyrannu gyda galwad i malloc ar llinell 8 o leak.c yn y prif swyddogaeth. Pretty nifty. Valgrind categorizes gollyngiadau ddefnyddio'r termau hyn: Colli Yn bendant - mae hyn yn cof dyrannu domen y mae'r rhaglen nad oes gan pwyntydd. Valgrind yn gwybod eich bod unwaith roedd y pwyntydd, ond wedi colli ers trac ohono. Mae'r cof yn cael ei gollwng yn bendant. Colli Anuniongyrchol - mae hyn yn cof dyrannu domen y mae'r awgrymiadau yn unig i hefyd yn cael eu colli. Er enghraifft, os byddwch yn colli eich syniad inni am y nod cyntaf o restr cysylltiedig, yna byddai'r nod yn Gyntaf ei hun yn cael ei golli yn bendant, tra byddai unrhyw nodau dilynol yn cael eu colli yn anuniongyrchol. Golli o bosibl - mae hyn yn cof dyrannu domen lle na fedr Valgrind fod yn sicr a oes pwyntydd neu beidio. Still reachable o gof a ddyrannwyd domen y mae'r rhaglen yn dal pwyntydd yn gadael, sydd fel rheol yn golygu bod pwyntiau byd-eang amrywiol iddo. I holi am y gollyngiadau, bydd yn rhaid i chi gynnwys y dewis - Yn dal i-reachable = ie yn eich deisyfiad am Valgrind. Gall y rhain achosion gwahanol yn gofyn am strategaethau gwahanol ar gyfer eu glanhau i fyny, ond dylai gollyngiadau yn cael ei ddileu. Yn anffodus, gall trwsio gollyngiadau fod yn anodd i'w wneud, gan y gall galwadau anghywir i ddim chwythu i fyny eich rhaglen. Er enghraifft, os edrychwn ar invalid_free.c, rydym yn gweld enghraifft o deallocation cof gwael. Beth ddylai fod yn un alwad i ryddhau'r bloc cyfan o gof tynnu sylw at y int_block, wedi dod yn lle hynny yn ymgais i ryddhau pob adran int-maint y cof yn unigol. Bydd hyn yn methu drychinebus. Boom! Beth camgymeriad. Mae hyn nid yn bendant yn dda. Os ydych chi'n sownd gyda'r math hwn o gamgymeriad, fodd bynnag, ac nad ydych yn gwybod ble i edrych, disgyn yn ôl ar eich ffrind gorau newydd. I chi ei guessed - Valgrind. Valgrind, fel bob amser, yn gwybod yn union beth i fyny. Nid yw'r cyfrif Dyraniad ac am ddim yn cyfateb i fyny. Rydym wedi got 1 Dyraniad a 4 yn rhyddhau. Ac Valgrind hefyd yn dweud wrthym lle yr alwad rhydd cyntaf ddrwg - yr un sy'n sbarduno y blowup - yn dod o - llinell 16. Fel y gwelwch, galwadau drwg i ryddhau yn wirioneddol ddrwg, felly rydym yn argymell gosod eich gollwng rhaglen tra byddwch yn gweithio ar gael y ymarferoldeb cywir. Dechrau chwilio am ollyngiadau yn unig ar ôl eich rhaglen yn gweithio'n iawn, heb unrhyw wallau eraill. A dyna i gyd gennym ar gyfer y fideo. Nawr beth ydych chi'n aros amdano? Ewch rhedeg Valgrind ar eich rhaglenni ar hyn o bryd. Fy enw i yw Nate Hardison. Mae hyn yn CS50. [CS50.TV]