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, Hārvarda universitātes] 3 00:00:05,000 --> 00:00:07,000 Tas ir CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Daži no visgrūtākajiem bugs C programmu 5 00:00:10,000 --> 00:00:13,000 nāk no piesavināšanos atmiņas. 6 00:00:13,000 --> 00:00:15,000 Ir daudz veidu, kādos skrūvējamu lietām augšu, 7 00:00:15,000 --> 00:00:17,000 tostarp piešķirot nepareizu atmiņas apjomu, 8 00:00:17,000 --> 00:00:20,000 aizmirstot inicializēt mainīgie, 9 00:00:20,000 --> 00:00:23,000 rakstiski pirms vai pēc tā beigām bufera, 10 00:00:23,000 --> 00:00:25,000 un atbrīvojot saglabāt atmiņas vairākas reizes. 11 00:00:25,000 --> 00:00:28,000 Simptomi svārstās no intermitējošām avārijām 12 00:00:28,000 --> 00:00:30,000 līdz noslēpumaini pārrakstīti vērtībām, 13 00:00:30,000 --> 00:00:34,000 bieži vietās un laikos ir tālu no sākotnējās kļūdas. 14 00:00:34,000 --> 00:00:37,000 Tracing novēroto problēmu atpakaļ uz bāzes cēloni 15 00:00:37,000 --> 00:00:39,000 var apstrīdēt, 16 00:00:39,000 --> 00:00:42,000 bet par laimi tur ir noderīga programma, ko sauc Valgrind 17 00:00:42,000 --> 00:00:44,000 kas var darīt daudz, lai palīdzētu. 18 00:00:44,000 --> 00:00:47,000 >> Palaižot programmu ar Valgrind lai ļautu 19 00:00:47,000 --> 00:00:50,000 plaša pārbaude kaudze atmiņas sadalījumu un piekļuves. 20 00:00:50,000 --> 00:00:53,000 Kad Valgrind atrod problēmu, tas dod jums tūlītēju, 21 00:00:53,000 --> 00:00:56,000 tieša informācija, kas ļauj 22 00:00:56,000 --> 00:00:58,000 vieglāk atrast un novērst problēmu. 23 00:00:58,000 --> 00:01:01,000 Valgrind arī atskaites par mazāk nāvīga atmiņas jautājumiem, 24 00:01:01,000 --> 00:01:04,000 piemēram, atmiņas noplūde, piešķirot kaudze atmiņu, 25 00:01:04,000 --> 00:01:07,000 un aizmirstot, lai atbrīvotu to. 26 00:01:07,000 --> 00:01:10,000 Patīk mūsu kompilators, šķindēt, mūsu debugger, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind ir bezmaksas programmatūra, un tā ir uzstādīta uz ierīces. 28 00:01:14,000 --> 00:01:16,000 Valgrind darbojas uz binārā izpildāmā, 29 00:01:16,000 --> 00:01:20,000 nav jūsu C vai.. h pirmkods failus, 30 00:01:20,000 --> 00:01:23,000 tāpēc, ka Jums ir apkopojusi up-to-date kopiju jūsu programmā 31 00:01:23,000 --> 00:01:25,000 izmantojot šķindēt vai Make. 32 00:01:25,000 --> 00:01:28,000 Tad, rādīt savu programmu saskaņā Valgrind var būt 33 00:01:28,000 --> 00:01:32,000 tik vienkārši, kā tikai apzīmētāju standarta programmu komandu ar vārdu Valgrind, 34 00:01:32,000 --> 00:01:35,000 kas sākas līdz Valgrind un palaiž programmu iekšpusē no tā. 35 00:01:35,000 --> 00:01:38,000 Kad sākas, Valgrind dara dažas sarežģītas 36 00:01:38,000 --> 00:01:41,000 jiggering konfigurēt izpildāmo atmiņas pārbaudēm, 37 00:01:41,000 --> 00:01:44,000 lai tā varētu veikt mazliet piecelties un darbojas. 38 00:01:44,000 --> 00:01:48,000 Programma pēc tam izpildīt normāli, tas būtu daudz lēnāk, 39 00:01:48,000 --> 00:01:52,000 un kad tā ir pabeigta, Valgrind būs drukāt kopsavilkumu par savu atmiņas izmantošanu. 40 00:01:52,000 --> 00:01:58,000 Ja viss noritēs labi, tas izskatās kaut kas līdzīgs šim: 41 00:01:58,000 --> 00:02:01,000 Šajā gadījumā / clean_program. 42 00:02:01,000 --> 00:02:04,000 ir ceļš uz programmu es gribu, lai palaistu. 43 00:02:04,000 --> 00:02:06,000 Un, kamēr tas viens neveic nekādus argumentus, 44 00:02:06,000 --> 00:02:09,000 ja tas tā man vienkārši sadiegšana tos uz beigām, komandu, kā ierasts. 45 00:02:09,000 --> 00:02:12,000 Tīrs programma ir tikai dumjš maz programmu es radīju 46 00:02:12,000 --> 00:02:15,000 kas sadala telpu bloka Ints uz kaudzes, 47 00:02:15,000 --> 00:02:19,000 likts dažas vērtības iekšpusē no viņiem, un atbrīvo visu bloku. 48 00:02:19,000 --> 00:02:23,000 Tas ir tas, ko jūs šaušana, bez kļūdām un nav noplūdes. 49 00:02:23,000 --> 00:02:27,000 >> Vēl viens svarīgs rādītājs ir kopējais skaits piešķirto baitu. 50 00:02:27,000 --> 00:02:32,000 Atkarībā no programmas, ja jūsu piešķīrumi ir Jo megabaiti vai augstāka, 51 00:02:32,000 --> 00:02:34,000 jūs, iespējams, dara kaut ko nepareizi. 52 00:02:34,000 --> 00:02:37,000 Vai tu nevajadzīgi glabāšanai dublikātus? 53 00:02:37,000 --> 00:02:40,000 Vai jums, izmantojot kaudze glabāšanai, kad labāk būtu izmantot kaudze? 54 00:02:40,000 --> 00:02:43,000 Tātad, atmiņas kļūdas var būt patiesi ļauns. 55 00:02:43,000 --> 00:02:46,000 Jo vairāk redzami tie rada iespaidīgu avāriju, 56 00:02:46,000 --> 00:02:49,000 bet pat tad tas joprojām var būt grūti precīzi noteikt 57 00:02:49,000 --> 00:02:51,000 ko tieši noveda pie avārijas. 58 00:02:51,000 --> 00:02:54,000 Vairāk iekšēji, programma ar atmiņas kļūda 59 00:02:54,000 --> 00:02:56,000 joprojām var sastādīt tīri 60 00:02:56,000 --> 00:02:58,000 un vēl var šķist strādāt pareizi 61 00:02:58,000 --> 00:03:01,000 jo jums izdevās iegūt laimīgs lielāko daļu laika. 62 00:03:01,000 --> 00:03:04,000 Pēc vairāku "veiksmīgu rezultātu," 63 00:03:04,000 --> 00:03:07,000 Jūs varētu vienkārši domāju, ka avārija ir parazīts no datora, 64 00:03:07,000 --> 00:03:10,000 bet dators nekad nepareizi. 65 00:03:10,000 --> 00:03:13,000 >> Darboties Valgrind var palīdzēt jums izsekot cēloni redzamu atmiņas kļūdas 66 00:03:13,000 --> 00:03:18,000 kā arī atrast lurking kļūdas jums nav pat vēl zināt. 67 00:03:18,000 --> 00:03:22,000 Katru reizi Valgrind atrod problēmu, tas drukā informāciju par to, ko tā ir norādījusi. 68 00:03:22,000 --> 00:03:24,000 Katra vienība ir diezgan kodolīgs - 69 00:03:24,000 --> 00:03:27,000 avots līnija pārkāpēja instrukciju, kāda problēma ir, 70 00:03:27,000 --> 00:03:30,000 un maz informācijas par iesaistītā atmiņu - 71 00:03:30,000 --> 00:03:34,000 bet bieži vien tas ir pietiekami daudz informācijas, lai jūsu uzmanību uz pareizo vietu. 72 00:03:34,000 --> 00:03:37,000 Šeit ir par Valgrind piemērs darbojas buggy programmu 73 00:03:37,000 --> 00:03:40,000 kas dara nederīgu palasīt kaudze atmiņu. 74 00:03:40,000 --> 00:03:49,000 Mēs redzam nekādas kļūdas vai brīdinājumus apkopošanai. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, kļūda kopsavilkums saka, ka ir divas kļūdas - 76 00:03:53,000 --> 00:03:56,000 2 nederīgs lasījumi 4 izmēra - baiti, kas ir. 77 00:03:56,000 --> 00:04:01,000 Ļaunus skan radās galvenā funkcija invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 pirmais uz līnijas 16 un par 19 līnijā. 79 00:04:04,000 --> 00:04:06,000 Pieņemsim apskatīt kodu. 80 00:04:06,000 --> 00:04:11,000 Izskatās pēc pirmā uzaicinājuma uz printf mēģina lasīt vienu int garām beigās mūsu atmiņas bloku. 81 00:04:11,000 --> 00:04:13,000 Ja mēs atskatāmies uz Valgrind produkcijai, 82 00:04:13,000 --> 00:04:16,000 mēs redzam, ka Valgrind mums teica tieši tā. 83 00:04:16,000 --> 00:04:19,000 Adrese mēs cenšamies lasīt sākas 0 baiti 84 00:04:19,000 --> 00:04:22,000 pagātnes beigām bloka izmērs 16 baiti - 85 00:04:22,000 --> 00:04:25,000 četri 32-bitu Ints ka mēs faktori. 86 00:04:25,000 --> 00:04:29,000 Tas nozīmē, ka adrese mēs cenšamies lasīt sākas tieši gada beigās mūsu bloku, 87 00:04:29,000 --> 00:04:32,000 tāpat kā mēs redzam mūsu sliktā printf zvanu. 88 00:04:32,000 --> 00:04:36,000 Tagad, nederīgs lasījumi varētu šķist, ka liels ir galā, 89 00:04:36,000 --> 00:04:39,000 bet, ja jūs izmantojat, ka dati, lai kontrolētu plūsmu jūsu programmā - 90 00:04:39,000 --> 00:04:42,000 Piemēram, kas ir daļa no, ja paziņojums vai cilpa - 91 00:04:42,000 --> 00:04:45,000 tad lietas var klusi iet slikti. 92 00:04:45,000 --> 00:04:47,000 Skaties kā es varu palaist invalid_read programmu 93 00:04:47,000 --> 00:04:50,000 un nekas neparasts notiek. 94 00:04:50,000 --> 00:04:52,000 Biedējošu, vai ne? 95 00:04:52,000 --> 00:04:56,000 >> Tagad, pieņemsim apskatīt dažas vairāku veidu kļūdas, kas jums varētu rasties jūsu kodu, 96 00:04:56,000 --> 00:04:59,000 un mēs redzēsim, cik Valgrind atklāj tos. 97 00:04:59,000 --> 00:05:01,000 Mēs tikko redzējām piemēru par invalid_read, 98 00:05:01,000 --> 00:05:04,000 tāpēc tagad pieņemsim izbraukšana invalid_write. 99 00:05:04,000 --> 00:05:09,000 Atkal, nekādas kļūdas vai brīdinājumi apkopošanas. 100 00:05:09,000 --> 00:05:12,000 Labi, Valgrind saka, ka ir divas kļūdas šajā programmā - 101 00:05:12,000 --> 00:05:15,000 un invalid_write un invalid_read. 102 00:05:15,000 --> 00:05:18,000 Pieņemsim pārbaudīt šo kodu. 103 00:05:18,000 --> 00:05:21,000 Izskatās, ka mēs esam ieguvuši gadījums klasiskās strlen plus viens bug. 104 00:05:21,000 --> 00:05:24,000 Kodeksā nav malloc papildu baitu telpas 105 00:05:24,000 --> 00:05:26,000 par / 0 raksturu, 106 00:05:26,000 --> 00:05:30,000 tāpēc, kad str kopiju devās rakstīt to ssubstrlen "CS50 akmeņiem!" 107 00:05:30,000 --> 00:05:33,000 tā rakstīja 1 baits garām beigās mūsu bloku. 108 00:05:33,000 --> 00:05:36,000 The invalid_read nāk, kad mēs padarītu mūsu zvanu uz printf. 109 00:05:36,000 --> 00:05:40,000 Printf nonāks lasījumā nederīgu atmiņu, kad tas skan / 0 rakstzīmi 110 00:05:40,000 --> 00:05:43,000 kā tas izskatās beigās šajā E virknes tā drukāšanu. 111 00:05:43,000 --> 00:05:45,000 Bet neviens no tā izbēguši Valgrind. 112 00:05:45,000 --> 00:05:48,000 Mēs redzam, ka tas nozvejotas invalid_write kā daļu no str kopijas 113 00:05:48,000 --> 00:05:51,000 uz galveno 11 līnijas, un invalid_read ir daļa no printf. 114 00:05:51,000 --> 00:05:54,000 Rock, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Atkal, tas varētu šķist liels darījumu. 116 00:05:57,000 --> 00:06:00,000 Mēs varam palaist šo programmu vairāk un vairāk ārpus Valgrind 117 00:06:00,000 --> 00:06:03,000 un neredzu nevienu kļūdu simptomus. 118 00:06:03,000 --> 00:06:06,000 >> Tomēr, aplūkosim nedaudz variācijas, lai redzētu 119 00:06:06,000 --> 00:06:09,000 kā lietas var iegūt patiešām slikti. 120 00:06:09,000 --> 00:06:14,000 Tātad, kas piešķirts, mēs ļaunprātīgi lietas vairāk nekā tikai mazliet šajā kodu. 121 00:06:14,000 --> 00:06:17,000 Mēs esam tikai piešķirot vietu uz kaudzes uz divām stīgām 122 00:06:17,000 --> 00:06:19,000 garums CS50 akmeņiem, 123 00:06:19,000 --> 00:06:22,000 šoreiz, atceroties / 0 raksturu. 124 00:06:22,000 --> 00:06:25,000 Bet tad mēs iemest super garumā virknes uz atmiņas bloku 125 00:06:25,000 --> 00:06:27,000 ka S ir vērsta uz. 126 00:06:27,000 --> 00:06:30,000 Kādas sekas būs, kas ir par atmiņas bloku ka T norāda uz? 127 00:06:30,000 --> 00:06:34,000 Nu, ja T norāda uz atmiņu, kas ir tikai blakus S, 128 00:06:34,000 --> 00:06:37,000 nāk tikai pēc tam, 129 00:06:37,000 --> 00:06:39,000 tad mēs varētu būt rakstīts vairāk nekā daļu no T. 130 00:06:39,000 --> 00:06:41,000 Pieņemsim palaist šo kodu. 131 00:06:41,000 --> 00:06:43,000 Paskaties, kas notika. 132 00:06:43,000 --> 00:06:47,000 Stīgas mēs glabājas mūsu kaudze blokus gan varot būt izdrukāt pareizi. 133 00:06:47,000 --> 00:06:49,000 Nekas, šķiet nepareizi vispār. 134 00:06:49,000 --> 00:06:52,000 Tomēr, iesim atpakaļ uz mūsu kodu un 135 00:06:52,000 --> 00:06:55,000 komentēt līniju, kur mēs kopēt CS50 ieži 136 00:06:55,000 --> 00:06:59,000 uz otro atmiņas bloku, norādīja uz t. 137 00:06:59,000 --> 00:07:02,000 Tagad, kad mēs palaist šo kodu mēs būtu 138 00:07:02,000 --> 00:07:06,000 redzēt tikai tās pirmās atmiņas bloku saturs izdrukāt. 139 00:07:06,000 --> 00:07:09,000 Paga, lai gan mēs neesam ielā kopija 140 00:07:09,000 --> 00:07:12,000 Par jebkuru otro kaudze bloku rakstzīmes, viens norādīja uz pa T, 141 00:07:12,000 --> 00:07:15,000 mēs izdrukāt. 142 00:07:15,000 --> 00:07:18,000 Patiešām, stīgu mēs iepildīta mūsu pirmajā blokā 143 00:07:18,000 --> 00:07:21,000 ieņēma pirmo bloku un vienā otrā bloka, 144 00:07:21,000 --> 00:07:23,000 padarot viss šķiet normāli. 145 00:07:23,000 --> 00:07:26,000 Valgrind, lai gan, stāsta mums patieso stāstu. 146 00:07:26,000 --> 00:07:28,000 Tur mums iet. 147 00:07:28,000 --> 00:07:32,000 Visiem tiem nederīgs lasa un raksta. 148 00:07:32,000 --> 00:07:36,000 >> Apskatīsim piemēru cita veida kļūdas. 149 00:07:36,000 --> 00:07:39,000 Te mēs kaut ko diezgan žēl. 150 00:07:39,000 --> 00:07:41,000 Mēs paķert vietu int uz kaudzes, 151 00:07:41,000 --> 00:07:45,000 un mēs sāktu int rādītāju - p - lai norādītu uz šo vietu. 152 00:07:45,000 --> 00:07:48,000 Taču, kamēr mūsu rādītājs ir inicializēts, 153 00:07:48,000 --> 00:07:52,000 dati, ka tas norāda uz tikko ir kāds junk ir, ka daļa no kaudzes. 154 00:07:52,000 --> 00:07:55,000 Tātad, kad mēs slodze ka datus int i, 155 00:07:55,000 --> 00:07:57,000 mēs tehniski inicializēt I, 156 00:07:57,000 --> 00:08:00,000 bet mēs tik ar junk datiem. 157 00:08:00,000 --> 00:08:03,000 Aicinājumu aizstāvēt, kas ir ērts atkļūdošanas makro 158 00:08:03,000 --> 00:08:06,000 definēts trāpīgi nosaukts aizstāvēt bibliotēkas, 159 00:08:06,000 --> 00:08:09,000 tiks apturēta programma, ja tās testa apstākļos neizdodas. 160 00:08:09,000 --> 00:08:11,000 Tas ir, ja es nav 0. 161 00:08:11,000 --> 00:08:14,000 Atkarībā no tā, kāda bija kaudze telpā, norādīja uz P, 162 00:08:14,000 --> 00:08:18,000 Šī programma varētu strādāt reizēm un nespēj citos laikos. 163 00:08:18,000 --> 00:08:20,000 Ja tas darbojas, mēs esam tikai kļūst laimīgs. 164 00:08:20,000 --> 00:08:24,000 Kompilators nesapratu šo kļūdu, bet Valgrind pārliecināts gribu. 165 00:08:24,000 --> 00:08:28,000 Tur mēs redzam kļūdas, kas izriet no mūsu izmantošanu ka junk datiem. 166 00:08:28,000 --> 00:08:32,000 >> Kad jūs piešķirt kaudze atmiņu, bet nav deallocate to vai to atbrīvotu, 167 00:08:32,000 --> 00:08:34,000 ka sauc noplūde. 168 00:08:34,000 --> 00:08:37,000 Par nelielu, īslaicīgu programma, kas darbojas un uzreiz izejām, 169 00:08:37,000 --> 00:08:39,000 noplūde ir diezgan nekaitīgi, 170 00:08:39,000 --> 00:08:42,000 bet par projektu lielāka izmēra un / vai ilgmūžību, 171 00:08:42,000 --> 00:08:46,000 pat neliela noplūde var pagatavot kaut ko lielu. 172 00:08:46,000 --> 00:08:49,000 Par CS50, mēs sagaidām, ka jūs 173 00:08:49,000 --> 00:08:51,000 rūpēties par atbrīvojot visu kaudze atmiņas, kas jums piešķirt, 174 00:08:51,000 --> 00:08:54,000 jo mēs vēlamies, lai jūs veidot prasmes, lai pareizi rīkotos manuālo procesu 175 00:08:54,000 --> 00:08:56,000 pieprasa C. 176 00:08:56,000 --> 00:08:59,000 Lai to izdarītu, jūsu programma būtu precīza 177 00:08:59,000 --> 00:09:03,000 viens pret vienu sarakste starp malloc un bezmaksas zvanus. 178 00:09:03,000 --> 00:09:06,000 Par laimi, Valgrind var jums palīdzēt ar atmiņas noplūdes pārāk. 179 00:09:06,000 --> 00:09:09,000 Šeit ir caurs programma, ko sauc leak.c kas iedalīti 180 00:09:09,000 --> 00:09:13,000 Vieta uz kaudzes, raksta tā, bet ne to atbrīvotu. 181 00:09:13,000 --> 00:09:16,000 Mēs apkopotu to ar Marka un palaist to zem Valgrind, 182 00:09:16,000 --> 00:09:18,000 un mēs redzam, ka, lai gan mums nav atmiņas kļūdas, 183 00:09:18,000 --> 00:09:20,000 mums ir viena noplūde. 184 00:09:20,000 --> 00:09:23,000 Ir 16 baiti galīgi zaudējis, 185 00:09:23,000 --> 00:09:27,000 kas nozīmē, ka rādītājs uz šo atmiņu nebija joma, kad programma iziet. 186 00:09:27,000 --> 00:09:30,000 Tagad, Valgrind nedod mums ton informāciju par noplūdi, 187 00:09:30,000 --> 00:09:35,000 bet, ja mēs šo nedaudz piezīmi, ka tas dod atpakaļ uz leju par savu ziņojumu 188 00:09:35,000 --> 00:09:38,000 lai uzsāktu ar - noplūdes pārbaudīt = pilna 189 00:09:38,000 --> 00:09:41,000 lai redzētu pilnu informāciju par noplūda atmiņa, 190 00:09:41,000 --> 00:09:44,000 mēs iegūtu vairāk informācijas. 191 00:09:44,000 --> 00:09:46,000 Tagad, kaudze kopsavilkumā, 192 00:09:46,000 --> 00:09:50,000 Valgrind stāsta mums, kur atmiņas, kas tika zaudēta sākotnēji tika piešķirti. 193 00:09:50,000 --> 00:09:52,000 Tāpat kā mēs zinām no skatoties pirmkodu, 194 00:09:52,000 --> 00:09:55,000 Valgrind informē mūs, ka mēs noplūda atmiņu 195 00:09:55,000 --> 00:09:58,000 piešķirtas ar aicinājumu malloc uz leak.c 8 Line 196 00:09:58,000 --> 00:10:00,000 galvenajā funkciju. 197 00:10:00,000 --> 00:10:02,000 Diezgan švītīgs. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind categorizes noplūdi, izmantojot šos terminus: 199 00:10:04,000 --> 00:10:07,000 Galīgi zaudējis - tas ir kaudzes piešķirti atmiņa 200 00:10:07,000 --> 00:10:10,000 uz kurām programma vairs nav rādītājs. 201 00:10:10,000 --> 00:10:14,000 Valgrind zina, ka jūs reiz bija rādītāju, bet kopš tā laika ir zaudējis dziesmu no tā. 202 00:10:14,000 --> 00:10:17,000 Šī atmiņa ir noteikti noplūdis. 203 00:10:17,000 --> 00:10:20,000 Netieši zaudējis - tas ir kaudzes piešķirti atmiņa 204 00:10:20,000 --> 00:10:24,000 ar kuriem vienīgais norādes uz to arī tiek zaudēti. 205 00:10:24,000 --> 00:10:27,000 Piemēram, ja esat pazaudējis savu rādītāju uz pirmo mezgla saistītajā sarakstā, 206 00:10:27,000 --> 00:10:30,000 tad pirmais mezgls pati būtu galīgi zaudējis, 207 00:10:30,000 --> 00:10:34,000 bet visus turpmākos mezgli būtu netieši zaudēts. 208 00:10:34,000 --> 00:10:37,000 Iespējams zaudējis - tas ir kaudzes piešķirti atmiņa 209 00:10:37,000 --> 00:10:41,000 uz kuru Valgrind nevar būt pārliecināts, vai ir rādītājs, vai ne. 210 00:10:41,000 --> 00:10:44,000 Joprojām sasniedzama ir kaudze piešķirti atmiņa 211 00:10:44,000 --> 00:10:47,000 uz kuru programma vēl ir rādītāju pie izejas, 212 00:10:47,000 --> 00:10:50,000 kas parasti nozīmē, ka globālā mainīgā norāda uz to. 213 00:10:50,000 --> 00:10:53,000 Lai pārbaudītu šo noplūdes, jūs arī ir jāiekļauj iespēja 214 00:10:53,000 --> 00:10:55,000 - Joprojām-sasniedzams = jā 215 00:10:55,000 --> 00:10:58,000 Jūsu piesaukšana no Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Šie dažādie gadījumi varētu prasīt dažādas stratēģijas, lai tīrīšanas tos, 217 00:11:01,000 --> 00:11:05,000 bet noplūde būtu jālikvidē. 218 00:11:05,000 --> 00:11:08,000 Diemžēl, nosaka noplūdes var būt grūti to darīt, 219 00:11:08,000 --> 00:11:11,000 jo nepareizi zvani uz bezmaksas var uzspridzināt savu programmu. 220 00:11:11,000 --> 00:11:14,000 Piemēram, ja mēs skatāmies uz invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 mēs redzam piemēru slikti atmiņas deallocation. 222 00:11:18,000 --> 00:11:21,000 Kas būtu viens zvans, lai atbrīvotu visu bloku 223 00:11:21,000 --> 00:11:24,000 atmiņas, ko uzrādīja int_block, 224 00:11:24,000 --> 00:11:27,000 ir nevis kļuvis mēģinājums atbrīvot katru int izmēra sadaļu 225 00:11:27,000 --> 00:11:29,000 no atmiņas individuāli. 226 00:11:29,000 --> 00:11:32,000 Tas nebūs katastrofāli. 227 00:11:32,000 --> 00:11:34,000 Bums! Kas kļūda. 228 00:11:34,000 --> 00:11:36,000 Tas noteikti nav laba. 229 00:11:36,000 --> 00:11:39,000 Ja jūs esat iestrēdzis ar šāda veida kļūdas, lai gan, un jūs nezināt, kur meklēt, 230 00:11:39,000 --> 00:11:41,000 krist atpakaļ uz savu jauno labāko draugu. 231 00:11:41,000 --> 00:11:44,000 Jūs uzminējāt - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, kā vienmēr, zina, ko tieši ir atkarīgs. 233 00:11:47,000 --> 00:11:50,000 Ar alloc un bezmaksas skaits nesakrīt augšu. 234 00:11:50,000 --> 00:11:52,000 Mēs esam ieguvuši 1 alloc un 4 atbrīvo. 235 00:11:52,000 --> 00:11:55,000 Un Valgrind arī stāsta mums, kur pirmo slikto bezmaksas zvans - 236 00:11:55,000 --> 00:11:58,000 viens, kas izraisīja blowup - nāk no - 237 00:11:58,000 --> 00:12:00,000 līnija 16. 238 00:12:00,000 --> 00:12:03,000 Kā jūs redzat, slikti zvani uz bezmaksas ir patiešām slikti, 239 00:12:03,000 --> 00:12:05,000 tāpēc mēs iesakām ļaujot jūsu programma noplūdi 240 00:12:05,000 --> 00:12:08,000 kamēr jūs strādājat par iegūt funkcionalitāti pareizs. 241 00:12:08,000 --> 00:12:12,000 Sākt meklēt noplūdes tikai pēc jūsu programma darbojas pareizi, 242 00:12:12,000 --> 00:12:14,000 bez jebkādām citām kļūdām. 243 00:12:14,000 --> 00:12:16,000 >> Un tas ir viss, ko mēs esam ieguvuši par šo video. 244 00:12:16,000 --> 00:12:18,000 Tagad, ko jūs gaida? 245 00:12:18,000 --> 00:12:21,000 Iet palaist Valgrind par savām programmām tiesības tagad. 246 00:12:21,000 --> 00:12:25,000 Mans vārds ir Nate Hardison. Tas ir CS50. [CS50.TV]