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, Harvardo universitetas] 3 00:00:05,000 --> 00:00:07,000 Tai CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Kai kurie iš sunkiausių C programos klaidas 5 00:00:10,000 --> 00:00:13,000 kilę iš atminties netinkamo administravimo. 6 00:00:13,000 --> 00:00:15,000 Yra daugybė būdų, kaip viską suknisti, 7 00:00:15,000 --> 00:00:17,000 įskaitant neteisingą sumą paskirstant atminties, 8 00:00:17,000 --> 00:00:20,000 nepamirštant inicijuoti kintamuosius, 9 00:00:20,000 --> 00:00:23,000 raštu prieš arba po buferio pabaigos, 10 00:00:23,000 --> 00:00:25,000 ir atlaisvinti išsaugoti atminties kelis kartus. 11 00:00:25,000 --> 00:00:28,000 Simptomai svyruoti nuo pertrūkiais avarijų 12 00:00:28,000 --> 00:00:30,000 paslaptingai perrašyti vertybėms, 13 00:00:30,000 --> 00:00:34,000 dažnai toli nuo originalo klaida vietose ir įvairiose epochose. 14 00:00:34,000 --> 00:00:37,000 Sekti pastebėtą problemą su pagrindine priežastimi 15 00:00:37,000 --> 00:00:39,000 gali būti sudėtinga, 16 00:00:39,000 --> 00:00:42,000 tačiau, laimei, yra naudinga programa, vadinama Valgrind 17 00:00:42,000 --> 00:00:44,000 , kad galima padaryti daug padėti. 18 00:00:44,000 --> 00:00:47,000 >> Jums paleisti pagal Valgrind programą, kad būtų galima 19 00:00:47,000 --> 00:00:50,000 Platus tikrinimas Heap atminties paskirstymas ir prieigomis. 20 00:00:50,000 --> 00:00:53,000 Kai Valgrind aptinka problemą, ji suteikia jums iš karto, 21 00:00:53,000 --> 00:00:56,000 tiesioginė informacija, kuri leidžia jums 22 00:00:56,000 --> 00:00:58,000 lengviau rasti ir išspręsti problemą. 23 00:00:58,000 --> 00:01:01,000 Valgrind ataskaitas apie mažiau mirtinų atminties klausimais, 24 00:01:01,000 --> 00:01:04,000 pavyzdžiui, atminties nutekėjimas, skiriant krūvos atminties, 25 00:01:04,000 --> 00:01:07,000 ir pamiršta jį išlaisvinti. 26 00:01:07,000 --> 00:01:10,000 Kaip mūsų kompiliatorių, Apsukite metalinis garsas, mūsų debugger, gdb, 27 00:01:10,000 --> 00:01:14,000 Valgrind yra nemokama programinė įranga, ir jis yra įrengtas ant prietaiso. 28 00:01:14,000 --> 00:01:16,000 Valgrind veikia jūsų failus vykdomais 29 00:01:16,000 --> 00:01:20,000 ne tavo c arba H kodą failus, 30 00:01:20,000 --> 00:01:23,000 todėl, kad jūs turite surinkti up-to-data kopiją savo programą 31 00:01:23,000 --> 00:01:25,000 Apsukite metalinis garsas ar Markė. 32 00:01:25,000 --> 00:01:28,000 Tada, veikia savo programą, pagal Valgrind gali būti 33 00:01:28,000 --> 00:01:32,000 taip paprasta, kaip tik prasideda standartinės programos komandą su žodžiu Valgrind, 34 00:01:32,000 --> 00:01:35,000 , kuris prasideda Valgrind ir paleidžia programą viduje ji. 35 00:01:35,000 --> 00:01:38,000 Paleidus Valgrind kai sudėtinga 36 00:01:38,000 --> 00:01:41,000 jiggering konfigūruoti vykdomąjį atminties patikrinimus, 37 00:01:41,000 --> 00:01:44,000 todėl tai gali užtrukti šiek tiek gauti ir veikia. 38 00:01:44,000 --> 00:01:48,000 Tada programa bus vykdyti paprastai, tai būtų daug lėčiau, 39 00:01:48,000 --> 00:01:52,000 ir kai ji nesibaigė, Valgrind bus atspausdinti savo atminties naudojimo santrauką. 40 00:01:52,000 --> 00:01:58,000 Jei viskas vyks gerai, tai atrodys maždaug taip: 41 00:01:58,000 --> 00:02:01,000 Šiuo atveju. / Clean_program 42 00:02:01,000 --> 00:02:04,000 yra kelias į programą, aš noriu paleisti. 43 00:02:04,000 --> 00:02:06,000 Ir nors tai vienas nesiima jokių argumentų, 44 00:02:06,000 --> 00:02:09,000 jei ji aš tiesiog pakeisti halsą juos kaip įprasta komanda pabaigos. 45 00:02:09,000 --> 00:02:12,000 Švarus programa yra tik kvailas mažai programa, aš sukūriau 46 00:02:12,000 --> 00:02:15,000 , kad skiria erdvės bloko int krūvos, 47 00:02:15,000 --> 00:02:19,000 įdėti keletą reikšmių viduje iš jų, ir išlaisvina visą bloką. 48 00:02:19,000 --> 00:02:23,000 Tai yra tai, ką jūs šaudymo, be klaidų ir be jokių nuotėkių. 49 00:02:23,000 --> 00:02:27,000 >> Kitas svarbus rodiklis yra bendras skiriamų baitų skaičius. 50 00:02:27,000 --> 00:02:32,000 Priklausomai nuo programos,, jei jūsų asignavimai yra megabaitų ar aukštojo 51 00:02:32,000 --> 00:02:34,000 jūs tikriausiai tai kažkas negerai. 52 00:02:34,000 --> 00:02:37,000 Jūs be reikalo saugoti dublikatus? 53 00:02:37,000 --> 00:02:40,000 Ar jūs naudojate krūvą laikymo, kada būtų geriau naudoti kamino? 54 00:02:40,000 --> 00:02:43,000 Taigi, atminties klaidos gali būti tikrai blogis. 55 00:02:43,000 --> 00:02:46,000 Akivaizdžių tie sukelti įspūdingų avarijų, 56 00:02:46,000 --> 00:02:49,000 bet net ir tada jis vis dar gali būti sunku tiksliai 57 00:02:49,000 --> 00:02:51,000 kas tiksliai buvo į avariją. 58 00:02:51,000 --> 00:02:54,000 Nepastebimai, su atminties klaidų programa 59 00:02:54,000 --> 00:02:56,000 vis dar gali sudaryti švariai 60 00:02:56,000 --> 00:02:58,000 ir gali vis dar atrodo, dirbti teisingai 61 00:02:58,000 --> 00:03:01,000 nes jums pavyko gauti pasisekė didžiąją laiko dalį. 62 00:03:01,000 --> 00:03:04,000 Po kelių sėkmingų rezultatų " 63 00:03:04,000 --> 00:03:07,000 galite tiesiog manote, kad kritimo iš kompiuterio FLUKE, 64 00:03:07,000 --> 00:03:10,000 bet kompiuteris niekada neklysta. 65 00:03:10,000 --> 00:03:13,000 >> Veikia Valgrind gali padėti jums sekti matomų atminties klaidų priežastis 66 00:03:13,000 --> 00:03:18,000 taip pat rasti pasiklysti klaidų jums net nereikia dar žinoti. 67 00:03:18,000 --> 00:03:22,000 Kiekvieną kartą, kai Valgrind aptinka problemą, jis spausdina informaciją apie tai, ką pastebėjo. 68 00:03:22,000 --> 00:03:24,000 Kiekvienas elementas yra gana trumpas ir atžarus - 69 00:03:24,000 --> 00:03:27,000 šaltinis linija neteisėto instrukcijų, kokia yra problema, 70 00:03:27,000 --> 00:03:30,000 ir šiek tiek informacijos apie atminties dalyvauja 71 00:03:30,000 --> 00:03:34,000 bet dažnai tai pakankamai informacijos, kad nukreipti savo dėmesį į tinkamą vietą. 72 00:03:34,000 --> 00:03:37,000 Čia yra pavyzdys Valgrind veikia Buggy programą 73 00:03:37,000 --> 00:03:40,000 tai daro negaliojantį paskaityti krūvos atminties. 74 00:03:40,000 --> 00:03:49,000 Mes nematome kompiliavimo klaidų ar įspėjimų. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, klaida santrauka sako, kad yra dvi klaidas - 76 00:03:53,000 --> 00:03:56,000 dviejų negalioja skaityta dydžio 4 - baitų, kad yra. 77 00:03:56,000 --> 00:04:01,000 Blogus skaito įvyko invalid_read.c pagrindinė funkcija, 78 00:04:01,000 --> 00:04:04,000 16 on-line ir on line 19 2. pirmas. 79 00:04:04,000 --> 00:04:06,000 Pažvelkime pateiktą kodą. 80 00:04:06,000 --> 00:04:11,000 Atrodo, kad pirmojo kvietimo į printf bando skaityti vieną int pro mūsų atminties bloko pabaigos. 81 00:04:11,000 --> 00:04:13,000 Jei pažvelgsime atgal Valgrind produkcijos, 82 00:04:13,000 --> 00:04:16,000 matome, kad Valgrind būtent tai mums pasakė,. 83 00:04:16,000 --> 00:04:19,000 Adresas, kuriuo bandote skaityti prasideda 0 baitų 84 00:04:19,000 --> 00:04:22,000 praeityje dydis 16 baitų paketo pabaigos - 85 00:04:22,000 --> 00:04:25,000 keturi 32-bit int, kad mes skiriamos. 86 00:04:25,000 --> 00:04:29,000 Tai reiškia, kad mes stengiamės skaityti adresas prasideda mūsų bloko pabaigos, 87 00:04:29,000 --> 00:04:32,000 kaip mes matome mūsų blogą printf skambučio. 88 00:04:32,000 --> 00:04:36,000 Dabar, neteisingas skaityta gali ne atrodo, kad spręsti didelis, 89 00:04:36,000 --> 00:04:39,000 bet jei jūs naudojate, kad duomenys kontroliuoti savo programą srautas 90 00:04:39,000 --> 00:04:42,000 Pavyzdžiui, dalis, jei pareiškimas arba kilpiniai 91 00:04:42,000 --> 00:04:45,000 tada viskas gali tyliai pūti. 92 00:04:45,000 --> 00:04:47,000 Žiūrėti, kaip aš galiu paleisti invalid_read programą 93 00:04:47,000 --> 00:04:50,000 ir niekas iš paprastų atsitinka. 94 00:04:50,000 --> 00:04:52,000 Baisu, ar ne? 95 00:04:52,000 --> 00:04:56,000 >> Dabar pažvelkime šiek tiek daugiau rūšių klaidų, kad jūs gali susidurti savo kodą, 96 00:04:56,000 --> 00:04:59,000 ir mes pamatyti, kaip Valgrind aptinka juos. 97 00:04:59,000 --> 00:05:01,000 Mes tik pamačiau apie invalid_read pavyzdys 98 00:05:01,000 --> 00:05:04,000 todėl dabar galime patikrinti invalid_write. 99 00:05:04,000 --> 00:05:09,000 Vėlgi, jokių klaidų ar įspėjimų rengimo. 100 00:05:09,000 --> 00:05:12,000 Gerai, Valgrind sako, kad yra dvi klaidos šioje programoje - 101 00:05:12,000 --> 00:05:15,000 ir invalid_write invalid_read. 102 00:05:15,000 --> 00:05:18,000 Leiskite patikrinti šį kodą. 103 00:05:18,000 --> 00:05:21,000 Atrodo, kad mes gavome iš klasikinių strlen pridėjus vieną klaidą egzempliorių. 104 00:05:21,000 --> 00:05:24,000 Kodas nėra malloc papildomą baitas vietos 105 00:05:24,000 --> 00:05:26,000 / 0 pobūdžio, 106 00:05:26,000 --> 00:05:30,000 g kopija nuėjo rašyti jį ssubstrlen "CS50 uolų!" 107 00:05:30,000 --> 00:05:33,000 jis parašė 1 baitas praeityje mūsų blokas pabaigoje. 108 00:05:33,000 --> 00:05:36,000 Invalid_read ateina, kai mes darome mūsų raginimą printf. 109 00:05:36,000 --> 00:05:40,000 Printf baigiasi skaityti neteisingą atmintį, kai jis skaito / 0 pobūdį 110 00:05:40,000 --> 00:05:43,000 , kaip jis žiūri į šią interneto eilutės pabaigoje, tai spauda. 111 00:05:43,000 --> 00:05:45,000 Bet visa tai pabėgo Valgrind. 112 00:05:45,000 --> 00:05:48,000 Matome, kad sugauti invalid_write STR kopijos 113 00:05:48,000 --> 00:05:51,000 pagrindinis 11 eilutėje, ir invalid_read printf dalis. 114 00:05:51,000 --> 00:05:54,000 Rock on, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Vėlgi, tai gali ne atrodo baisi. 116 00:05:57,000 --> 00:06:00,000 Mes galime paleisti šią programą daugiau ir daugiau už Valgrind 117 00:06:00,000 --> 00:06:03,000 ir nematau jokių klaidų simptomus. 118 00:06:03,000 --> 00:06:06,000 >> Tačiau pažvelkime šiek tiek variacijos 119 00:06:06,000 --> 00:06:09,000 kaip ką gali gauti tikrai blogai. 120 00:06:09,000 --> 00:06:14,000 Taigi, suteiktas, mes piktnaudžiauja dalykų daugiau nei tik šiek tiek šio kodekso. 121 00:06:14,000 --> 00:06:17,000 Mes tik patalpų skyrimo krūvos dvi eilutes 122 00:06:17,000 --> 00:06:19,000 CS50 uolų ilgis, 123 00:06:19,000 --> 00:06:22,000 šį kartą, prisiminti / 0 charakterį. 124 00:06:22,000 --> 00:06:25,000 Bet tada mes mesti super ilgą eilutę į atminties bloką 125 00:06:25,000 --> 00:06:27,000 kad S yra nukreipta į. 126 00:06:27,000 --> 00:06:30,000 Kokį poveikį, kad į atminties bloką, kad T atkreipia dėmesį į? 127 00:06:30,000 --> 00:06:34,000 Na, jei T į atmintį, kad tik šalia S 128 00:06:34,000 --> 00:06:37,000 tik po to, 129 00:06:37,000 --> 00:06:39,000 tada mes galime turėti raštu per T. 130 00:06:39,000 --> 00:06:41,000 Leiskite paleisti šį kodą. 131 00:06:41,000 --> 00:06:43,000 Pažvelgti į tai, kas atsitiko. 132 00:06:43,000 --> 00:06:47,000 Stygos mes saugomi mūsų Heap blokų abiejų išspausdinti teisingai. 133 00:06:47,000 --> 00:06:49,000 Nieko atrodo neteisinga. 134 00:06:49,000 --> 00:06:52,000 Tačiau grįžkime į mūsų kodą ir 135 00:06:52,000 --> 00:06:55,000 komentaras iš linijos, kur mes kopijuojate CS50 uolų 136 00:06:55,000 --> 00:06:59,000 į antrąjį atminties bloko, atkreipė dėmesį į t. 137 00:06:59,000 --> 00:07:02,000 Dabar, kai mes paleisti šį kodą, turėtume 138 00:07:02,000 --> 00:07:06,000 matyti tik pirmojo atminties bloko turinys atsispausdinti. 139 00:07:06,000 --> 00:07:09,000 Oho, net jei mes ne g kopija 140 00:07:09,000 --> 00:07:12,000 bet į antrąjį krūvos blokas simbolių, vienas nurodė, kad T 141 00:07:12,000 --> 00:07:15,000 mes gauname atspausdinti. 142 00:07:15,000 --> 00:07:18,000 Iš tiesų, eilutė įspraustas į mūsų pirmojo bloko 143 00:07:18,000 --> 00:07:21,000 išplito pirmąjį bloką ir į antrojo bloko, 144 00:07:21,000 --> 00:07:23,000 todėl viskas atrodo normalu. 145 00:07:23,000 --> 00:07:26,000 Valgrind, nors pasakoja tikra istorija. 146 00:07:26,000 --> 00:07:28,000 Čia mes eiti. 147 00:07:28,000 --> 00:07:32,000 Tiems negalioja skaito ir rašo. 148 00:07:32,000 --> 00:07:36,000 >> Pažvelkime kitos klaidos natūra pavyzdys. 149 00:07:36,000 --> 00:07:39,000 Čia mes kažką daryti, o gaila. 150 00:07:39,000 --> 00:07:41,000 Mes patraukti vietos už krūvą int, 151 00:07:41,000 --> 00:07:45,000 ir mes inicijuoti int žymeklį - P - rodytų tos vietos. 152 00:07:45,000 --> 00:07:48,000 Tačiau, nors mūsų žymeklis yra rengiami, 153 00:07:48,000 --> 00:07:52,000 duomenys, kad ji nukreipta į visų šiukšlių yra tos krūvos. 154 00:07:52,000 --> 00:07:55,000 Taigi, kai mes įkelti į int i, kad duomenys, 155 00:07:55,000 --> 00:07:57,000 mes techniškai inicijuoti i, 156 00:07:57,000 --> 00:08:00,000 tačiau mes tai darome su junk duomenų. 157 00:08:00,000 --> 00:08:03,000 Skambutis tvirtinti, kuris yra patogus derinimo makro 158 00:08:03,000 --> 00:08:06,000 apibrėžta taikliai pavadino teigti, bibliotekoje, 159 00:08:06,000 --> 00:08:09,000 bus nutrauktas programą, jei jos ir bandymų nepavyko. 160 00:08:09,000 --> 00:08:11,000 Tai reiškia, kad, jei aš yra ne 0. 161 00:08:11,000 --> 00:08:14,000 Priklausomai nuo to, kas buvo krūvos erdvėje, atkreipė dėmesį į P, 162 00:08:14,000 --> 00:08:18,000 ši programa gali dirbti kartais ir nepavyksta kitu metu. 163 00:08:18,000 --> 00:08:20,000 Jei jis veikia, mes tiesiog gauti pasisekė. 164 00:08:20,000 --> 00:08:24,000 Kompiliatorių bus ne sugauti šią klaidą, bet Valgrind tikrai bus. 165 00:08:24,000 --> 00:08:28,000 Ten mes matome klaidą, kylančią iš mūsų, kad šiukšlių duomenų naudojimo. 166 00:08:28,000 --> 00:08:32,000 >> Kai jums skirti krūvos atminties, bet ne deallocate arba jį išlaisvinti, 167 00:08:32,000 --> 00:08:34,000 , kuris yra vadinamas nuotėkio. 168 00:08:34,000 --> 00:08:37,000 Mažos, trumpaamžių programa, kuri veikia ir nedelsiant išėjimus, 169 00:08:37,000 --> 00:08:39,000 nutekėjimas yra gana nekenksmingi, 170 00:08:39,000 --> 00:08:42,000 bet didesnio dydžio ir / arba ilgaamžiškumą projekto, 171 00:08:42,000 --> 00:08:46,000 net nedidelis nutekėjimas gali dar labiau padidinti pagrindinių į kažką. 172 00:08:46,000 --> 00:08:49,000 CS50, mes tikimės, kad jūs 173 00:08:49,000 --> 00:08:51,000 atlaisvinti visi krūvos atminties, kad jums paskirti rūpintis, 174 00:08:51,000 --> 00:08:54,000 nes mes norime, kad jūs statyti įgūdžius, kad galėtų tinkamai tvarkyti rankiniu būdu 175 00:08:54,000 --> 00:08:56,000 reikalaujama pagal C. 176 00:08:56,000 --> 00:08:59,000 Norėdami tai padaryti, jūsų programa turėtų būti tiksli 177 00:08:59,000 --> 00:09:03,000 "vienas su vienu" korespondencija tarp malloc ir nemokami vietiniai skambučiai. 178 00:09:03,000 --> 00:09:06,000 Laimei, Valgrind gali padėti jums su atminties nutekėjimas. 179 00:09:06,000 --> 00:09:09,000 Čia yra spinduliuojamieji programa, vadinama leak.c, kad skiria 180 00:09:09,000 --> 00:09:13,000 vieta ant krūvos, rašo prie jo, bet jis neatleidžia. 181 00:09:13,000 --> 00:09:16,000 Mes kaupia jį Markė ir veikti pagal Valgrind 182 00:09:16,000 --> 00:09:18,000 ir matome, kad, o mes neturime jokių atminties klaidų, 183 00:09:18,000 --> 00:09:20,000 mes turime vieną nutekėjimą. 184 00:09:20,000 --> 00:09:23,000 Yra 16 baitų neabejotinai prarado, 185 00:09:23,000 --> 00:09:27,000 tai reiškia, kad rodyklė į tos atminties nebuvo taikymo sritį, kai išėjo programa. 186 00:09:27,000 --> 00:09:30,000 Dabar Valgrind nėra suteikti mums informacijos apie nuotėkio toną, 187 00:09:30,000 --> 00:09:35,000 bet jei mes tai mažai dėmesį į tai, kad ji suteikia į savo ataskaitą, apačioje 188 00:09:35,000 --> 00:09:38,000 Pakartotinas - nuotėkio patikrinti = visas 189 00:09:38,000 --> 00:09:41,000 pamatyti pilną informaciją apie nutekėjo atminties, 190 00:09:41,000 --> 00:09:44,000 mes gauti daugiau informacijos. 191 00:09:44,000 --> 00:09:46,000 Dabar krūvos santraukoje, 192 00:09:46,000 --> 00:09:50,000 Valgrind mums sako, kur iš pradžių buvo skirta atminties, kad buvo prarasta. 193 00:09:50,000 --> 00:09:52,000 Lygiai taip pat, kaip mes žinome iš šaltinio kodą, 194 00:09:52,000 --> 00:09:55,000 Valgrind informuoja mus, kad mes nutekėjo atmintį 195 00:09:55,000 --> 00:09:58,000 skiriama su skambučio į malloc linija 8 iš leak.c 196 00:09:58,000 --> 00:10:00,000 pagrindinės funkcijos. 197 00:10:00,000 --> 00:10:02,000 Gana madingas. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind skirsto nutekėjimas per šiuos terminus: 199 00:10:04,000 --> 00:10:07,000 Neabejotinai prarado - tai krūva skirta atmintis 200 00:10:07,000 --> 00:10:10,000 kuriuos programa nebeturi rodyklę. 201 00:10:10,000 --> 00:10:14,000 Valgrind žino, kad jūs kažkada buvo žymeklį, tačiau nuo to laiko neteko stebėti jį. 202 00:10:14,000 --> 00:10:17,000 Ši atmintis yra tikrai nutekėjo. 203 00:10:17,000 --> 00:10:20,000 Netiesiogiai prarado - tai krūva skirta atmintis 204 00:10:20,000 --> 00:10:24,000 tik patarimų, į jį taip pat gali būti prarasti. 205 00:10:24,000 --> 00:10:27,000 Pavyzdžiui, jei jūs praradote savo žymiklį į susietą sąrašą pirmojo mazgo, 206 00:10:27,000 --> 00:10:30,000 tada pati pirmą mazgas būtų neabejotinai prarado, 207 00:10:30,000 --> 00:10:34,000 , o visus vėlesnius mazgai netiesiogiai prarasti. 208 00:10:34,000 --> 00:10:37,000 Galbūt prarado - tai krūva skirta atmintis 209 00:10:37,000 --> 00:10:41,000 į kurią Valgrind negali būti tikras, ar yra žymeklis, arba ne. 210 00:10:41,000 --> 00:10:44,000 Vis dar pasiekiamas yra krūva skirta atmintis 211 00:10:44,000 --> 00:10:47,000 programa dar turi išvežimo žymeklį, 212 00:10:47,000 --> 00:10:50,000 kuris paprastai reiškia, kad pasaulinį kintamąjį atkreipia dėmesį į tai. 213 00:10:50,000 --> 00:10:53,000 Norėdami patikrinti, ar šių sandarumą, jūs taip pat turėsite galimybę 214 00:10:53,000 --> 00:10:55,000 - Vis dar pasiekiamas = taip 215 00:10:55,000 --> 00:10:58,000 į savo pritaikymo Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Šie skirtingi atvejai gali reikalauti skirtingas strategijas valyti, kvėpinti, 217 00:11:01,000 --> 00:11:05,000 bet nutekėjimas turėtų būti pašalintos. 218 00:11:05,000 --> 00:11:08,000 Deja, nustatantis nutekėjimas gali būti sunku padaryti, 219 00:11:08,000 --> 00:11:11,000 nuo neteisingų skambučiai į nemokamai gali susprogdinti savo programą. 220 00:11:11,000 --> 00:11:14,000 Pavyzdžiui, jei mes žiūrime invalid_free.c 221 00:11:14,000 --> 00:11:18,000 matome, netinkamą atminties deallocation pavyzdys. 222 00:11:18,000 --> 00:11:21,000 Koks turėtų būti vienas kvietimas išlaisvinti visą bloką 223 00:11:21,000 --> 00:11:24,000 atminties nurodė į int_block 224 00:11:24,000 --> 00:11:27,000 vietoj to bandoma išlaisvinti kiekvieną int dydžio skyrių 225 00:11:27,000 --> 00:11:29,000 atminties atskirai. 226 00:11:29,000 --> 00:11:32,000 Žlugs katastrofiškai. 227 00:11:32,000 --> 00:11:34,000 Boom! , Kas yra klaida. 228 00:11:34,000 --> 00:11:36,000 Tai tikrai nėra gerai. 229 00:11:36,000 --> 00:11:39,000 Jei esate pakimba su tokios klaidos, nors ir jūs nežinote, kur ieškoti, 230 00:11:39,000 --> 00:11:41,000 patenka atgal į jūsų naujas geriausias draugas. 231 00:11:41,000 --> 00:11:44,000 Jūs atspėjote - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, kaip visada, tiksliai žino, ko iki. 233 00:11:47,000 --> 00:11:50,000 Dėl ALLOC ir be skaičius nesutampa. 234 00:11:50,000 --> 00:11:52,000 Mes turime 1 ALLOC ir 4 išlaisvina. 235 00:11:52,000 --> 00:11:55,000 Ir Valgrind taip pat pasakoja, kur pirmas blogas skambutis nemokamas 236 00:11:55,000 --> 00:11:58,000 vienas, kuris sukėlė Išsiplėtus tiekiamos iš 237 00:11:58,000 --> 00:12:00,000 linija 16. 238 00:12:00,000 --> 00:12:03,000 Kaip matote, blogas ragina NEMOKAMAI tikrai blogai, 239 00:12:03,000 --> 00:12:05,000 taigi mes rekomenduojame leisti savo programos nutekėjimą 240 00:12:05,000 --> 00:12:08,000 , o jūs dirbate gauti funkcionalumas teisinga. 241 00:12:08,000 --> 00:12:12,000 Pradėti ieškoti sandarumą tik po to, kai jūsų programa veikia tinkamai, 242 00:12:12,000 --> 00:12:14,000 be jokių kitų klaidų. 243 00:12:14,000 --> 00:12:16,000 >> Ir tai viskas, mes turime šį vaizdo įrašą. 244 00:12:16,000 --> 00:12:18,000 Dabar, ką jūs laukiate? 245 00:12:18,000 --> 00:12:21,000 Bėgti, dabar Valgrind jūsų programoje. 246 00:12:21,000 --> 00:12:25,000 Mano vardas yra Nate Hardison. Tai CS50. [CS50.TV]