1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Dobre GDB. 3 00:00:06,830 --> 00:00:08,480 Čo je to presne? 4 00:00:08,480 --> 00:00:11,310 Takže GDB, ktorá stojí pre GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 je naozaj skvelý nástroj, ktorý môžeme používajú, aby nám pomohli ladenie našich programov, 6 00:00:15,040 --> 00:00:18,210 alebo zistiť, kde veci sú deje zle v našich programoch. 7 00:00:18,210 --> 00:00:22,590 GDB je neuveriteľne silný, ale výstup a interakcie s ním 8 00:00:22,590 --> 00:00:23,830 môže byť trochu tajomný. 9 00:00:23,830 --> 00:00:28,210 Je to zvyčajne nástroj pre príkazový riadok, a to môže hodiť veľa správ na vás. 10 00:00:28,210 --> 00:00:31,144 A to môže trochu ťažké analyzovať presne to, čo sa deje. 11 00:00:31,144 --> 00:00:33,560 Našťastie sme prijali opatrenia, vyriešiť tento problém za vás 12 00:00:33,560 --> 00:00:36,281 ako si prácu prostredníctvom CS50. 13 00:00:36,281 --> 00:00:39,030 Ak nepoužívate grafickom debugger, ktoré môj kolega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse hovoril docela niečo o vo videu, ktorý 15 00:00:41,570 --> 00:00:44,740 by mala byť tu práve teraz, možno budete potrebovať 16 00:00:44,740 --> 00:00:48,270 Ak chcete tieto príkazový riadok nástroje pre prácu s GDB. 17 00:00:48,270 --> 00:00:51,250 Ak pracujete v CS50 IDE, nemusíte to urobiť. 18 00:00:51,250 --> 00:00:53,550 Ale ak si nie ste pracuje v CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 Možno používate verziu z CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 alebo iný Linux operačný systém s GDB nainštalovaný na to, 21 00:00:58,860 --> 00:01:00,980 možno budete musieť použiť Tieto nástroje príkazového riadka. 22 00:01:00,980 --> 00:01:02,860 >> A pretože by ste mohli to robiť, je to 23 00:01:02,860 --> 00:01:06,280 užitočné len preto, aby pochopili, ako GDB práce z príkazového riadku. 24 00:01:06,280 --> 00:01:09,650 Ale na druhú stranu, ak ste pomocou CS50 IDE, vy 25 00:01:09,650 --> 00:01:15,400 môžete použiť grafický debugger ktorá je integrovaná do IDE. 26 00:01:15,400 --> 00:01:18,750 Tak, aby sa veci ísť s GDB, spustíte ladenie 27 00:01:18,750 --> 00:01:21,220 Proces konkrétny Program, všetko, čo potrebujete urobiť, 28 00:01:21,220 --> 00:01:23,810 je typ GDB nasledovaný podľa názvu programu. 29 00:01:23,810 --> 00:01:28,620 Tak napríklad, ak je váš program Dobrý deň, by zadajte GDB ahoj. 30 00:01:28,620 --> 00:01:31,210 >> Keď to urobíte, budete vytiahnuť prostredie GDB. 31 00:01:31,210 --> 00:01:33,800 Vaša výzva sa zmení, a namiesto toho, aby to, čo je zvyčajne 32 00:01:33,800 --> 00:01:35,841 je, keď napíšete niečo na príkaz line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- všetky váš typický Príkazy Linux, svoju výzvu 34 00:01:38,115 --> 00:01:42,200 sa zmení na, pravdepodobne niečo ako zátvorkách GDB zátvorkách. 35 00:01:42,200 --> 00:01:46,630 To je váš nový GDB výzva, pretože ste vnútri prostredia GDB. 36 00:01:46,630 --> 00:01:49,830 Akonáhle ste vo vnútri tohto prostredia, tam dva hlavné príkazy 37 00:01:49,830 --> 00:01:52,290 že budete pravdepodobne používať v tomto poradí. 38 00:01:52,290 --> 00:01:55,200 >> Prvý z nich je b, ktorý je skratka pre prestávku. 39 00:01:55,200 --> 00:01:58,690 A potom, čo ste typ B, zvyčajne zadajte názov funkcie, 40 00:01:58,690 --> 00:02:01,040 alebo ak ste náhodou, okolo toho, čo číslo riadku 41 00:02:01,040 --> 00:02:04,100 váš program začína správať sa trochu divné, 42 00:02:04,100 --> 00:02:06,370 môžete zadať linku číslo aj tam. 43 00:02:06,370 --> 00:02:09,660 Čo b, alebo prestávka, robí Je to dovolí program 44 00:02:09,660 --> 00:02:13,270 bežať až do určitého bodu, menovite, názov funkcie 45 00:02:13,270 --> 00:02:15,880 že zadáte alebo linka číslo, ktoré zadáte. 46 00:02:15,880 --> 00:02:18,590 >> A v tomto bode to, zmrazí prevedení. 47 00:02:18,590 --> 00:02:21,670 To je naozaj dobrá vec, pretože akonáhle prevedení bol zmrazený, 48 00:02:21,670 --> 00:02:25,214 môžete začať veľmi pomaly krokovanie programu. 49 00:02:25,214 --> 00:02:28,130 Zvyčajne, ak ste boli beh vaše programy, sú to celkom krátke. 50 00:02:28,130 --> 00:02:31,250 Obvykle zadáte dot lomítko čokoľvek názov vášho programu, stlačte klávesu Enter, 51 00:02:31,250 --> 00:02:33,470 a predtým, než môžete mrknúť, vaše Program je už hotové. 52 00:02:33,470 --> 00:02:36,620 Nie je to naozaj veľa času, aby sa pokúsila a zistiť, čo sa deje zle. 53 00:02:36,620 --> 00:02:40,920 Tak sa skutočne byť schopný spomaliť veci nadol nastavením bod zlomu s B, 54 00:02:40,920 --> 00:02:43,040 a potom sa zapájať. 55 00:02:43,040 --> 00:02:46,169 >> Potom, akonáhle ste nastaviť prestávku bod, môžete spustiť program. 56 00:02:46,169 --> 00:02:47,960 A ak máte akýkoľvek argumenty príkazového riadku, 57 00:02:47,960 --> 00:02:51,610 ste je určiť tu, ak nie zadáte GDB Vaše meno programu. 58 00:02:51,610 --> 00:02:55,980 Môžete zadať všetky príkazového riadku Argumenty prijímaním r, alebo beh, 59 00:02:55,980 --> 00:03:00,270 a potom, čo argumenty príkazového riadku budete potrebovať vnútri vášho programu. 60 00:03:00,270 --> 00:03:03,510 Existuje celý rad ďalších naozaj dôležité a užitočné príkazy 61 00:03:03,510 --> 00:03:04,970 vnútri prostredia HDP. 62 00:03:04,970 --> 00:03:07,540 Tak mi dovoľte len rýchlo ísť cez niektoré z nich. 63 00:03:07,540 --> 00:03:11,320 >> Prvý z nich je n, čo je skratka pre ďalšie, a môžete zadať ďalšie miesto n, 64 00:03:11,320 --> 00:03:12,304 ako bude fungovať. 65 00:03:12,304 --> 00:03:13,470 A je to len skratka. 66 00:03:13,470 --> 00:03:17,540 A ako ste si pravdepodobne už dostali použitý k, je schopný zadať veci 67 00:03:17,540 --> 00:03:20,520 kratšie, je všeobecne lepšie. 68 00:03:20,520 --> 00:03:24,100 A čo to bude robiť, je, že to Krok vpred jeden blok kódu. 69 00:03:24,100 --> 00:03:26,170 Takže to bude pohybovať vpred až do volanie funkcie. 70 00:03:26,170 --> 00:03:28,350 A potom miesto potápanie do tejto funkcie 71 00:03:28,350 --> 00:03:33,130 a prechádzajú všetkými, ktorý funguje kód, bude to len mať funkciu. 72 00:03:33,130 --> 00:03:34,400 >> Táto funkcia bude volaná. 73 00:03:34,400 --> 00:03:35,733 To bude robiť, čo jej činnosť. 74 00:03:35,733 --> 00:03:38,870 To vráti hodnotu funkcia, ktorá ho nazýva. 75 00:03:38,870 --> 00:03:42,490 A potom budete presunúť na ďalší riadok tejto funkcie volania. 76 00:03:42,490 --> 00:03:44,555 Ak chcete krok vnútri funkcie, 77 00:03:44,555 --> 00:03:46,430 namiesto toho len s to vykonať, zvlášť 78 00:03:46,430 --> 00:03:50,004 ak si myslíte, že problém môže leží vnútri tejto funkcie, 79 00:03:50,004 --> 00:03:52,670 môžete samozrejme nastaviť si pauzu bod vnútri tejto funkcie. 80 00:03:52,670 --> 00:03:57,820 Alebo ak ste už beží, môžete Pomocou s krokom vpred jeden riadok kódu. 81 00:03:57,820 --> 00:04:01,170 >> Takže to bude krok v a ponoriť sa do funkcií, 82 00:04:01,170 --> 00:04:04,750 namiesto toho jednoducho execute a pokračujúce na vo funkcii 83 00:04:04,750 --> 00:04:07,380 že ste v pre ladenie. 84 00:04:07,380 --> 00:04:09,870 Ak ste niekedy chceli vedieť, hodnota premennej, 85 00:04:09,870 --> 00:04:12,507 môžete zadať p, alebo Tlač, a potom názov premennej. 86 00:04:12,507 --> 00:04:15,090 A to bude tlačiť na vás, vnútri prostredia GDB, 87 00:04:15,090 --> 00:04:19,110 meno premennej, že vás-- ospravedlňte me-- hodnotu premennej 88 00:04:19,110 --> 00:04:20,064 ktoré ste vymenoval. 89 00:04:20,064 --> 00:04:23,230 Ak chcete poznať hodnoty každý lokálna premenná prístupné z miesta, kde 90 00:04:23,230 --> 00:04:25,970 sa práve nachádzate vo vašom Program, môžete zadať info miestni obyvatelia. 91 00:04:25,970 --> 00:04:28,332 Je to oveľa rýchlejšie, než písanie P a potom čokoľvek, 92 00:04:28,332 --> 00:04:30,540 výpis z všetky premenné, ktoré viete, že existujú. 93 00:04:30,540 --> 00:04:34,370 Môžete zadať info miestnych obyvateľov, a to vytlačí všetko za vás. 94 00:04:34,370 --> 00:04:37,770 Ďalšia na rade je bt, čo je skratka pre Back Trace. 95 00:04:37,770 --> 00:04:41,680 Teraz, všeobecne, najmä na začiatku CS50, 96 00:04:41,680 --> 00:04:44,450 budete naozaj mať príležitosť používať BT, alebo Back Trace, 97 00:04:44,450 --> 00:04:47,860 preto, že ste nemajú funkcie že volať ďalšie funkcie. 98 00:04:47,860 --> 00:04:50,450 >> Môžete mať hlavné volať funkcie, ale to je asi to. 99 00:04:50,450 --> 00:04:53,199 Nemáte tú druhú funkciu volanie iné funkcie, ktoré 100 00:04:53,199 --> 00:04:54,880 volá inú funkciu, a tak ďalej. 101 00:04:54,880 --> 00:04:57,550 Ale ako vaše programy získať viac komplexu, a to najmä 102 00:04:57,550 --> 00:05:00,290 keď začnete pracovať s rekurzia, zadná stopa 103 00:05:00,290 --> 00:05:05,150 môže byť naozaj užitočný spôsob, ako vás nechať druh získať nejaké kontext, kde 104 00:05:05,150 --> 00:05:06,460 Ja som v mojom programe. 105 00:05:06,460 --> 00:05:10,590 Takže povedať, že ste napísali svoj kód, a viete, že hlavný volanie funkcie 106 00:05:10,590 --> 00:05:14,720 f, ktorý volá funkciu g, ktorý volá funkciu h. 107 00:05:14,720 --> 00:05:17,650 Takže máme niekoľko vrstiev hniezdenia deje. 108 00:05:17,650 --> 00:05:19,440 >> Ak ste vo vnútri Váš GDB prostredie, 109 00:05:19,440 --> 00:05:21,640 a poznáte vnútro H, ale zabudnete 110 00:05:21,640 --> 00:05:27,210 o tom, čo sa dostal na miesto, kde vás are-- môžete zadať BT, alebo zadnú stopu, 111 00:05:27,210 --> 00:05:32,370 a bude tlačiť h, g, f hlavné, popri ďalších informácií, ktoré 112 00:05:32,370 --> 00:05:35,984 vám dáva potuchy, že hlavné OK volal f, f zvané g, g nazvaný h, 113 00:05:35,984 --> 00:05:37,900 a to je, kde som V súčasnej dobe som vo svojom programe. 114 00:05:37,900 --> 00:05:41,380 Takže to môže byť naozaj užitočné, najmä ako kryptické-nosť GDB 115 00:05:41,380 --> 00:05:45,667 sa stáva trochu ohromujúce, na presne zistiť, kde sa veci majú. 116 00:05:45,667 --> 00:05:48,500 Nakoniec, keď sa vykonáva váš program, alebo keď ste to urobil ladenie 117 00:05:48,500 --> 00:05:50,125 a chcete ustúpiť z prostredia GDB, 118 00:05:50,125 --> 00:05:51,940 je dobré vedieť, ako sa z toho dostať. 119 00:05:51,940 --> 00:05:55,500 Môžete zadať Q, alebo Quit, sa dostať von. 120 00:05:55,500 --> 00:05:59,220 Teraz, pred dnešným videu Pripravil som kočík programu 121 00:05:59,220 --> 00:06:03,900 volal buggy1, ktorú som zostavil zo súboru známeho ako buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Ako sa dalo očakávať, tento Program je v skutočnosti buggy. 123 00:06:06,500 --> 00:06:08,990 Niečo sa pokazí keď sa snažím a spustite ho. 124 00:06:08,990 --> 00:06:13,014 Teraz, bohužiaľ, som nechtiac vypúšťa môj buggy1.c súbor, 125 00:06:13,014 --> 00:06:15,930 tak, aby pre mňa prísť na to, čo sa deje zle s týmto programom, 126 00:06:15,930 --> 00:06:18,770 Budem musieť použiť GDB druh slepo, snažila 127 00:06:18,770 --> 00:06:22,372 navigovať prostredníctvom tohto programu zistiť, čo presne sa deje zle. 128 00:06:22,372 --> 00:06:24,580 Ale iba pomocou nástrojov už sme sa dozvedeli o, 129 00:06:24,580 --> 00:06:27,700 môžeme skoro obrázok čo presne to je. 130 00:06:27,700 --> 00:06:30,740 Takže poďme cez hlavu na CS50 IDE a pozrieť sa. 131 00:06:30,740 --> 00:06:33,155 OK, takže sme tu v mojom CS50 IDE prostredie, 132 00:06:33,155 --> 00:06:35,697 a ja priblížiť trochu takže môžete vidieť trochu viac. 133 00:06:35,697 --> 00:06:38,530 V mojom okne terminálu, keď som zoznam obsah môjho súčasného riaditeľa 134 00:06:38,530 --> 00:06:41,250 s LS, uvidíme, že ja majú niekoľko zdrojových súborov 135 00:06:41,250 --> 00:06:44,982 tu, vrátane bolo opísané skôr buggy1. 136 00:06:44,982 --> 00:06:46,940 Čo presne sa deje, keď Snažím sa spustiť buggy1. 137 00:06:46,940 --> 00:06:47,773 Tak poďme zistiť. 138 00:06:47,773 --> 00:06:52,510 Píšem dot lomítko, buggy, a ja stlačte Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentácia závady. 140 00:06:53,670 --> 00:06:55,000 To nie je dobré. 141 00:06:55,000 --> 00:06:57,180 Ak si spomínate, je Porucha segmentácie typicky 142 00:06:57,180 --> 00:07:01,540 nastane, keď sme sa prístup k pamäti že sme nie je dovolené dotýkať. 143 00:07:01,540 --> 00:07:03,820 Sme nejako dosiahol vonku hraníc 144 00:07:03,820 --> 00:07:05,995 o tom, čo program sa kompilátor, nám dal. 145 00:07:05,995 --> 00:07:08,310 A tak už to je stopa, aby v paneli nástrojov 146 00:07:08,310 --> 00:07:10,660 ako začať proces ladenia. 147 00:07:10,660 --> 00:07:13,620 Niečo sa už trochu zle. 148 00:07:13,620 --> 00:07:15,935 >> V poriadku, takže začnime up na životné prostredie GDB 149 00:07:15,935 --> 00:07:19,030 a uvidíme, či sa nám podarí zistiť, čo presne je problém. 150 00:07:19,030 --> 00:07:21,674 Chystám sa prečistil obrazovku, a budem písať GDB 151 00:07:21,674 --> 00:07:24,340 opäť vstúpiť do životného prostredia GDB, a názov programu 152 00:07:24,340 --> 00:07:27,450 že chcem ladiť, buggy1. 153 00:07:27,450 --> 00:07:30,182 Dostaneme malý odkaz, čítanie symboly z buggy1, hotovo. 154 00:07:30,182 --> 00:07:32,390 Všetko, čo znamená, že je to vytiahol spolu všetok kód, 155 00:07:32,390 --> 00:07:35,570 a teraz to bolo naložené do GDB, a je pripravený ísť. 156 00:07:35,570 --> 00:07:37,140 >> A teraz, čo chcem robiť? 157 00:07:37,140 --> 00:07:39,130 Spomínaš si, čo sa Prvým krokom je zvyčajne 158 00:07:39,130 --> 00:07:42,540 potom, čo som si vo vnútri tohto prostredia? 159 00:07:42,540 --> 00:07:44,540 Dúfajme, že spomínaná sada bod zlomu, pretože 160 00:07:44,540 --> 00:07:46,240 V skutočnosti, že je to, čo chcem robiť. 161 00:07:46,240 --> 00:07:47,990 Teraz už nemajú zdrojový kód pre túto 162 00:07:47,990 --> 00:07:50,948 predo mnou, čo je asi nie je typický prípad použitia, mimochodom. 163 00:07:50,948 --> 00:07:52,055 Pravdepodobne ste nebude. 164 00:07:52,055 --> 00:07:52,680 Tak to je dobre. 165 00:07:52,680 --> 00:07:55,790 Ale za predpokladu, že nie, čo je tá funkcia, že viete, 166 00:07:55,790 --> 00:07:58,880 existuje v každom programe C? 167 00:07:58,880 --> 00:08:04,420 Bez ohľadu na to, ako veľký alebo ako zložité to je, je táto funkcia určite existuje. 168 00:08:04,420 --> 00:08:05,440 Main, že jo? 169 00:08:05,440 --> 00:08:08,870 >> Takže ak nie je všetko ostatné, my môžeme Nastavte miesto prerušenia na hlavnú. 170 00:08:08,870 --> 00:08:12,200 A opäť, som mohol len zadať zlomiť hlavné, namiesto toho, b. 171 00:08:12,200 --> 00:08:14,650 A ak ste zvedaví, či niekedy zadajte si dlho príkaz 172 00:08:14,650 --> 00:08:16,800 a potom si uvedomiť, že vás napísal niečo zlé, 173 00:08:16,800 --> 00:08:18,770 a chcete sa zbaviť zo všetkého, ako som práve urobil, 174 00:08:18,770 --> 00:08:22,029 si môžete prevziať kontrolu U, ktorý bude zmazať všetko a priviesť späť 175 00:08:22,029 --> 00:08:23,570 na začiatok kurzorových liniek. 176 00:08:23,570 --> 00:08:26,569 Oveľa rýchlejšie než len podržte vymazať, alebo biť to banda krát 177 00:08:26,569 --> 00:08:27,080 nad. 178 00:08:27,080 --> 00:08:28,740 >> Takže budeme nastaviť bod zlomu na hlavnú. 179 00:08:28,740 --> 00:08:32,970 A ako môžete vidieť, je to hovorí, že máme Nastavte miesto prerušenia v súbore buggy1.c, 180 00:08:32,970 --> 00:08:36,330 a zrejme prvý riadok kódu z hlavnej linky je sedem. 181 00:08:36,330 --> 00:08:38,080 Opäť platí, že nemáme zdrojový súbor tu, 182 00:08:38,080 --> 00:08:40,429 ale budem predpokladať, že je to mi pravdu. 183 00:08:40,429 --> 00:08:44,510 A potom, len sa snažím a spustiť program, r. 184 00:08:44,510 --> 00:08:45,360 Spustení programu. 185 00:08:45,360 --> 00:08:48,160 Dobre, takže táto správa je trochu tajomný. 186 00:08:48,160 --> 00:08:50,160 Ale v podstate to, čo je deje, tu je to len 187 00:08:50,160 --> 00:08:53,350 hovoril mi, že som udrel svoju prestávku bod, bod zlomu číslo 1. 188 00:08:53,350 --> 00:08:55,877 >> A potom, že riadok kódu, Súbor alebo adresár neexistuje. 189 00:08:55,877 --> 00:08:57,710 Jediný dôvod, prečo Vidím tú správu 190 00:08:57,710 --> 00:09:00,800 je preto, že som nechtiac vypúšťa môj buggy.c súboru. 191 00:09:00,800 --> 00:09:04,050 Keby moje buggy1.c súbor existuje v aktuálnom adresári, 192 00:09:04,050 --> 00:09:06,920 že linka priamo tam by vlastne povedz mi, čo riadok kódu 193 00:09:06,920 --> 00:09:08,214 doslova číta. 194 00:09:08,214 --> 00:09:09,380 Bohužiaľ, Vymazal som ho. 195 00:09:09,380 --> 00:09:14,790 Budeme musieť trochu navigáciu cez to trochu viac slepo. 196 00:09:14,790 --> 00:09:17,330 >> OK, takže uvidíme, čo sa chcem robiť? 197 00:09:17,330 --> 00:09:21,770 No, ja by som rád vedel, čo miestne Premenné Možno mám k dispozícii. 198 00:09:21,770 --> 00:09:23,570 Ja som začal môj program. 199 00:09:23,570 --> 00:09:28,515 Pozrime sa, čo by mohlo byť už inicializovaný pre nás. 200 00:09:28,515 --> 00:09:31,430 Píšem Info miestni obyvatelia, žiadne miestni obyvatelia. 201 00:09:31,430 --> 00:09:33,960 Dobre, takže nie je daj mi veľa informácií. 202 00:09:33,960 --> 00:09:37,600 Mohol by som skúsiť a vytlačiť premennú, ale ja neviem, žiadne názvy premenných. 203 00:09:37,600 --> 00:09:39,930 Mohol by som skúsiť zadné stopu, ale ja som vo vnútri hlavné, 204 00:09:39,930 --> 00:09:43,710 takže viem, že neurobili ďalšie volanie funkcie práve teraz. 205 00:09:43,710 --> 00:09:47,710 >> Tak vyzerá moje jediné možnosti sú používať n alebo tak a začať do toho ponoriť. 206 00:09:47,710 --> 00:09:49,630 Budem používať n. 207 00:09:49,630 --> 00:09:51,180 Tak som typ N. 208 00:09:51,180 --> 00:09:53,060 Ach môj bože, čo sa tu deje. 209 00:09:53,060 --> 00:09:56,260 Program prijímané signály, SIGSEGV chyba segmentácia, 210 00:09:56,260 --> 00:09:57,880 a potom sa celá partia veci. 211 00:09:57,880 --> 00:09:58,880 Ja už som ohromený. 212 00:09:58,880 --> 00:10:00,980 No, je to vlastne Veľa sa tu naučil. 213 00:10:00,980 --> 00:10:02,520 Takže to, čo nám to hovorí? 214 00:10:02,520 --> 00:10:09,180 To, čo nám hovorí, je tento program chystal, ale doteraz nedošlo, seg chyba. 215 00:10:09,180 --> 00:10:12,550 A najmä, idem priblížite ešte tu, 216 00:10:12,550 --> 00:10:18,980 je to o tom, aby Seg chybu o niečo, čo nazýva strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Teraz, nemôžeme diskutovali Táto funkcia značne. 218 00:10:22,705 --> 00:10:25,580 Ale to je--, pretože nebudeme hovoriť o všetky funkcie, ktoré 219 00:10:25,580 --> 00:10:28,610 existuje v štandarde C library-- ale všetci sú vám k dispozícii, 220 00:10:28,610 --> 00:10:32,110 najmä ak užívate pozrite sa na reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 A strcmp je naozaj silný funkcia, ktorá existuje vo vnútri 222 00:10:35,000 --> 00:10:38,070 z string.h hlavičky Súbor, ktorý je hlavička 223 00:10:38,070 --> 00:10:41,970 Súbor, ktorý je venovaný funkciám že práca sa a manipulovať s reťazcami. 224 00:10:41,970 --> 00:10:49,830 >> A predovšetkým, čo robí, je strcmp porovnáva hodnoty dvoch reťazcov. 225 00:10:49,830 --> 00:10:54,160 Takže som asi segmentácie poruchy Na základe výzvy na strcmp sa zdá. 226 00:10:54,160 --> 00:10:58,530 Som narazila n, a v skutočnosti sa zobrazí správa, Program ukončený signálom SIGSEGV 227 00:10:58,530 --> 00:11:01,370 chyba segmentácie. Takže teraz Vlastne som si seg vyčítané, 228 00:11:01,370 --> 00:11:06,479 a môj program má dosť oveľa efektívnejšie vzdal. 229 00:11:06,479 --> 00:11:07,770 To je koniec programu. 230 00:11:07,770 --> 00:11:10,370 To sa pokazil, havaroval. 231 00:11:10,370 --> 00:11:14,740 Takže nebolo moc, ale ja v skutočnosti sa dozvedel trochu 232 00:11:14,740 --> 00:11:16,747 z tejto malej skúsenosti. 233 00:11:16,747 --> 00:11:17,580 Čo som sa naučil? 234 00:11:17,580 --> 00:11:22,020 No, môj zrútenie programu skoro okamžite. 235 00:11:22,020 --> 00:11:26,300 Môj zrútenie programu na výzva k strcmp, ale ja 236 00:11:26,300 --> 00:11:30,560 nemajú žiadne lokálne premenné v mojom Program v čase, keď došlo k zrúteniu. 237 00:11:30,560 --> 00:11:37,320 Takže to, čo reťazca, alebo reťazca, by som mohol byť porovnávanie. 238 00:11:37,320 --> 00:11:42,140 Ak nemám akýkoľvek miestny premenné, môžete 239 00:11:42,140 --> 00:11:45,520 dohadovať, že som have-- tam možno je globálna premenná, ktorá by mohla byť pravda. 240 00:11:45,520 --> 00:11:47,670 >> Všeobecne ale, zdá sa, ako by som porovnávanie 241 00:11:47,670 --> 00:11:52,070 k niečomu, čo neexistuje. 242 00:11:52,070 --> 00:11:54,130 Takže poďme preskúmať že o kúsok ďalej. 243 00:11:54,130 --> 00:11:55,120 Takže som sa, aby som si vyčistil obrazovku. 244 00:11:55,120 --> 00:11:57,536 Chystám sa ukončiť von z GDB prostredie na sekundu. 245 00:11:57,536 --> 00:12:01,300 A ja som premýšľal, OK, takže je tu žiadne lokálne premenné v mojom programe. 246 00:12:01,300 --> 00:12:06,444 Zaujímalo by ma, či by si mám odovzdať v reťazci ako argument príkazového riadku. 247 00:12:06,444 --> 00:12:07,610 Tak nech to len vyskúšať to. 248 00:12:07,610 --> 00:12:09,020 Neurobil som to predtým. 249 00:12:09,020 --> 00:12:14,244 >> Uvidíme, či Možno keby som spustiť tento program s argument príkazového riadka to funguje. 250 00:12:14,244 --> 00:12:16,140 Huh, žiadna chyba tam segmentácie. 251 00:12:16,140 --> 00:12:17,870 To mi povedal, že som na to prišiel. 252 00:12:17,870 --> 00:12:19,170 Takže možno, že je to oprava sem. 253 00:12:19,170 --> 00:12:27,560 A skutočne, keď som sa vrátiť a pozrieť sa na aktuálny zdrojový kód pre buggy1.c, 254 00:12:27,560 --> 00:12:31,180 sa zdá, že to, čo robím, je Robím volanie strcmp bez 255 00:12:31,180 --> 00:12:34,010 overenie, či v skutočnosti argv [1] existuje. 256 00:12:34,010 --> 00:12:36,730 To je vlastne zdrojový kód pre buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Takže to, čo naozaj potrebujete urobiť tu pre opravu môj program, 258 00:12:38,855 --> 00:12:40,835 za predpokladu, že mám mať súbor predo mnou, je 259 00:12:40,835 --> 00:12:44,740 len pridať šek, aby sa či argc je rovný 2. 260 00:12:44,740 --> 00:12:47,780 Takže tento príklad, opäť, ako som povedal, je trochu neprirodzený, že jo? 261 00:12:47,780 --> 00:12:49,840 Tie zvyčajne nebude omylom zmazať zdrojového kódu 262 00:12:49,840 --> 00:12:51,820 a potom sa musieť pokúsiť a ladenie programu. 263 00:12:51,820 --> 00:12:53,120 Ale dúfajme, že dal ste ilustrácie 264 00:12:53,120 --> 00:12:55,120 z druhov vecí, ktoré by ste mohli myslieť 265 00:12:55,120 --> 00:12:56,610 ako ste ladenie programu. 266 00:12:56,610 --> 00:12:58,760 >> Aký je stav vecí tu? 267 00:12:58,760 --> 00:13:00,510 Čo robiť premenné I majú prístup na mňa? 268 00:13:00,510 --> 00:13:03,600 Kde presne je môj program zhadzovať, na akom línie, 269 00:13:03,600 --> 00:13:05,240 o tom, čo volanie akú funkciu? 270 00:13:05,240 --> 00:13:06,952 Aké stopy však, že mi dal? 271 00:13:06,952 --> 00:13:08,910 A to je presne druh myslenia, ktoré vám 272 00:13:08,910 --> 00:13:12,820 by malo byť dostať sa do, keď ste premýšľať o ladenie programov. 273 00:13:12,820 --> 00:13:13,820 >> Som Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 To je CS50. 275 00:13:16,140 --> 00:15:08,642