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, Harvard University] 3 00:00:05,000 --> 00:00:07,000 To je CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Niektoré z najťažších chýb v programoch C 5 00:00:10,000 --> 00:00:13,000 pochádzajú z nezvládnutie pamäte. 6 00:00:13,000 --> 00:00:15,000 Existuje obrovské množstvo spôsobov, ako skrutka veci do poriadku, 7 00:00:15,000 --> 00:00:17,000 vrátane rozdelenia nesprávne množstvo pamäte, 8 00:00:17,000 --> 00:00:20,000 zabudol inicializovať premenné, 9 00:00:20,000 --> 00:00:23,000 písanie pred alebo po skončení pufri, 10 00:00:23,000 --> 00:00:25,000 a uvoľnenie udržať pamäť viackrát. 11 00:00:25,000 --> 00:00:28,000 Tieto príznaky sa pohybujú od prerušovaných pády 12 00:00:28,000 --> 00:00:30,000 k záhadne prepísaných hodnôt, 13 00:00:30,000 --> 00:00:34,000 často v miestach a časoch ďaleko vzdialených od pôvodného chyby. 14 00:00:34,000 --> 00:00:37,000 Trasovanie sledované problematiky späť na základnú príčinu 15 00:00:37,000 --> 00:00:39,000 môže byť náročné, 16 00:00:39,000 --> 00:00:42,000 ale našťastie je tu užitočné program nazvaný Valgrind 17 00:00:42,000 --> 00:00:44,000 ktoré môže urobiť veľa pomôcť. 18 00:00:44,000 --> 00:00:47,000 >> Spustenie programu pod Valgrind k tomu, aby 19 00:00:47,000 --> 00:00:50,000 Rozsiahla kontrola pridelenie haldy pamäte a prístupy. 20 00:00:50,000 --> 00:00:53,000 Pri Valgrind zistí problém, to vám dáva bezprostredné, 21 00:00:53,000 --> 00:00:56,000 priame informácie, ktoré vám umožnia 22 00:00:56,000 --> 00:00:58,000 ľahšie nájsť a opraviť problém. 23 00:00:58,000 --> 00:01:01,000 Valgrind tiež správy o menej smrtiaca problémy s pamäťou, 24 00:01:01,000 --> 00:01:04,000 ako úniky pamäte, prideľovanie pamäte haldy, 25 00:01:04,000 --> 00:01:07,000 a zabudol uvoľniť ju. 26 00:01:07,000 --> 00:01:10,000 Rovnako ako náš prekladač, klap, v našom debuggeru GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind je slobodný softvér, a je inštalovaný na zariadení. 28 00:01:14,000 --> 00:01:16,000 Valgrind beží na binárny spustiteľný súbor, 29 00:01:16,000 --> 00:01:20,000 nie je vaša. c alebo. h súbory zdrojových kódov, 30 00:01:20,000 --> 00:01:23,000 takže sa uistite, ste kompiloval up-to-date kópiu vášho programu 31 00:01:23,000 --> 00:01:25,000 pomocou rinčať alebo Make. 32 00:01:25,000 --> 00:01:28,000 Potom môže spustením programu podľa Valgrind byť 33 00:01:28,000 --> 00:01:32,000 tak jednoduché, ako len skratky štandardné programu príkaz so slovom Valgrind, 34 00:01:32,000 --> 00:01:35,000 ktorý sa spustí Valgrind a spustí program, vo vnútri nej. 35 00:01:35,000 --> 00:01:38,000 Pri spustení, Valgrind sa niektoré zložité 36 00:01:38,000 --> 00:01:41,000 jiggering nastaviť spustiteľný pre pamäťové kontroly, 37 00:01:41,000 --> 00:01:44,000 tak to môže trvať trochu sa dostať hore a beží. 38 00:01:44,000 --> 00:01:48,000 Program potom bude vykonávať normálne, či už je to oveľa pomalšie, 39 00:01:48,000 --> 00:01:52,000 a keď to skončí, bude Valgrind vytlačiť súhrn jeho využitie pamäte. 40 00:01:52,000 --> 00:01:58,000 Ak všetko pôjde dobre, bude to vyzerať nejako takto: 41 00:01:58,000 --> 00:02:01,000 V tomto prípade,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 je cesta k programu chcem spustiť. 43 00:02:04,000 --> 00:02:06,000 A aj keď to človek nemá žiadne argumenty, 44 00:02:06,000 --> 00:02:09,000 ak sa to som práve pripináčika je na konci tohto príkazu ako zvyčajne. 45 00:02:09,000 --> 00:02:12,000 Clean program je len hlúpa program, ktorý som vytvoril 46 00:02:12,000 --> 00:02:15,000 , Ktorá rozdeľuje priestor pre blok ints na halde, 47 00:02:15,000 --> 00:02:19,000 dať nejaké hodnoty v rámci nich, a uvoľní celý blok. 48 00:02:19,000 --> 00:02:23,000 To je to, čo natáčate pre, bez chýb a bez úniku. 49 00:02:23,000 --> 00:02:27,000 >> Ďalším dôležitým metrika je celkový počet pridelených bytov. 50 00:02:27,000 --> 00:02:32,000 V závislosti na programe, ak vaše pridelenie sú v MB alebo vyššia, 51 00:02:32,000 --> 00:02:34,000 ste pravdepodobne robíte niečo zle. 52 00:02:34,000 --> 00:02:37,000 Ste zbytočne ukladanie duplicitné? 53 00:02:37,000 --> 00:02:40,000 Používate haldy pre skladovanie, kedy by bolo lepšie použiť zásobník? 54 00:02:40,000 --> 00:02:43,000 Takže, chyby pamäte je naozaj zlý. 55 00:02:43,000 --> 00:02:46,000 Čím viac zjavné tie spôsobujú veľkolepé zrútenia, 56 00:02:46,000 --> 00:02:49,000 ale aj potom to môže ešte byť ťažké určiť 57 00:02:49,000 --> 00:02:51,000 čo presne viedlo k havárii. 58 00:02:51,000 --> 00:02:54,000 Viac zákerne, program s pamäťou chybou 59 00:02:54,000 --> 00:02:56,000 môže ešte zostaviť čisto 60 00:02:56,000 --> 00:02:58,000 a môže stále zdá pracovať správne 61 00:02:58,000 --> 00:03:01,000 pretože sa podarilo získať šťastie väčšinu času. 62 00:03:01,000 --> 00:03:04,000 Po niekoľkých "úspešných výsledkov," 63 00:03:04,000 --> 00:03:07,000 môžete len myslieť, že zrážka je náhoda v počítači, 64 00:03:07,000 --> 00:03:10,000 ale počítač sa nikdy nemýli. 65 00:03:10,000 --> 00:03:13,000 >> Beh Valgrind vám môže pomôcť vystopovať príčinu viditeľných chýb pamäte 66 00:03:13,000 --> 00:03:18,000 rovnako ako nájsť číha chyby, ktoré nie sú ešte ani vedieť. 67 00:03:18,000 --> 00:03:22,000 Zakaždým, keď Valgrind zistí problém, vytlačí informácie o tom, čo to pozorované. 68 00:03:22,000 --> 00:03:24,000 Každá položka je pomerne stručná - 69 00:03:24,000 --> 00:03:27,000 zdroj línie protiprávneho pokynu, čo je problém, 70 00:03:27,000 --> 00:03:30,000 a trochu info o zapojených pamäti - 71 00:03:30,000 --> 00:03:34,000 ale často je to dosť informácií, aby nasmerovať pozornosť na správnom mieste. 72 00:03:34,000 --> 00:03:37,000 Tu je príklad Valgrind beží na kočíku programu 73 00:03:37,000 --> 00:03:40,000 , Ktorý robí neplatný čítanie haldy pamäte. 74 00:03:40,000 --> 00:03:49,000 Vidíme žiadne chyby alebo varovania v kompilácii. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, chyba zhrnutie hovorí, že tam sú dve chyby - 76 00:03:53,000 --> 00:03:56,000 dva neplatné číta veľkosti 4 - bytov, že je. 77 00:03:56,000 --> 00:04:01,000 Obaja zlé číta došlo v hlavnej funkcie invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 prvý na riadku 16 a druhý na riadku 19. 79 00:04:04,000 --> 00:04:06,000 Poďme sa pozrieť na kód. 80 00:04:06,000 --> 00:04:11,000 Vyzerá to, že prvé volanie printf snaží prečítať jednu int za koncom nášho bloku pamäte. 81 00:04:11,000 --> 00:04:13,000 Ak sa pozrieme späť na výstupe Valgrind je, 82 00:04:13,000 --> 00:04:16,000 vidíme, že Valgrind nám povedal presne to. 83 00:04:16,000 --> 00:04:19,000 Sídlo snažíme čítať začne 0 bajtov 84 00:04:19,000 --> 00:04:22,000 za koncom bloku o veľkosti 16 bajtov - 85 00:04:22,000 --> 00:04:25,000 štyri 32-bitové ints že pridelené. 86 00:04:25,000 --> 00:04:29,000 To znamená, že adresa sa snažíme čítať začína hneď na konci nášho bloku, 87 00:04:29,000 --> 00:04:32,000 rovnako ako vidíme v našom zlom printf hovoru. 88 00:04:32,000 --> 00:04:36,000 Teraz by neplatná čitateľov zdať, že veľký problém, 89 00:04:36,000 --> 00:04:39,000 ale ak používate tieto dáta na riadenie toku programu - 90 00:04:39,000 --> 00:04:42,000 Napríklad ako súčasť if alebo loop - 91 00:04:42,000 --> 00:04:45,000 potom sa veci môžu ticho pokazí. 92 00:04:45,000 --> 00:04:47,000 Pozrite sa, ako môžem spustiť invalid_read programu 93 00:04:47,000 --> 00:04:50,000 a nič neobvyklé deje. 94 00:04:50,000 --> 00:04:52,000 Scary, čo? 95 00:04:52,000 --> 00:04:56,000 >> Teraz sa poďme pozrieť na niektoré ďalšie druhy chýb, ktoré sa môžu vyskytnúť v kóde, 96 00:04:56,000 --> 00:04:59,000 a uvidíme, ako Valgrind detekuje. 97 00:04:59,000 --> 00:05:01,000 Práve sme videli príklad s invalid_read, 98 00:05:01,000 --> 00:05:04,000 takže teraz poďme pozrieť o invalid_write. 99 00:05:04,000 --> 00:05:09,000 Opäť platí, že žiadne chyby alebo varovania v kompilácii. 100 00:05:09,000 --> 00:05:12,000 Dobre, Valgrind hovorí, že tam sú dve chyby v tomto programe - 101 00:05:12,000 --> 00:05:15,000 a invalid_write a invalid_read. 102 00:05:15,000 --> 00:05:18,000 Poďme sa pozrieť na tento kód. 103 00:05:18,000 --> 00:05:21,000 Vyzerá to, že máme inštanciu klasické strlen plus jeden bug. 104 00:05:21,000 --> 00:05:24,000 Kód nie je malloc navyše bajt priestoru 105 00:05:24,000 --> 00:05:26,000 pre / 0 charakteru, 106 00:05:26,000 --> 00:05:30,000 takže keď str kópie išla písať to na ssubstrlen "cs50 skaly!" 107 00:05:30,000 --> 00:05:33,000 to napísal 1 byte za koncom nášho bloku. 108 00:05:33,000 --> 00:05:36,000 The invalid_read prichádza, keď urobíme našu výzvu printf. 109 00:05:36,000 --> 00:05:40,000 Printf skončí čítanie neplatné pamäte pri čítaní / 0 znak 110 00:05:40,000 --> 00:05:43,000 ako to vyzerá na konci tohto E reťazec je tlač. 111 00:05:43,000 --> 00:05:45,000 Ale nič z toho unikol Valgrind. 112 00:05:45,000 --> 00:05:48,000 Je vidieť, že to zachytil invalid_write ako súčasť str kópie 113 00:05:48,000 --> 00:05:51,000 na riadku 11 hlavné, a invalid_read je súčasťou printf. 114 00:05:51,000 --> 00:05:54,000 Rock on, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Opäť, mohlo by to vyzerať ako veľký problém. 116 00:05:57,000 --> 00:06:00,000 Môžeme spustiť tento program znovu a znovu mimo Valgrind 117 00:06:00,000 --> 00:06:03,000 a nie je vidieť žiadne chybové príznaky. 118 00:06:03,000 --> 00:06:06,000 >> Avšak, poďme sa pozrieť na nepatrnú variácií tohto vidieť 119 00:06:06,000 --> 00:06:09,000 ako sa veci môžu naozaj zlé. 120 00:06:09,000 --> 00:06:14,000 Takže, udelené, sme zneužívajú veci viac ako len trochu v tomto kóde. 121 00:06:14,000 --> 00:06:17,000 Sme len prideľovanie priestor na halde pre dva reťazce 122 00:06:17,000 --> 00:06:19,000 dĺžka cs50 hornín, 123 00:06:19,000 --> 00:06:22,000 Tentoraz, keď si spomenul / 0 znak. 124 00:06:22,000 --> 00:06:25,000 Ale potom sme sa hodiť v super-dlhé reťazce do pamäťového bloku 125 00:06:25,000 --> 00:06:27,000 že S je ukazuje. 126 00:06:27,000 --> 00:06:30,000 Aký vplyv bude to mať na pamäti, že blok T odkazuje na? 127 00:06:30,000 --> 00:06:34,000 No, ak T poukazuje na pamäti, že to jednoducho vedľa S, 128 00:06:34,000 --> 00:06:37,000 prichádza tesne po nej, 129 00:06:37,000 --> 00:06:39,000 potom by sme mohli prepísať časť T. 130 00:06:39,000 --> 00:06:41,000 Poďme spustením tohto kódu. 131 00:06:41,000 --> 00:06:43,000 Pozrite sa na to, čo sa stalo. 132 00:06:43,000 --> 00:06:47,000 Reťazce sme uložené v našich haldy blokoch oboch zrejme tlačené správne. 133 00:06:47,000 --> 00:06:49,000 Nič sa zdá v poriadku vôbec. 134 00:06:49,000 --> 00:06:52,000 Avšak, vráťme sa do nášho kódu a 135 00:06:52,000 --> 00:06:55,000 komentár mimo riadok, kde sme kopírovať cs50 skaly 136 00:06:55,000 --> 00:06:59,000 do druhého bloku pamäte, ktorý by ukazoval t 137 00:06:59,000 --> 00:07:02,000 Teraz, keď sme sa spustiť tento kód, ktorý sme mali 138 00:07:02,000 --> 00:07:06,000 zobraziť iba obsah prvého bloku pamäte vytlačiť. 139 00:07:06,000 --> 00:07:09,000 Whoa, aj keď sme nemali str kópie 140 00:07:09,000 --> 00:07:12,000 všetky znaky do druhého bloku haldy, ten, na ktorý ukazuje T, 141 00:07:12,000 --> 00:07:15,000 dostaneme vytlačte. 142 00:07:15,000 --> 00:07:18,000 Naozaj, string sme napchal do nášho prvého bloku 143 00:07:18,000 --> 00:07:21,000 obsadil prvé blok a do druhého bloku, 144 00:07:21,000 --> 00:07:23,000 Vďaka všetko zdá normálne. 145 00:07:23,000 --> 00:07:26,000 Valgrind, keď nám hovorí skutočný príbeh. 146 00:07:26,000 --> 00:07:28,000 Tam ideme. 147 00:07:28,000 --> 00:07:32,000 Všetky tie neplatné číta a zapisuje. 148 00:07:32,000 --> 00:07:36,000 >> Poďme sa pozrieť na príklad iného druhu chyby. 149 00:07:36,000 --> 00:07:39,000 Tu urobíme niečo trochu nešťastným. 150 00:07:39,000 --> 00:07:41,000 Sme chytiť priestor pre int na halde, 151 00:07:41,000 --> 00:07:45,000 a my inicializácii int ukazovateľ - p - prejdite na tomto priestore. 152 00:07:45,000 --> 00:07:48,000 Avšak, zatiaľ čo naša ukazovateľ je inicializovaný, 153 00:07:48,000 --> 00:07:52,000 údaje, ktoré to poukazujú len sa čo nevyžiadanej je v tejto časti haldy. 154 00:07:52,000 --> 00:07:55,000 Takže keď sme sa načítať tieto dáta do int i, 155 00:07:55,000 --> 00:07:57,000 sme technicky inicializovať aj, 156 00:07:57,000 --> 00:08:00,000 ale my to s nevyžiadanou dát. 157 00:08:00,000 --> 00:08:03,000 Výzva presadiť, čo je šikovný ladenie makrá 158 00:08:03,000 --> 00:08:06,000 definované v výstižne pomenované uplatniť knižnice, 159 00:08:06,000 --> 00:08:09,000 preruší program, ak jeho skúšobnú stav zlyhá. 160 00:08:09,000 --> 00:08:11,000 To znamená, že ak je aj nie je 0. 161 00:08:11,000 --> 00:08:14,000 V závislosti na tom, čo bolo v haldy priestoru, ktorý by ukazoval p, 162 00:08:14,000 --> 00:08:18,000 tento program môže fungovať niekedy aj zlyhanie inokedy. 163 00:08:18,000 --> 00:08:20,000 Ak to funguje, sme len dostať šťastie. 164 00:08:20,000 --> 00:08:24,000 Kompilátor nebude chytiť túto chybu, ale Valgrind istí, že. 165 00:08:24,000 --> 00:08:28,000 Tu vidíme chybu vyplývajúce z našej použitia tohto nevyžiadanej údajov. 166 00:08:28,000 --> 00:08:32,000 >> Keď prideliť haldy pamäte, ale to nie je navrátiť, alebo uvoľniť ho, 167 00:08:32,000 --> 00:08:34,000 , Ktorá sa nazýva únik. 168 00:08:34,000 --> 00:08:37,000 Pre malé, krátkotrvajúci program, ktorý beží a okamžite východy, 169 00:08:37,000 --> 00:08:39,000 úniky sú pomerne neškodné, 170 00:08:39,000 --> 00:08:42,000 ale pre projekt väčšej veľkosti a / alebo dlhovekosť, 171 00:08:42,000 --> 00:08:46,000 aj malá netesnosť môže zhoršiť do niečoho hlavnej. 172 00:08:46,000 --> 00:08:49,000 Pre CS50, my očakávame, že 173 00:08:49,000 --> 00:08:51,000 postarať o uvoľnenie všetkých haldy pamäte, ktoré prideliť, 174 00:08:51,000 --> 00:08:54,000 pretože chceme, aby ste vybudovať zručnosti správne zvládnuť ručné proces 175 00:08:54,000 --> 00:08:56,000 vyžaduje C. 176 00:08:56,000 --> 00:08:59,000 Ak chcete tak urobiť, musí váš program mať presné 177 00:08:59,000 --> 00:09:03,000 one-to-one korešpondencie medzi malloc a bezplatná volanie. 178 00:09:03,000 --> 00:09:06,000 Našťastie, môže Valgrind pomôže s úniky pamäte taky. 179 00:09:06,000 --> 00:09:09,000 Tu je deravý program s názvom leak.c, že ​​prideľuje 180 00:09:09,000 --> 00:09:13,000 priestor na halde, píše, ale nie je to uvoľniť. 181 00:09:13,000 --> 00:09:16,000 Sme ho skompilovať s Make a spustite ho pod Valgrind, 182 00:09:16,000 --> 00:09:18,000 a vidíme, že, zatiaľ čo my máme žiadne chyby pamäti, 183 00:09:18,000 --> 00:09:20,000 máme jednu dieru. 184 00:09:20,000 --> 00:09:23,000 K dispozícii je 16 bytov definitívne stratil, 185 00:09:23,000 --> 00:09:27,000 čo znamená, že ukazovateľ tejto pamäte nie je v rozsahu, keď program skončil. 186 00:09:27,000 --> 00:09:30,000 Teraz, Valgrind nedáva tony informácií o úniku, 187 00:09:30,000 --> 00:09:35,000 ale ak sa budeme riadiť týmto malú poznámku, že to dáva dole smerom k spodnej časti svojej správy 188 00:09:35,000 --> 00:09:38,000 znovu spustiť s - leak-check = full 189 00:09:38,000 --> 00:09:41,000 Pre zobrazenie detailných informácií o unikli pamäti, 190 00:09:41,000 --> 00:09:44,000 dostaneme ďalšie informácie. 191 00:09:44,000 --> 00:09:46,000 Teraz, v haldy zhrnutie, 192 00:09:46,000 --> 00:09:50,000 Valgrind nám hovorí, kde sa pamäť, ktorá bola stratená pôvodne pridelené. 193 00:09:50,000 --> 00:09:52,000 Rovnako ako poznáme z pohľadu v zdrojovom kóde, 194 00:09:52,000 --> 00:09:55,000 Valgrind nás informuje, že sme unikli pamäte 195 00:09:55,000 --> 00:09:58,000 pridelené s výzvou na malloc na linke 8 leak.c 196 00:09:58,000 --> 00:10:00,000 v hlavnej funkcii. 197 00:10:00,000 --> 00:10:02,000 Docela šikovný. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind kategorizuje úniky pomocou tieto pojmy: 199 00:10:04,000 --> 00:10:07,000 Definitívne stratil - to je halda pridelené pamäte 200 00:10:07,000 --> 00:10:10,000 na ktoré je program už má ukazovateľ. 201 00:10:10,000 --> 00:10:14,000 Valgrind vie, že si kedysi mal ukazovateľ, ale od tej doby stratil prehľad o tom. 202 00:10:14,000 --> 00:10:17,000 Táto pamäť je určite unikli. 203 00:10:17,000 --> 00:10:20,000 Nepriamo stratil - to je halda pridelené pamäte 204 00:10:20,000 --> 00:10:24,000 , Na ktoré sa len ukazovatele na nej sú tiež stratené. 205 00:10:24,000 --> 00:10:27,000 Napríklad, ak ste stratili svoj ukazovateľ na prvý uzol prepojeného zoznamu, 206 00:10:27,000 --> 00:10:30,000 potom prvý uzol samo o sebe by byť definitívne stratil, 207 00:10:30,000 --> 00:10:34,000 zatiaľ čo akékoľvek následné uzly by sa nepriamo stratená. 208 00:10:34,000 --> 00:10:37,000 Možno stratil - to je halda pridelené pamäte 209 00:10:37,000 --> 00:10:41,000 na ktoré Valgrind nemôže byť istý, či je ukazovateľ, alebo nie. 210 00:10:41,000 --> 00:10:44,000 Stále dosiahnuteľný je haldy pridelené pamäte 211 00:10:44,000 --> 00:10:47,000 na ktoré je program ešte má ukazovateľ na výstupe, 212 00:10:47,000 --> 00:10:50,000 čo zvyčajne znamená, že globálna premenná na neho ukazuje. 213 00:10:50,000 --> 00:10:53,000 Ak chcete skontrolovať tieto úniky, budete musieť zadať aj možnosť 214 00:10:53,000 --> 00:10:55,000 - Stále dosiahnuteľné = yes 215 00:10:55,000 --> 00:10:58,000 v vyvolanie Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Tieto rôzne prípady môžu vyžadovať rôzne stratégie pre ich čistenie up, 217 00:11:01,000 --> 00:11:05,000 ale úniky by mali byť odstránené. 218 00:11:05,000 --> 00:11:08,000 Bohužiaľ, ktorým sa ustanovujú úniky byť ťažké urobiť, 219 00:11:08,000 --> 00:11:11,000 pretože nesprávne volanie zadarmo môže vyhodiť svoj program. 220 00:11:11,000 --> 00:11:14,000 Napríklad, keď sa pozrieme na invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 vidíme príklad zlého pamäte deallocation. 222 00:11:18,000 --> 00:11:21,000 Čo by malo byť jedno volanie uvoľniť celý blok 223 00:11:21,000 --> 00:11:24,000 pamäte, na ktorý ukazuje int_block, 224 00:11:24,000 --> 00:11:27,000 namiesto toho sa snaží oslobodiť každý int veľkosti sekcii 225 00:11:27,000 --> 00:11:29,000 z pamäte individuálne. 226 00:11:29,000 --> 00:11:32,000 To sa nepodarí katastrofálne. 227 00:11:32,000 --> 00:11:34,000 Boom! Čo chybe. 228 00:11:34,000 --> 00:11:36,000 To rozhodne nie je dobré. 229 00:11:36,000 --> 00:11:39,000 Ak neviete ako ďalej s týmto druhom chyby, aj keď, a neviete, kam sa pozerať, 230 00:11:39,000 --> 00:11:41,000 oprieť o svojho nového najlepšieho priateľa. 231 00:11:41,000 --> 00:11:44,000 Uhádli ste - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, ako vždy, presne vie, čo sa deje. 233 00:11:47,000 --> 00:11:50,000 V Alloc a voľný počty nezodpovedajú. 234 00:11:50,000 --> 00:11:52,000 Máme 1 Alloc a 4 oslobodzuje. 235 00:11:52,000 --> 00:11:55,000 A Valgrind nám tiež hovorí, kde sa prvý zlé volanie zadarmo - 236 00:11:55,000 --> 00:11:58,000 ten, ktorý spustil explóziu - prichádza z - 237 00:11:58,000 --> 00:12:00,000 linka 16. 238 00:12:00,000 --> 00:12:03,000 Ako vidíte, zlé volanie zadarmo sú naozaj zlé, 239 00:12:03,000 --> 00:12:05,000 takže odporúčame nechať vášho programu únik 240 00:12:05,000 --> 00:12:08,000 , Zatiaľ čo vy pracujete na získanie funkcie správne. 241 00:12:08,000 --> 00:12:12,000 Začať hľadať únik až po váš program pracuje správne, 242 00:12:12,000 --> 00:12:14,000 bez ďalších chýb. 243 00:12:14,000 --> 00:12:16,000 >> A to je všetko, čo sme dostali za toto video. 244 00:12:16,000 --> 00:12:18,000 Tak čo ešte čakáte? 245 00:12:18,000 --> 00:12:21,000 Prejsť beží Valgrind na vašich programov práve teraz. 246 00:12:21,000 --> 00:12:25,000 Moje meno je Nate Hardison. To je CS50. [CS50.TV]