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, Chuo Kikuu cha Harvard] 3 00:00:05,000 --> 00:00:07,000 Hii ni CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Baadhi ya mende ngumu zaidi katika mipango ya C 5 00:00:10,000 --> 00:00:13,000 kuja kutoka usimamiaji mbovu wa kumbukumbu. 6 00:00:13,000 --> 00:00:15,000 Kuna idadi kubwa ya njia ya kufaidika mambo up, 7 00:00:15,000 --> 00:00:17,000 ikiwa ni pamoja na kugawa kiasi ya makosa ya kumbukumbu, 8 00:00:17,000 --> 00:00:20,000 kusahau initialize vigezo, 9 00:00:20,000 --> 00:00:23,000 kuandika kabla au baada ya mwisho wa buffer, 10 00:00:23,000 --> 00:00:25,000 na kumkomboa kutunza kumbukumbu mara nyingi. 11 00:00:25,000 --> 00:00:28,000 dalili mbalimbali kutoka shambulio vipindi 12 00:00:28,000 --> 00:00:30,000 kwa maadili ya mysteriously overwritten, 13 00:00:30,000 --> 00:00:34,000 mara nyingi katika sehemu na nyakati mbali kuondolewa kutoka katika makosa ya awali. 14 00:00:34,000 --> 00:00:37,000 Hazieleweki tatizo aliona nyuma sababu ya msingi mzizi 15 00:00:37,000 --> 00:00:39,000 inaweza kuwa changamoto, 16 00:00:39,000 --> 00:00:42,000 lakini bahati nzuri kuna mpango kusaidia aitwaye Valgrind 17 00:00:42,000 --> 00:00:44,000 ambayo inaweza kufanya mengi kusaidia. 18 00:00:44,000 --> 00:00:47,000 >> Wewe kukimbia chini ya mpango Valgrind ili kuwawezesha 19 00:00:47,000 --> 00:00:50,000 kina kuangalia ya mgao wa kumbukumbu chungu na wanapata. 20 00:00:50,000 --> 00:00:53,000 Wakati Valgrind hutambua tatizo, anakupa haraka, 21 00:00:53,000 --> 00:00:56,000 moja kwa moja habari kwamba utapata 22 00:00:56,000 --> 00:00:58,000 zaidi kupata urahisi na kurekebisha tatizo. 23 00:00:58,000 --> 00:01:01,000 Valgrind pia taarifa juu ya masuala ya chini mauti kumbukumbu, 24 00:01:01,000 --> 00:01:04,000 kama vile kumbukumbu uvujaji, kugawa lundo kumbukumbu, 25 00:01:04,000 --> 00:01:07,000 na kusahau ya bure yake. 26 00:01:07,000 --> 00:01:10,000 Kama compiler yetu, Clang, katika debugger yetu, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind ni programu za bure, na ni imewekwa kwenye appliance. 28 00:01:14,000 --> 00:01:16,000 Valgrind anaendesha binary executable yako, 29 00:01:16,000 --> 00:01:20,000 si yako c. au. files chanzo h kificho, 30 00:01:20,000 --> 00:01:23,000 hivyo kuwa na uhakika kuwa compiled nakala up-to-date ya mpango wako 31 00:01:23,000 --> 00:01:25,000 kutumia Clang au kufanya. 32 00:01:25,000 --> 00:01:28,000 Kisha, mbio programu yako chini ya Valgrind inaweza kuwa 33 00:01:28,000 --> 00:01:32,000 rahisi kama tu prefixing kiwango mpango amri na Valgrind neno, 34 00:01:32,000 --> 00:01:35,000 ambayo kuanza juu Valgrind na anaendesha programu ndani yake. 35 00:01:35,000 --> 00:01:38,000 Wakati wa kuanza, Valgrind gani baadhi tata 36 00:01:38,000 --> 00:01:41,000 jiggering configure executable kwa hundi kumbukumbu, 37 00:01:41,000 --> 00:01:44,000 hivyo inaweza kuchukua kidogo kuamka na kukimbia. 38 00:01:44,000 --> 00:01:48,000 Mpango huo basi nitafanya kawaida, kuwa ni taratibu zaidi, 39 00:01:48,000 --> 00:01:52,000 na wakati atamaliza, Valgrind itakuwa magazeti muhtasari wa kumbukumbu matumizi yake. 40 00:01:52,000 --> 00:01:58,000 Kama yote inakwenda vizuri, itakuwa kuangalia kitu kama hii: 41 00:01:58,000 --> 00:02:01,000 Katika kesi hii, /. Clean_program 42 00:02:01,000 --> 00:02:04,000 ni njia ya mpango nataka kukimbia. 43 00:02:04,000 --> 00:02:06,000 Na wakati mmoja hii haina kuchukua hoja yoyote, 44 00:02:06,000 --> 00:02:09,000 kama alivyofanya mimi d tu tack yao ya mwisho wa amri kama kawaida. 45 00:02:09,000 --> 00:02:12,000 Mpango safi ni tu silly kidogo mpango nilianzisha 46 00:02:12,000 --> 00:02:15,000 kwamba kutenga nafasi kwa block ya ints juu ya chungu, 47 00:02:15,000 --> 00:02:19,000 kuweka maadili baadhi ndani yao, na frees block nzima. 48 00:02:19,000 --> 00:02:23,000 Hii ni nini ni risasi kwa, makosa hakuna uvujaji na hakuna. 49 00:02:23,000 --> 00:02:27,000 >> Mwingine metric muhimu ni jumla ya idadi ya ka zilizotengwa. 50 00:02:27,000 --> 00:02:32,000 Kutegemea mpango, kama mgao yako ni katika megabaiti au ya juu, 51 00:02:32,000 --> 00:02:34,000 pengine wewe kufanya kitu kibaya. 52 00:02:34,000 --> 00:02:37,000 Je unnecessarily hifadhi marudio? 53 00:02:37,000 --> 00:02:40,000 Je, unatumia chungu kwa ajili ya kuhifadhi, wakati itakuwa bora kutumia stack? 54 00:02:40,000 --> 00:02:43,000 Hivyo, kumbukumbu makosa unaweza kuwa kweli maovu. 55 00:02:43,000 --> 00:02:46,000 ndio zaidi overt kusababisha shambulio kuvutia, 56 00:02:46,000 --> 00:02:49,000 lakini hata basi bado unaweza kuwa vigumu pinpoint 57 00:02:49,000 --> 00:02:51,000 nini hasa ulisababisha ajali. 58 00:02:51,000 --> 00:02:54,000 Zaidi hila na njama zilizotengenezwa, mpango na makosa kumbukumbu 59 00:02:54,000 --> 00:02:56,000 bado anaweza kukusanya cleanly 60 00:02:56,000 --> 00:02:58,000 na bado anaweza kuonekana kazi ipasavyo 61 00:02:58,000 --> 00:03:01,000 kwa sababu wewe imeweza kupata bahati zaidi ya muda. 62 00:03:01,000 --> 00:03:04,000 Baada ya kadhaa "matokeo ya mafanikio," 63 00:03:04,000 --> 00:03:07,000 unaweza tu kufikiri kwamba ajali ni fluke ya kompyuta, 64 00:03:07,000 --> 00:03:10,000 lakini kompyuta ni kamwe makosa. 65 00:03:10,000 --> 00:03:13,000 >> Mbio Valgrind inaweza kukusaidia kufuatilia chini sababu ya makosa inayoonekana kumbukumbu 66 00:03:13,000 --> 00:03:18,000 kama vile kupata lurking makosa huna hata bado kujua juu. 67 00:03:18,000 --> 00:03:22,000 Kila wakati Valgrind hutambua tatizo, ni Prints taarifa kuhusu ni nini aliona. 68 00:03:22,000 --> 00:03:24,000 Kila kipengele ni uungwana terse - 69 00:03:24,000 --> 00:03:27,000 line chanzo cha mafundisho offending, nini suala hilo ni, 70 00:03:27,000 --> 00:03:30,000 na info kidogo juu ya kumbukumbu wanaohusika - 71 00:03:30,000 --> 00:03:34,000 lakini mara nyingi ni ya kutosha habari kuelekeza mawazo yako mahali pa haki. 72 00:03:34,000 --> 00:03:37,000 Hapa ni mfano wa Valgrind mbio juu ya mpango Buggy 73 00:03:37,000 --> 00:03:40,000 kwamba hana kusoma batili ya kumbukumbu chungu. 74 00:03:40,000 --> 00:03:49,000 Sisi kuona makosa hakuna maonyo au katika mkusanyiko. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, muhtasari kosa anasema kuwa kuna makosa mawili - 76 00:03:53,000 --> 00:03:56,000 mbili batili wasomaji wa kawaida 4 - ka, kwamba ni. 77 00:03:56,000 --> 00:04:01,000 Wote mbaya anasoma ilitokea katika kazi kuu ya invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 kwanza katika mstari wa 16 na ya pili juu ya mstari 19. 79 00:04:04,000 --> 00:04:06,000 Hebu tuangalie code. 80 00:04:06,000 --> 00:04:11,000 Inaonekana kama ya kwanza mwito kwa printf inajaribu kusoma moja int zamani mwisho wa kumbukumbu block yetu. 81 00:04:11,000 --> 00:04:13,000 Kama sisi kuangalia nyuma katika pato la Valgrind, 82 00:04:13,000 --> 00:04:16,000 tunaona kwamba Valgrind alituambia hasa ile. 83 00:04:16,000 --> 00:04:19,000 anuani ya sisi ni kujaribu kusoma kuanza ka 0 84 00:04:19,000 --> 00:04:22,000 nyuma mwisho wa block ya kawaida 16 ka - 85 00:04:22,000 --> 00:04:25,000 nne ya 32-bit ints kwamba sisi zilizotengwa. 86 00:04:25,000 --> 00:04:29,000 Hiyo ni, anuani tulikuwa kujaribu kusoma kuanza kulia katika mwisho wa kuzuia yetu, 87 00:04:29,000 --> 00:04:32,000 tu kama sisi kuona katika wito wetu mbaya printf. 88 00:04:32,000 --> 00:04:36,000 Sasa, batili wasomaji wanaweza kuonekana kama kwamba kubwa ya mpango huo, 89 00:04:36,000 --> 00:04:39,000 lakini kama wewe ni kutumia data kwamba kudhibiti mtiririko wa mpango wako - 90 00:04:39,000 --> 00:04:42,000 kwa mfano, kama sehemu ya kama maelezo au kitanzi - 91 00:04:42,000 --> 00:04:45,000 mambo yanaweza kwenda mbaya kimya. 92 00:04:45,000 --> 00:04:47,000 Kuangalia jinsi naweza kuendesha programu invalid_read 93 00:04:47,000 --> 00:04:50,000 na chochote nje ya kawaida hutokea. 94 00:04:50,000 --> 00:04:52,000 Inatisha, huh? 95 00:04:52,000 --> 00:04:56,000 >> Sasa, hebu tuangalie baadhi ya aina zaidi ya makosa ambayo unaweza kukutana katika code yako, 96 00:04:56,000 --> 00:04:59,000 na tutaweza kuona jinsi Valgrind hutambua yao. 97 00:04:59,000 --> 00:05:01,000 Sisi tu aliona mfano wa invalid_read, 98 00:05:01,000 --> 00:05:04,000 hivyo sasa hebu angalia invalid_write. 99 00:05:04,000 --> 00:05:09,000 Tena, hakuna makosa au maonyo katika mkusanyiko. 100 00:05:09,000 --> 00:05:12,000 Okay, Valgrind anasema kwamba kuna makosa mawili katika mpango huu - 101 00:05:12,000 --> 00:05:15,000 na invalid_write na invalid_read. 102 00:05:15,000 --> 00:05:18,000 Hebu angalia hii code. 103 00:05:18,000 --> 00:05:21,000 Inaonekana kama sisi tumepewa mfano wa strlen classic plus moja mdudu. 104 00:05:21,000 --> 00:05:24,000 code haina malloc Byte ziada wa nafasi 105 00:05:24,000 --> 00:05:26,000 kwa tabia / 0, 106 00:05:26,000 --> 00:05:30,000 hivyo wakati nakala str akaenda kuandika katika ssubstrlen "miamba cs50!" 107 00:05:30,000 --> 00:05:33,000 ni aliandika 1 Byte zamani mwisho wa kuzuia yetu. 108 00:05:33,000 --> 00:05:36,000 invalid_read inakuja wakati sisi kufanya wito wetu kwa printf. 109 00:05:36,000 --> 00:05:40,000 Printf mwisho juu ya kusoma kumbukumbu batili wakati anasoma / 0 tabia 110 00:05:40,000 --> 00:05:43,000 kama inaonekana katika mwisho wa kamba hii E ni uchapishaji. 111 00:05:43,000 --> 00:05:45,000 Lakini hakuna hii alitoroka Valgrind. 112 00:05:45,000 --> 00:05:48,000 Tunaona kwamba hawakupata invalid_write kama sehemu ya nakala str 113 00:05:48,000 --> 00:05:51,000 kwenye mstari wa 11 kuu, na invalid_read ni sehemu ya printf. 114 00:05:51,000 --> 00:05:54,000 Rock juu, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Tena, hii inaweza kuonekana kama mpango kubwa. 116 00:05:57,000 --> 00:06:00,000 Tunaweza kuendesha programu hii tena na tena nje ya Valgrind 117 00:06:00,000 --> 00:06:03,000 na wala kuona dalili zozote makosa. 118 00:06:03,000 --> 00:06:06,000 >> Hata hivyo, hebu angalia tofauti kidogo ya hii kuona 119 00:06:06,000 --> 00:06:09,000 jinsi mambo wanaweza kupata mbaya kweli kweli. 120 00:06:09,000 --> 00:06:14,000 Hivyo, nafasi, sisi ni abusing mambo zaidi kuliko kidogo tu katika kanuni hii. 121 00:06:14,000 --> 00:06:17,000 Sisi ni tu kugawa nafasi kwenye chungu kwa masharti mawili 122 00:06:17,000 --> 00:06:19,000 urefu wa miamba cs50, 123 00:06:19,000 --> 00:06:22,000 wakati huu, wakikumbuka / 0 tabia. 124 00:06:22,000 --> 00:06:25,000 Lakini basi sisi kutupa katika string super-muda mrefu ndani ya kuzuia kumbukumbu 125 00:06:25,000 --> 00:06:27,000 S ni kwamba akizungumzia. 126 00:06:27,000 --> 00:06:30,000 Nini athari itakuwa kwamba kuwa juu ya kuzuia kumbukumbu kwamba Simu pointi? 127 00:06:30,000 --> 00:06:34,000 Naam, kama T pointi kwa kumbukumbu kwamba tu karibu na S, 128 00:06:34,000 --> 00:06:37,000 kuja tu baada ya hayo, 129 00:06:37,000 --> 00:06:39,000 kisha sisi tupate kuwa imeandikwa juu ya sehemu ya T. 130 00:06:39,000 --> 00:06:41,000 Hebu kukimbia hii code. 131 00:06:41,000 --> 00:06:43,000 Kuangalia nini kilitokea. 132 00:06:43,000 --> 00:06:47,000 masharti sisi kuhifadhiwa katika vitalu yetu lundo wote alionekana kuwa na kuchapishwa kwa usahihi. 133 00:06:47,000 --> 00:06:49,000 Hakuna inaonekana vibaya wakati wote. 134 00:06:49,000 --> 00:06:52,000 Hata hivyo, hebu kwenda nyuma katika kanuni zetu na 135 00:06:52,000 --> 00:06:55,000 maoni nje mstari ambapo sisi nakala miamba cs50 136 00:06:55,000 --> 00:06:59,000 katika block pili kumbukumbu, alisema kwa t. 137 00:06:59,000 --> 00:07:02,000 Sasa, wakati sisi kukimbia hii code tunapaswa 138 00:07:02,000 --> 00:07:06,000 tu kuona yaliyomo ya kuzuia kwanza kumbukumbu magazeti nje. 139 00:07:06,000 --> 00:07:09,000 Ho, ingawa hatukuwa str nakala 140 00:07:09,000 --> 00:07:12,000 yoyote wahusika katika block pili chungu, alisema kwa moja na T, 141 00:07:12,000 --> 00:07:15,000 sisi kupata magazeti nje. 142 00:07:15,000 --> 00:07:18,000 Hakika, kamba sisi stuffed katika block wetu wa kwanza 143 00:07:18,000 --> 00:07:21,000 akaivamia block kwanza na katika block ya pili, 144 00:07:21,000 --> 00:07:23,000 kufanya kila kitu kuonekana ya kawaida. 145 00:07:23,000 --> 00:07:26,000 Valgrind, ingawa, inatuambia hadithi ya kweli. 146 00:07:26,000 --> 00:07:28,000 Kuna sisi kwenda. 147 00:07:28,000 --> 00:07:32,000 Wote wa wale batili anasoma na anaandika. 148 00:07:32,000 --> 00:07:36,000 >> Hebu tuangalie mfano wa aina nyingine ya ufisadi. 149 00:07:36,000 --> 00:07:39,000 Hapa sisi kufanya kitu bahati mbaya. 150 00:07:39,000 --> 00:07:41,000 Sisi kunyakua nafasi kwa int juu ya chungu, 151 00:07:41,000 --> 00:07:45,000 na sisi initialize pointer int - p - kwa uhakika na nafasi hiyo. 152 00:07:45,000 --> 00:07:48,000 Hata hivyo, wakati pointer yetu ni initialized, 153 00:07:48,000 --> 00:07:52,000 data kwamba ni akizungumzia tu ina chochote Junk ni katika sehemu hiyo ya chungu. 154 00:07:52,000 --> 00:07:55,000 Hivyo wakati sisi mzigo data kwamba katika int i, 155 00:07:55,000 --> 00:07:57,000 sisi kitaalam initialize i, 156 00:07:57,000 --> 00:08:00,000 lakini sisi kufanya hivyo pamoja na data Junk. 157 00:08:00,000 --> 00:08:03,000 wito kwa kudai, ambayo ni Handy debugging jumla 158 00:08:03,000 --> 00:08:06,000 inavyoelezwa katika maktaba aptly aitwaye kudai, 159 00:08:06,000 --> 00:08:09,000 mapenzi abort mpango kama mtihani wake hali inashindwa. 160 00:08:09,000 --> 00:08:11,000 Hiyo ni, kama i si 0. 161 00:08:11,000 --> 00:08:14,000 Kutegemea juu ya nini alikuwa katika nafasi chungu, alisema kwa p, 162 00:08:14,000 --> 00:08:18,000 mpango huu inaweza kufanya kazi wakati mwingine na kushindwa mara kwa mara nyingine. 163 00:08:18,000 --> 00:08:20,000 Kama ni kazi, sisi ni kupata tu bahati. 164 00:08:20,000 --> 00:08:24,000 compiler si kukamata kosa hili, lakini Valgrind mapenzi uhakika. 165 00:08:24,000 --> 00:08:28,000 Kuna sisi kuona makosa yanayotokana na matumizi yetu ya data kwamba Junk. 166 00:08:28,000 --> 00:08:32,000 >> Wakati wewe kutenga chungu kumbukumbu lakini si deallocate au huru yake, 167 00:08:32,000 --> 00:08:34,000 kiitwacho leak. 168 00:08:34,000 --> 00:08:37,000 Kwa wadogo, muda mfupi mpango kwamba anaendesha na mara exits, 169 00:08:37,000 --> 00:08:39,000 uvujaji ni uungwana wapole, 170 00:08:39,000 --> 00:08:42,000 lakini kwa ajili ya mradi wa ukubwa kubwa na / au longevity, 171 00:08:42,000 --> 00:08:46,000 hata leak ndogo inaweza kuzidisha katika kitu makubwa. 172 00:08:46,000 --> 00:08:49,000 Kwa CS50, hatuwezi kutarajia wewe 173 00:08:49,000 --> 00:08:51,000 utunzaji wa kumkomboa yote ya kumbukumbu chungu kwamba wewe kutenga, 174 00:08:51,000 --> 00:08:54,000 tangu tunataka kujenga stadi vizuri kushughulikia mchakato mwongozo 175 00:08:54,000 --> 00:08:56,000 inavyotakiwa na C. 176 00:08:56,000 --> 00:08:59,000 Kwa kufanya hivyo, mpango wako awe kamili 177 00:08:59,000 --> 00:09:03,000 moja kwa moja ya mawasiliano kati ya malloc na wito bure. 178 00:09:03,000 --> 00:09:06,000 Bahati nzuri, Valgrind inaweza kukusaidia na uvujaji kumbukumbu pia. 179 00:09:06,000 --> 00:09:09,000 Hapa ni mpango leaky kuitwa leak.c kwamba inatenga 180 00:09:09,000 --> 00:09:13,000 nafasi kwenye chungu, anaandika kwa hilo, lakini haina huru yake. 181 00:09:13,000 --> 00:09:16,000 Sisi ni pamoja na kukusanya Matokeo na kukimbia chini ya Valgrind, 182 00:09:16,000 --> 00:09:18,000 na sisi kuona kwamba, wakati tuna makosa kumbukumbu hakuna, 183 00:09:18,000 --> 00:09:20,000 sisi kufanya kuwa moja ya uvujaji. 184 00:09:20,000 --> 00:09:23,000 Kuna 16 ka dhahiri waliopotea, 185 00:09:23,000 --> 00:09:27,000 maana kwamba pointer kumbukumbu ambayo haikuwa katika wigo wakati mpango exited. 186 00:09:27,000 --> 00:09:30,000 Sasa, Valgrind hautupatii tani ya taarifa kuhusu leak, 187 00:09:30,000 --> 00:09:35,000 lakini kama sisi kufuata kumbuka hii kidogo kwamba anatoa chini kuelekea chini ya ripoti yake 188 00:09:35,000 --> 00:09:38,000 kwa rerun na - leak-kuangalia = kamili 189 00:09:38,000 --> 00:09:41,000 kuona maelezo kamili ya kumbukumbu kuvuja, 190 00:09:41,000 --> 00:09:44,000 tutaweza kupata habari zaidi. 191 00:09:44,000 --> 00:09:46,000 Sasa, katika muhtasari wa chungu, 192 00:09:46,000 --> 00:09:50,000 Valgrind inatuambia ambapo kumbukumbu aliyepotea awali zilizotengwa. 193 00:09:50,000 --> 00:09:52,000 Tu kama sisi kujua kutoka kuangalia katika chanzo code, 194 00:09:52,000 --> 00:09:55,000 Valgrind inatufahamisha ya kwamba sisi kuvuja kumbukumbu 195 00:09:55,000 --> 00:09:58,000 zilizotengwa kwa mwito wa malloc kwenye mstari 8 ya leak.c 196 00:09:58,000 --> 00:10:00,000 katika kazi kuu. 197 00:10:00,000 --> 00:10:02,000 Pretty nifty. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind categorizes uvujaji kwa kutumia sheria hizi: 199 00:10:04,000 --> 00:10:07,000 Dhahiri waliopotea - hii ni chungu zilizotengwa kumbukumbu 200 00:10:07,000 --> 00:10:10,000 ambayo mpango tena ina pointer. 201 00:10:10,000 --> 00:10:14,000 Valgrind anajua kwamba wewe mara moja alikuwa pointer lakini tangu waliopotea track yake. 202 00:10:14,000 --> 00:10:17,000 Kumbukumbu hii ni dhahiri kuvuja. 203 00:10:17,000 --> 00:10:20,000 Moja kwa moja walipoteza - hii ni chungu zilizotengwa kumbukumbu 204 00:10:20,000 --> 00:10:24,000 ambayo kuyatumia tu kwa hiyo pia ni kupotea. 205 00:10:24,000 --> 00:10:27,000 Kwa mfano, kama wewe waliopotea pointer yako na nodi ya kwanza ya orodha wanaohusishwa, 206 00:10:27,000 --> 00:10:30,000 kisha nodi kwanza yenyewe itakuwa dhahiri waliopotea, 207 00:10:30,000 --> 00:10:34,000 wakati nodes yoyote baadae itakuwa moja waliopotea. 208 00:10:34,000 --> 00:10:37,000 Uwezekano waliopotea - hii ni chungu zilizotengwa kumbukumbu 209 00:10:37,000 --> 00:10:41,000 ambayo Valgrind haiwezi kuwa na uhakika kama kuna pointer au la. 210 00:10:41,000 --> 00:10:44,000 Bado ni reachable lundo zilizotengwa kumbukumbu 211 00:10:44,000 --> 00:10:47,000 ambayo bado ina mpango pointer katika exit, 212 00:10:47,000 --> 00:10:50,000 ambayo kwa kawaida ina maana kwamba kimataifa variable pointi hiyo. 213 00:10:50,000 --> 00:10:53,000 Ili kuangalia kwa uvujaji hizi, itabidi pia kuwa ni pamoja na chaguo 214 00:10:53,000 --> 00:10:55,000 - Bado-reachable = ndiyo 215 00:10:55,000 --> 00:10:58,000 katika sala yako ya Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Hizi kesi mbalimbali wanaweza kuhitaji mikakati mbalimbali kwa ajili ya kusafisha yao juu, 217 00:11:01,000 --> 00:11:05,000 lakini uvujaji wanapaswa kuondolewa. 218 00:11:05,000 --> 00:11:08,000 Kwa bahati mbaya, fixing uvujaji inaweza kuwa vigumu kufanya, 219 00:11:08,000 --> 00:11:11,000 tangu sahihi wito kwa bure wanaweza kulipua programu yako. 220 00:11:11,000 --> 00:11:14,000 Kwa mfano, kama sisi kuangalia invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 tunaona mfano wa deallocation mbaya kumbukumbu. 222 00:11:18,000 --> 00:11:21,000 Kile lazima wito moja kwa huru block nzima 223 00:11:21,000 --> 00:11:24,000 ya kumbukumbu alisema kwa int_block, 224 00:11:24,000 --> 00:11:27,000 ina badala kuwa jaribio la kumwondolea kila sehemu int ukubwa 225 00:11:27,000 --> 00:11:29,000 ya kumbukumbu mmoja mmoja. 226 00:11:29,000 --> 00:11:32,000 Hii kushindwa catastrophically. 227 00:11:32,000 --> 00:11:34,000 Boom! Nini kosa. 228 00:11:34,000 --> 00:11:36,000 Hii ni dhahiri si nzuri. 229 00:11:36,000 --> 00:11:39,000 Kama wewe ni kukwama kwa aina hii ya makosa, ingawa, na huwezi kujua wapi kuangalia, 230 00:11:39,000 --> 00:11:41,000 kuanguka nyuma rafiki yako mpya bora. 231 00:11:41,000 --> 00:11:44,000 You guessed it - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, kama siku zote, anayejua hasa nini juu. 233 00:11:47,000 --> 00:11:50,000 makosa na alloc bure hayaoani up. 234 00:11:50,000 --> 00:11:52,000 Sisi tumepewa 1 alloc na 4 frees. 235 00:11:52,000 --> 00:11:55,000 Na Valgrind pia inatuambia ambapo kwanza mbaya bure wito - 236 00:11:55,000 --> 00:11:58,000 moja kwamba yalisababisha blowup - anakuja kutoka - 237 00:11:58,000 --> 00:12:00,000 mstari 16. 238 00:12:00,000 --> 00:12:03,000 Kama unaweza kuona, mbaya wito kwa huru ni mbaya kweli kweli, 239 00:12:03,000 --> 00:12:05,000 hivyo sisi kupendekeza kuruhusu mpango wako leak 240 00:12:05,000 --> 00:12:08,000 wakati wewe kazi kupata utendaji sahihi. 241 00:12:08,000 --> 00:12:12,000 Kuanza kuangalia kwa uvujaji tu baada ya mpango wako ni kazi vizuri, 242 00:12:12,000 --> 00:12:14,000 bila makosa yoyote nyingine. 243 00:12:14,000 --> 00:12:16,000 >> Na kwamba wote sisi tumepewa kwa video hii. 244 00:12:16,000 --> 00:12:18,000 Sasa ni wewe kusubiri? 245 00:12:18,000 --> 00:12:21,000 Nenda kukimbia Valgrind juu ya mipango yako sasa hivi. 246 00:12:21,000 --> 00:12:25,000 Jina langu ni Nate Hardison. Hii ni CS50. [CS50.TV]