[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]