1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [Nate Hardison, Prifysgol Harvard] 3 00:00:05,000 --> 00:00:07,000 Mae hyn yn CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Mae rhai o'r bygiau mwyaf anodd mewn rhaglenni C 5 00:00:10,000 --> 00:00:13,000 dod o gamreoli cof. 6 00:00:13,000 --> 00:00:15,000 Mae yna nifer fawr o ffyrdd i sgriw pethau i fyny, 7 00:00:15,000 --> 00:00:17,000 gan gynnwys dyrannu y swm anghywir o gof, 8 00:00:17,000 --> 00:00:20,000 anghofio ymgychwyn newidynnau, 9 00:00:20,000 --> 00:00:23,000 ysgrifenedig cyn neu ar ôl diwedd y byffer, 10 00:00:23,000 --> 00:00:25,000 a rhyddhau amser yn cadw cof lluosog. 11 00:00:25,000 --> 00:00:28,000 Mae'r symptomau yn amrywio o ddamweiniau ysbeidiol 12 00:00:28,000 --> 00:00:30,000 i werthoedd rhyfedd overwritten, 13 00:00:30,000 --> 00:00:34,000 yn aml mewn mannau ac amseroedd bell oddi wrth y camgymeriad gwreiddiol. 14 00:00:34,000 --> 00:00:37,000 Olrhain y broblem a welwyd yn ôl at wraidd ei achosion sylfaenol 15 00:00:37,000 --> 00:00:39,000 Gall fod yn heriol, 16 00:00:39,000 --> 00:00:42,000 ond yn ffodus mae rhaglen ddefnyddiol o'r enw Valgrind 17 00:00:42,000 --> 00:00:44,000 all wneud llawer i helpu. 18 00:00:44,000 --> 00:00:47,000 >> Rydych yn rhedeg rhaglen o dan Valgrind i alluogi 19 00:00:47,000 --> 00:00:50,000 gwirio helaeth o ddyraniadau cof domen a mynedfeydd. 20 00:00:50,000 --> 00:00:53,000 Pan Valgrind yn canfod problem, mae'n rhoi i chi ar unwaith, 21 00:00:53,000 --> 00:00:56,000 gwybodaeth uniongyrchol sy'n eich galluogi i 22 00:00:56,000 --> 00:00:58,000 yn haws dod o hyd ac yn datrys y broblem. 23 00:00:58,000 --> 00:01:01,000 Valgrind adroddiadau hefyd ar faterion llai o gof marwol, 24 00:01:01,000 --> 00:01:04,000 megis gollwng cof, dyrannu cof domen, 25 00:01:04,000 --> 00:01:07,000 ac anghofio i ryddhau ei. 26 00:01:07,000 --> 00:01:10,000 Fel ein compiler, Clang, yn ein debugger, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind yn feddalwedd rhad ac am ddim, ac mae'n cael ei osod ar y peiriant. 28 00:01:14,000 --> 00:01:16,000 Valgrind yn rhedeg ar eich gweithredadwy binary, 29 00:01:16,000 --> 00:01:20,000 nad yw eich. c neu. h ffeiliau cod ffynhonnell, 30 00:01:20,000 --> 00:01:23,000 felly gwnewch yn siŵr eich bod wedi llunio copi i fyny-i-dyddiad eich rhaglen 31 00:01:23,000 --> 00:01:25,000 defnyddio Clang neu Gwneud. 32 00:01:25,000 --> 00:01:28,000 Yna, gall rhedeg eich rhaglen o dan Valgrind fod yn 33 00:01:28,000 --> 00:01:32,000 mor syml â dim ond prefixing 'r archa rhaglen safonol gyda'r Valgrind gair, 34 00:01:32,000 --> 00:01:35,000 sy'n cychwyn i fyny Valgrind ac yn rhedeg y rhaglen y tu mewn iddo. 35 00:01:35,000 --> 00:01:38,000 Wrth ddechrau, Valgrind gwneud peth cymhleth 36 00:01:38,000 --> 00:01:41,000 jiggering i ffurfweddu y cyflawnadwy ar gyfer y gwiriadau cof, 37 00:01:41,000 --> 00:01:44,000 fel y gall gymryd rhan i fynd i fyny ac yn rhedeg. 38 00:01:44,000 --> 00:01:48,000 Bydd y rhaglen wedyn gweithredu fel arfer, bydd yn llawer arafach, 39 00:01:48,000 --> 00:01:52,000 a phan mae'n gorffen, bydd Valgrind argraffu crynodeb o'i chof chynefod. 40 00:01:52,000 --> 00:01:58,000 Os bydd popeth yn mynd yn dda, bydd yn edrych rhywbeth fel hyn: 41 00:01:58,000 --> 00:02:01,000 Yn yr achos hwn,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 yw'r llwybr at y rhaglen yr wyf am ei redeg. 43 00:02:04,000 --> 00:02:06,000 Ac er nad yw hyn yn un yn cymryd unrhyw ddadleuon, 44 00:02:06,000 --> 00:02:09,000 os oedd fy mod wedi dim ond tac iddynt ar ddiwedd y gorchymyn fel arfer. 45 00:02:09,000 --> 00:02:12,000 Rhaglen Glân yn unig yw rhaglen bach gwirion yr wyf yn creu 46 00:02:12,000 --> 00:02:15,000 sy'n dyrannu lle ar gyfer bloc o ints ar y domen, 47 00:02:15,000 --> 00:02:19,000 yn rhoi rhai gwerthoedd y tu mewn ohonynt, ac yn rhyddhau y bloc cyfan. 48 00:02:19,000 --> 00:02:23,000 Mae hyn yn beth ydych yn saethu ar gyfer unrhyw wallau a dim gollyngiadau. 49 00:02:23,000 --> 00:02:27,000 >> Arall metrig bwysig yw cyfanswm nifer y bytes a ddyrannwyd. 50 00:02:27,000 --> 00:02:32,000 Yn dibynnu ar y rhaglen, os yw eich dyraniadau yn y megabeit neu uwch, 51 00:02:32,000 --> 00:02:34,000 mae'n debyg eich bod yn gwneud rhywbeth o'i le. 52 00:02:34,000 --> 00:02:37,000 A ydych yn ddiangen storio dyblygu? 53 00:02:37,000 --> 00:02:40,000 A ydych yn defnyddio'r domen ar gyfer storio, pryd y byddai'n well defnyddio'r pentwr? 54 00:02:40,000 --> 00:02:43,000 Felly, gall camgymeriadau cof fod yn wir ddrwg. 55 00:02:43,000 --> 00:02:46,000 Mae'r rhai mwy agored yn achosi damweiniau ysblennydd, 56 00:02:46,000 --> 00:02:49,000 ond hyd yn oed wedyn gall fod yn dal yn anodd i binbwyntio 57 00:02:49,000 --> 00:02:51,000 beth yn union arweiniodd at y ddamwain. 58 00:02:51,000 --> 00:02:54,000 Mwy llechwraidd, rhaglen gyda gwall cof 59 00:02:54,000 --> 00:02:56,000 dal i lunio lân 60 00:02:56,000 --> 00:02:58,000 Gall ac yn dal i ymddangos i weithio'n gywir 61 00:02:58,000 --> 00:03:01,000 oherwydd eich bod yn llwyddo i gael lwcus rhan fwyaf o'r amser. 62 00:03:01,000 --> 00:03:04,000 Ar ôl nifer o "ganlyniadau llwyddiannus," 63 00:03:04,000 --> 00:03:07,000 efallai y byddwch yn meddwl bod damwain yn hap a damwain y cyfrifiadur, 64 00:03:07,000 --> 00:03:10,000 ond nid yw'r cyfrifiadur yn anghywir. 65 00:03:10,000 --> 00:03:13,000 >> Gall rhedeg Valgrind eich helpu i ddod o hyd i'r achos o wallau cof gweladwy 66 00:03:13,000 --> 00:03:18,000 yn ogystal â dod o hyd i llechu camgymeriadau nad ydych yn hyd yn oed eto yn gwybod amdanynt. 67 00:03:18,000 --> 00:03:22,000 Bob tro y Valgrind yn canfod problem, bydd yn argraffu gwybodaeth am yr hyn y mae'n arsylwyd. 68 00:03:22,000 --> 00:03:24,000 Mae pob eitem yn eithaf swta - 69 00:03:24,000 --> 00:03:27,000 y llinell ffynhonnell y cyfarwyddyd troseddu, beth yw'r mater, 70 00:03:27,000 --> 00:03:30,000 a gwybodaeth ychydig am y cof dan sylw - 71 00:03:30,000 --> 00:03:34,000 ond yn aml mae'n digon o wybodaeth i gyfeirio eich sylw at y lle iawn. 72 00:03:34,000 --> 00:03:37,000 Dyma enghraifft o Valgrind rhedeg ar raglen buggy 73 00:03:37,000 --> 00:03:40,000 hwnnw sy'n gwneud darllen annilys o gof domen. 74 00:03:40,000 --> 00:03:49,000 Rydym yn gweld unrhyw wallau neu rybuddion yn casglu. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, y crynodeb gwall yn dweud bod yna ddau wall - 76 00:03:53,000 --> 00:03:56,000 2 yn darllen annilys o faint 4 - bytes, hynny yw. 77 00:03:56,000 --> 00:04:01,000 Mae'r ddau ddrwg yn darllen yn digwydd yn y prif swyddogaeth invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 y cyntaf ar llinell 16 a'r ail ar llinell 19. 79 00:04:04,000 --> 00:04:06,000 Gadewch i ni edrych ar y cod. 80 00:04:06,000 --> 00:04:11,000 Edrych fel y galwad cyntaf i printf ceisio i ddarllen un int heibio diwedd ein bloc cof. 81 00:04:11,000 --> 00:04:13,000 Os ydym yn edrych yn ôl ar Valgrind allbwn, 82 00:04:13,000 --> 00:04:16,000 rydym yn gweld bod Valgrind dweud wrthym yn union hynny. 83 00:04:16,000 --> 00:04:19,000 Y cyfeiriad yr ydym yn ceisio ei darllen yn dechrau 0 bytes 84 00:04:19,000 --> 00:04:22,000 heibio diwedd y bloc o faint 16 bytes - 85 00:04:22,000 --> 00:04:25,000 4 32-bit ints ein bod wedi dyrannu. 86 00:04:25,000 --> 00:04:29,000 Hynny yw, y cyfeiriad yr ydym yn ceisio ei darllen yn dechrau gywir ar ddiwedd ein bloc, 87 00:04:29,000 --> 00:04:32,000 yn union fel y gwelwn yn ein galwad drwg printf. 88 00:04:32,000 --> 00:04:36,000 Nawr, efallai na fydd annilys yn darllen yn ymddangos fel 'na fawr o gytundeb, 89 00:04:36,000 --> 00:04:39,000 ond os ydych yn defnyddio'r data i reoli llif eich rhaglen - 90 00:04:39,000 --> 00:04:42,000 er enghraifft, fel rhan o ddatganiad neu os ddolen - 91 00:04:42,000 --> 00:04:45,000 yna gall pethau dawel mynd yn ddrwg. 92 00:04:45,000 --> 00:04:47,000 Gwyliwch sut y gallaf redeg y rhaglen invalid_read 93 00:04:47,000 --> 00:04:50,000 a dim byd allan o'r cyffredin yn digwydd. 94 00:04:50,000 --> 00:04:52,000 Scary, huh? 95 00:04:52,000 --> 00:04:56,000 >> Nawr, gadewch i ni edrych ar fathau rhai yn fwy o gamgymeriadau y gallech ddod ar eu traws yn eich cod, 96 00:04:56,000 --> 00:04:59,000 a byddwn yn gweld sut Valgrind sylwi arnynt. 97 00:04:59,000 --> 00:05:01,000 Rydym yn unig yn gweld enghraifft o invalid_read, 98 00:05:01,000 --> 00:05:04,000 felly, yn awr gadewch i ni edrych allan invalid_write. 99 00:05:04,000 --> 00:05:09,000 Unwaith eto, nid oes unrhyw wallau neu rybuddion yn casglu. 100 00:05:09,000 --> 00:05:12,000 Iawn, Valgrind yn dweud bod yna ddau wall yn y rhaglen hon - 101 00:05:12,000 --> 00:05:15,000 a invalid_write a invalid_read. 102 00:05:15,000 --> 00:05:18,000 Gadewch i ni edrych ar y cod hwn. 103 00:05:18,000 --> 00:05:21,000 Edrych fel rydym wedi cael yn enghraifft o'r strlen clasurol ac un bug. 104 00:05:21,000 --> 00:05:24,000 Nid yw'r cod yn malloc yn beit ychwanegol o le 105 00:05:24,000 --> 00:05:26,000 ar gyfer y cymeriad / 0, 106 00:05:26,000 --> 00:05:30,000 felly pan str copi yn mynd i ysgrifennu yn ssubstrlen "cs50 creigiau!" 107 00:05:30,000 --> 00:05:33,000 iddo ysgrifennu 1 beit heibio diwedd ein bloc. 108 00:05:33,000 --> 00:05:36,000 Mae'r invalid_read yn dod pan rydym yn gwneud ein galwad i printf. 109 00:05:36,000 --> 00:05:40,000 Printf dod i ben i fyny darllen cof annilys pan fydd yn darllen y / 0 gymeriad 110 00:05:40,000 --> 00:05:43,000 gan ei fod yn edrych ar ddiwedd y llinyn E mae'n argraffu. 111 00:05:43,000 --> 00:05:45,000 Ond does dim o ddianc Valgrind. 112 00:05:45,000 --> 00:05:48,000 Rydym yn gweld ei bod yn dal y invalid_write fel rhan o'r copi str 113 00:05:48,000 --> 00:05:51,000 ar linell 11 o brif, ac mae'r invalid_read yn rhan o printf. 114 00:05:51,000 --> 00:05:54,000 Rock ar, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Unwaith eto, efallai na fydd hyn yn ymddangos fel llawer fawr. 116 00:05:57,000 --> 00:06:00,000 Gallwn redeg y rhaglen hon drosodd a throsodd y tu allan i Valgrind 117 00:06:00,000 --> 00:06:03,000 ac ydynt yn gweld unrhyw symptomau wall. 118 00:06:03,000 --> 00:06:06,000 >> Fodd bynnag, gadewch i ni edrych ar amrywiad bychan o hyn i weld 119 00:06:06,000 --> 00:06:09,000 sut y gall pethau fynd yn wael iawn. 120 00:06:09,000 --> 00:06:14,000 Felly, a roddwyd, rydym yn cam-drin pethau mwy na dim ond ychydig yn y cod hwn. 121 00:06:14,000 --> 00:06:17,000 Rydym yn unig yn dyrannu lle ar y domen am ddau linyn 122 00:06:17,000 --> 00:06:19,000 hyd cs50 creigiau, 123 00:06:19,000 --> 00:06:22,000 y tro hwn, gan gofio y / 0 cymeriad. 124 00:06:22,000 --> 00:06:25,000 Ond yna rydym yn taflu mewn llinyn super-hir i mewn i'r bloc cof 125 00:06:25,000 --> 00:06:27,000 bod S yn pwyntio i. 126 00:06:27,000 --> 00:06:30,000 Pa effaith a gaiff hynny ar y bloc cof bod pwyntiau T i? 127 00:06:30,000 --> 00:06:34,000 Wel, os pwyntiau T i gof bod dim ond ger S, 128 00:06:34,000 --> 00:06:37,000 dod yn union ar ei ôl, 129 00:06:37,000 --> 00:06:39,000 yna efallai y byddwn wedi ysgrifennu dros ran o T. 130 00:06:39,000 --> 00:06:41,000 Gadewch i ni redeg y cod hwn. 131 00:06:41,000 --> 00:06:43,000 Edrychwch ar yr hyn a ddigwyddodd. 132 00:06:43,000 --> 00:06:47,000 Mae'r llinynnau ydym yn ei storio yn ein blociau domen yn ymddangos bod wedi argraffu yn gywir. 133 00:06:47,000 --> 00:06:49,000 Nid oes dim yn ymddangos o'i le o gwbl. 134 00:06:49,000 --> 00:06:52,000 Fodd bynnag, gadewch i ni fynd yn ôl i mewn ein cod a 135 00:06:52,000 --> 00:06:55,000 sylwadau ar y llinell lle rydym yn copïo cs50 creigiau 136 00:06:55,000 --> 00:06:59,000 i mewn i'r bloc cof ail, yn tynnu sylw at y t. 137 00:06:59,000 --> 00:07:02,000 Nawr, pan fyddwn yn rhedeg y cod dylem 138 00:07:02,000 --> 00:07:06,000 ond yn gweld cynnwys y bloc cof cyntaf argraffu. 139 00:07:06,000 --> 00:07:09,000 Pwy yw, er nad ydym yn gwneud str copi 140 00:07:09,000 --> 00:07:12,000 unrhyw gymeriadau i mewn i'r bloc domen ail, yr un sylw ato gan T, 141 00:07:12,000 --> 00:07:15,000 rydym yn cael allbrint. 142 00:07:15,000 --> 00:07:18,000 Yn wir, y llinyn rydym yn stwffio i mewn i'n bloc cyntaf 143 00:07:18,000 --> 00:07:21,000 wedi goresgyn y bloc cyntaf ac i mewn i'r ail floc, 144 00:07:21,000 --> 00:07:23,000 gwneud popeth yn ymddangos yn normal. 145 00:07:23,000 --> 00:07:26,000 Valgrind, fodd bynnag, yn dweud wrthym stori wir. 146 00:07:26,000 --> 00:07:28,000 Dyna ni. 147 00:07:28,000 --> 00:07:32,000 Mae pob un o'r rhai annilys darllen ac ysgrifennu. 148 00:07:32,000 --> 00:07:36,000 >> Gadewch i ni edrych ar enghraifft o fath arall o wall. 149 00:07:36,000 --> 00:07:39,000 Yma rydym yn gwneud rhywbeth braidd yn anffodus. 150 00:07:39,000 --> 00:07:41,000 Rydym yn cydio lle ar gyfer int ar y domen, 151 00:07:41,000 --> 00:07:45,000 ac rydym yn ymgychwyn i pwyntydd int - p - i gyfeirio at y gofod. 152 00:07:45,000 --> 00:07:48,000 Fodd bynnag, er ein pwyntydd yn cael ei hymgychwyn, 153 00:07:48,000 --> 00:07:52,000 y data ei fod yn pwyntio i ychydig wedi beth bynnag sothach yn y rhan honno o'r domen. 154 00:07:52,000 --> 00:07:55,000 Felly, pan fyddwn yn llwytho y data i mewn int i, 155 00:07:55,000 --> 00:07:57,000 rydym yn dechnegol ymgychwyn i, 156 00:07:57,000 --> 00:08:00,000 ond rydym yn gwneud hynny gyda data sothach. 157 00:08:00,000 --> 00:08:03,000 Mae'r alwad i fynnu, sy'n macro debugging defnyddiol 158 00:08:03,000 --> 00:08:06,000 ddiffinnir yn y enwir aptly fynnu llyfrgell, 159 00:08:06,000 --> 00:08:09,000 yn atal y rhaglen os yw ei gyflwr yn methu prawf. 160 00:08:09,000 --> 00:08:11,000 Hynny yw, os nad fi yw 0. 161 00:08:11,000 --> 00:08:14,000 Yn dibynnu ar yr hyn oedd yn y gofod domen, yn cyfeirio at y p, 162 00:08:14,000 --> 00:08:18,000 Efallai y rhaglen hon yn gweithio weithiau, ac yn methu ar adegau eraill. 163 00:08:18,000 --> 00:08:20,000 Os bydd yn gweithio, rydym yn unig yn cael lwcus. 164 00:08:20,000 --> 00:08:24,000 Ni fydd y casglwr dal y gwall hwn, ond Valgrind ewyllys yn siwr. 165 00:08:24,000 --> 00:08:28,000 Dyna ni weld y camgymeriad yn deillio o'n defnydd o'r data hwnnw sothach. 166 00:08:28,000 --> 00:08:32,000 >> Pan fyddwch yn dyrannu cof domen, ond nid ydynt yn deallocate neu ei rhyddhau iddo, 167 00:08:32,000 --> 00:08:34,000 sy'n cael ei alw'n yn gollwng. 168 00:08:34,000 --> 00:08:37,000 Am bach, byr-byw raglen sy'n rhedeg ac yn union allanfeydd, 169 00:08:37,000 --> 00:08:39,000 gollyngiadau yn gymharol ddiniwed, 170 00:08:39,000 --> 00:08:42,000 ond ar gyfer prosiect o faint mwy a / neu hirhoedledd, 171 00:08:42,000 --> 00:08:46,000 gall hyd yn oed yn gollwng bach waethygu'r i fod yn rhywbeth mawr. 172 00:08:46,000 --> 00:08:49,000 Am CS50, rydym yn disgwyl i chi 173 00:08:49,000 --> 00:08:51,000 cymryd gofal o ryddhau holl cof domen eich bod yn dyrannu, 174 00:08:51,000 --> 00:08:54,000 ers i ni eisiau i chi feithrin y sgiliau i briodol trin y broses â llaw 175 00:08:54,000 --> 00:08:56,000 sy'n ofynnol gan C. 176 00:08:56,000 --> 00:08:59,000 Er mwyn gwneud hynny, dylai eich rhaglen gael union 177 00:08:59,000 --> 00:09:03,000 un-i-un rhwng malloc a galwadau am ddim. 178 00:09:03,000 --> 00:09:06,000 Yn ffodus, gall Valgrind eich helpu gyda gollyngiadau cof hefyd. 179 00:09:06,000 --> 00:09:09,000 Dyma raglen sy'n gollwng o'r enw leak.c bod yn dyrannu 180 00:09:09,000 --> 00:09:13,000 gofod ar y domen, yn ysgrifennu iddo, ond nid yw'n rhyddhau ei. 181 00:09:13,000 --> 00:09:16,000 Rydym yn casglu gyda Gwnewch a'i redeg o dan Valgrind, 182 00:09:16,000 --> 00:09:18,000 a gwelwn, er bod gennym wallau cof na, 183 00:09:18,000 --> 00:09:20,000 oes gennym un gollyngiad. 184 00:09:20,000 --> 00:09:23,000 Mae 16 o bytes colli yn bendant, 185 00:09:23,000 --> 00:09:27,000 golygu nad oedd y pwyntydd i'r cof oedd o ran cwmpas pan fydd y rhaglen gadael. 186 00:09:27,000 --> 00:09:30,000 Nawr, nid Valgrind yn rhoi i ni tunnell o wybodaeth am y gollyngiad, 187 00:09:30,000 --> 00:09:35,000 ond os ydym yn dilyn y nodyn bach fod yn rhoi i lawr tua gwaelod ei adroddiad 188 00:09:35,000 --> 00:09:38,000 i ailgynnal gyda - gollwng-wirio = llawn 189 00:09:38,000 --> 00:09:41,000 i weld y manylion llawn y cof gollwng, 190 00:09:41,000 --> 00:09:44,000 byddwn yn cael rhagor o wybodaeth. 191 00:09:44,000 --> 00:09:46,000 Yn awr, yn y crynodeb domen, 192 00:09:46,000 --> 00:09:50,000 Valgrind dweud wrthym lle y cof a gollwyd ei ddyrannu'n wreiddiol. 193 00:09:50,000 --> 00:09:52,000 Yn union fel y gwyddom o edrych yn y cod ffynhonnell, 194 00:09:52,000 --> 00:09:55,000 Valgrind rhoi gwybod i ni ein bod yn gollwng y cof 195 00:09:55,000 --> 00:09:58,000 dyrannu gyda galwad i malloc ar llinell 8 o leak.c 196 00:09:58,000 --> 00:10:00,000 yn y prif swyddogaeth. 197 00:10:00,000 --> 00:10:02,000 Pretty nifty. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind categorizes gollyngiadau ddefnyddio'r termau hyn: 199 00:10:04,000 --> 00:10:07,000 Colli Yn bendant - mae hyn yn cof dyrannu domen 200 00:10:07,000 --> 00:10:10,000 y mae'r rhaglen nad oes gan pwyntydd. 201 00:10:10,000 --> 00:10:14,000 Valgrind yn gwybod eich bod unwaith roedd y pwyntydd, ond wedi colli ers trac ohono. 202 00:10:14,000 --> 00:10:17,000 Mae'r cof yn cael ei gollwng yn bendant. 203 00:10:17,000 --> 00:10:20,000 Colli Anuniongyrchol - mae hyn yn cof dyrannu domen 204 00:10:20,000 --> 00:10:24,000 y mae'r awgrymiadau yn unig i hefyd yn cael eu colli. 205 00:10:24,000 --> 00:10:27,000 Er enghraifft, os byddwch yn colli eich syniad inni am y nod cyntaf o restr cysylltiedig, 206 00:10:27,000 --> 00:10:30,000 yna byddai'r nod yn Gyntaf ei hun yn cael ei golli yn bendant, 207 00:10:30,000 --> 00:10:34,000 tra byddai unrhyw nodau dilynol yn cael eu colli yn anuniongyrchol. 208 00:10:34,000 --> 00:10:37,000 Golli o bosibl - mae hyn yn cof dyrannu domen 209 00:10:37,000 --> 00:10:41,000 lle na fedr Valgrind fod yn sicr a oes pwyntydd neu beidio. 210 00:10:41,000 --> 00:10:44,000 Still reachable o gof a ddyrannwyd domen 211 00:10:44,000 --> 00:10:47,000 y mae'r rhaglen yn dal pwyntydd yn gadael, 212 00:10:47,000 --> 00:10:50,000 sydd fel rheol yn golygu bod pwyntiau byd-eang amrywiol iddo. 213 00:10:50,000 --> 00:10:53,000 I holi am y gollyngiadau, bydd yn rhaid i chi gynnwys y dewis 214 00:10:53,000 --> 00:10:55,000 - Yn dal i-reachable = ie 215 00:10:55,000 --> 00:10:58,000 yn eich deisyfiad am Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Gall y rhain achosion gwahanol yn gofyn am strategaethau gwahanol ar gyfer eu glanhau i fyny, 217 00:11:01,000 --> 00:11:05,000 ond dylai gollyngiadau yn cael ei ddileu. 218 00:11:05,000 --> 00:11:08,000 Yn anffodus, gall trwsio gollyngiadau fod yn anodd i'w wneud, 219 00:11:08,000 --> 00:11:11,000 gan y gall galwadau anghywir i ddim chwythu i fyny eich rhaglen. 220 00:11:11,000 --> 00:11:14,000 Er enghraifft, os edrychwn ar invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 rydym yn gweld enghraifft o deallocation cof gwael. 222 00:11:18,000 --> 00:11:21,000 Beth ddylai fod yn un alwad i ryddhau'r bloc cyfan 223 00:11:21,000 --> 00:11:24,000 o gof tynnu sylw at y int_block, 224 00:11:24,000 --> 00:11:27,000 wedi dod yn lle hynny yn ymgais i ryddhau pob adran int-maint 225 00:11:27,000 --> 00:11:29,000 y cof yn unigol. 226 00:11:29,000 --> 00:11:32,000 Bydd hyn yn methu drychinebus. 227 00:11:32,000 --> 00:11:34,000 Boom! Beth camgymeriad. 228 00:11:34,000 --> 00:11:36,000 Mae hyn nid yn bendant yn dda. 229 00:11:36,000 --> 00:11:39,000 Os ydych chi'n sownd gyda'r math hwn o gamgymeriad, fodd bynnag, ac nad ydych yn gwybod ble i edrych, 230 00:11:39,000 --> 00:11:41,000 disgyn yn ôl ar eich ffrind gorau newydd. 231 00:11:41,000 --> 00:11:44,000 I chi ei guessed - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, fel bob amser, yn gwybod yn union beth i fyny. 233 00:11:47,000 --> 00:11:50,000 Nid yw'r cyfrif Dyraniad ac am ddim yn cyfateb i fyny. 234 00:11:50,000 --> 00:11:52,000 Rydym wedi got 1 Dyraniad a 4 yn rhyddhau. 235 00:11:52,000 --> 00:11:55,000 Ac Valgrind hefyd yn dweud wrthym lle yr alwad rhydd cyntaf ddrwg - 236 00:11:55,000 --> 00:11:58,000 yr un sy'n sbarduno y blowup - yn dod o - 237 00:11:58,000 --> 00:12:00,000 llinell 16. 238 00:12:00,000 --> 00:12:03,000 Fel y gwelwch, galwadau drwg i ryddhau yn wirioneddol ddrwg, 239 00:12:03,000 --> 00:12:05,000 felly rydym yn argymell gosod eich gollwng rhaglen 240 00:12:05,000 --> 00:12:08,000 tra byddwch yn gweithio ar gael y ymarferoldeb cywir. 241 00:12:08,000 --> 00:12:12,000 Dechrau chwilio am ollyngiadau yn unig ar ôl eich rhaglen yn gweithio'n iawn, 242 00:12:12,000 --> 00:12:14,000 heb unrhyw wallau eraill. 243 00:12:14,000 --> 00:12:16,000 >> A dyna i gyd gennym ar gyfer y fideo. 244 00:12:16,000 --> 00:12:18,000 Nawr beth ydych chi'n aros amdano? 245 00:12:18,000 --> 00:12:21,000 Ewch rhedeg Valgrind ar eich rhaglenni ar hyn o bryd. 246 00:12:21,000 --> 00:12:25,000 Fy enw i yw Nate Hardison. Mae hyn yn CS50. [CS50.TV]