1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Dobře GDB. 3 00:00:06,830 --> 00:00:08,480 Co je to přesně? 4 00:00:08,480 --> 00:00:11,310 Takže GDB, která stojí pro GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 je opravdu skvělý nástroj, který můžeme používají, aby nám pomohli ladění našich programů, 6 00:00:15,040 --> 00:00:18,210 nebo zjistit, kde věci jsou děje špatně v našich programech. 7 00:00:18,210 --> 00:00:22,590 GDB je neuvěřitelně silný, ale výstup a interakce s ním 8 00:00:22,590 --> 00:00:23,830 může být trochu tajemný. 9 00:00:23,830 --> 00:00:28,210 Je to obvykle nástroj pro příkazovou řádku, a to může hodit hodně zpráv na vás. 10 00:00:28,210 --> 00:00:31,144 A to může trochu těžké analyzovat přesně to, co se děje. 11 00:00:31,144 --> 00:00:33,560 Naštěstí jsme přijata opatření, vyřešit tento problém za vás 12 00:00:33,560 --> 00:00:36,281 jak si práci prostřednictvím CS50. 13 00:00:36,281 --> 00:00:39,030 Pokud nepoužíváte grafickém debugger, které můj kolega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse mluvil docela něco o ve videu, který 15 00:00:41,570 --> 00:00:44,740 by měla být tady právě teď, možná budete potřebovat 16 00:00:44,740 --> 00:00:48,270 Chcete-li tyto příkazový řádek nástroje pro práci s GDB. 17 00:00:48,270 --> 00:00:51,250 Pokud pracujete v CS50 IDE, nemusíte to udělat. 18 00:00:51,250 --> 00:00:53,550 Ale pokud si nejste pracuje v CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 Možná používáte verzi z CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 nebo jiný Linux operační systém s GDB nainstalován na to, 21 00:00:58,860 --> 00:01:00,980 možná budete muset použít Tyto nástroje příkazového řádku. 22 00:01:00,980 --> 00:01:02,860 >> A protože byste mohli to dělat, je to 23 00:01:02,860 --> 00:01:06,280 užitečné jen proto, aby pochopili, jak GDB práce z příkazového řádku. 24 00:01:06,280 --> 00:01:09,650 Ale na druhou stranu, pokud jste pomocí CS50 IDE, vy 25 00:01:09,650 --> 00:01:15,400 můžete použít grafický debugger která je integrována do IDE. 26 00:01:15,400 --> 00:01:18,750 Tak, aby se věci jít s GDB, spustíte ladění 27 00:01:18,750 --> 00:01:21,220 Proces konkrétní Program, vše, co potřebujete udělat, 28 00:01:21,220 --> 00:01:23,810 je typ GDB následován podle názvu programu. 29 00:01:23,810 --> 00:01:28,620 Tak například, pokud je váš program Dobrý den, by zadejte GDB ahoj. 30 00:01:28,620 --> 00:01:31,210 >> Když to uděláte, budete vytáhnout prostředí GDB. 31 00:01:31,210 --> 00:01:33,800 Vaše výzva se změní, a místo toho, aby to, co je obvykle 32 00:01:33,800 --> 00:01:35,841 je, když napíšete něco na příkaz line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- všechny váš typický Příkazy Linux, svou výzvu 34 00:01:38,115 --> 00:01:42,200 se změní na, pravděpodobně něco jako závorkách GDB závorkách. 35 00:01:42,200 --> 00:01:46,630 To je váš nový GDB výzva, protože jste uvnitř prostředí GDB. 36 00:01:46,630 --> 00:01:49,830 Jakmile jste uvnitř tohoto prostředí, tam dva hlavní příkazy 37 00:01:49,830 --> 00:01:52,290 že budete pravděpodobně používat v tomto pořadí. 38 00:01:52,290 --> 00:01:55,200 >> První z nich je b, který je zkratka pro přestávku. 39 00:01:55,200 --> 00:01:58,690 A poté, co jste typ B, obvykle zadejte název funkce, 40 00:01:58,690 --> 00:02:01,040 nebo pokud jste náhodou, kolem toho, co číslo řádku 41 00:02:01,040 --> 00:02:04,100 váš program začíná chovat se trochu divné, 42 00:02:04,100 --> 00:02:06,370 můžete zadat linku číslo i tam. 43 00:02:06,370 --> 00:02:09,660 Co b, nebo přestávka, dělá Je to dovolí program 44 00:02:09,660 --> 00:02:13,270 běžet až do určitého bodu, jmenovitě, název funkce 45 00:02:13,270 --> 00:02:15,880 že zadáte nebo linka číslo, které zadáte. 46 00:02:15,880 --> 00:02:18,590 >> A v tomto bodě to, zmrazí provedení. 47 00:02:18,590 --> 00:02:21,670 To je opravdu dobrá věc, protože jakmile provedení byl zmrazen, 48 00:02:21,670 --> 00:02:25,214 můžete začít velmi pomalu krokování programu. 49 00:02:25,214 --> 00:02:28,130 Obvykle, pokud jste byli běh vaše programy, jsou to docela krátké. 50 00:02:28,130 --> 00:02:31,250 Obvykle zadáte dot lomítko cokoliv název vašeho programu, stiskněte klávesu Enter, 51 00:02:31,250 --> 00:02:33,470 a předtím, než můžete mrknout, vaše Program je již hotové. 52 00:02:33,470 --> 00:02:36,620 Není to opravdu hodně času, aby se pokusila a zjistit, co se děje špatně. 53 00:02:36,620 --> 00:02:40,920 Tak se skutečně být schopen zpomalit věci dolů nastavením bod zlomu s B, 54 00:02:40,920 --> 00:02:43,040 a pak se zapojovat. 55 00:02:43,040 --> 00:02:46,169 >> Pak, jakmile jste nastavit přestávku bod, můžete spustit program. 56 00:02:46,169 --> 00:02:47,960 A pokud máte jakýkoli argumenty příkazového řádku, 57 00:02:47,960 --> 00:02:51,610 jste je určit tady, ne-li zadáte GDB Vaše jméno programu. 58 00:02:51,610 --> 00:02:55,980 Můžete zadat všechny příkazového řádku Argumenty přijímáním r, nebo běh, 59 00:02:55,980 --> 00:03:00,270 a poté, co argumenty příkazového řádku budete potřebovat uvnitř vašeho programu. 60 00:03:00,270 --> 00:03:03,510 Existuje celá řada dalších opravdu důležité a užitečné příkazy 61 00:03:03,510 --> 00:03:04,970 uvnitř prostředí HDP. 62 00:03:04,970 --> 00:03:07,540 Tak mi dovolte jen rychle jít přes některé z nich. 63 00:03:07,540 --> 00:03:11,320 >> První z nich je n, což je zkratka pro další, a můžete zadat další místo n, 64 00:03:11,320 --> 00:03:12,304 jak bude fungovat. 65 00:03:12,304 --> 00:03:13,470 A je to jen zkratka. 66 00:03:13,470 --> 00:03:17,540 A jak jste si pravděpodobně již dostali použit k, je schopen zadat věci 67 00:03:17,540 --> 00:03:20,520 kratší, je obecně lepší. 68 00:03:20,520 --> 00:03:24,100 A co to bude dělat, je, že to Krok vpřed jeden blok kódu. 69 00:03:24,100 --> 00:03:26,170 Takže to bude pohybovat vpřed až do volání funkce. 70 00:03:26,170 --> 00:03:28,350 A pak místo potápění do této funkce 71 00:03:28,350 --> 00:03:33,130 a procházejí všemi, který funguje kód, bude to jen mít funkci. 72 00:03:33,130 --> 00:03:34,400 >> Tato funkce bude volána. 73 00:03:34,400 --> 00:03:35,733 To bude dělat, co její činnost. 74 00:03:35,733 --> 00:03:38,870 To vrátí hodnotu funkce, která jej nazývá. 75 00:03:38,870 --> 00:03:42,490 A pak budete přesunout na další řádek této funkce volání. 76 00:03:42,490 --> 00:03:44,555 Chcete-li krok uvnitř funkce, 77 00:03:44,555 --> 00:03:46,430 místo toho jen s to provést, zvláště 78 00:03:46,430 --> 00:03:50,004 pokud si myslíte, že problém může leží uvnitř této funkce, 79 00:03:50,004 --> 00:03:52,670 můžete samozřejmě nastavit si pauzu bod uvnitř této funkce. 80 00:03:52,670 --> 00:03:57,820 Nebo pokud jste již běží, můžete Pomocí s krokem vpřed jeden řádek kódu. 81 00:03:57,820 --> 00:04:01,170 >> Takže to bude krok v a ponořit se do funkcí, 82 00:04:01,170 --> 00:04:04,750 místo toho prostě execute a pokračující na ve funkci 83 00:04:04,750 --> 00:04:07,380 že jste v pro ladění. 84 00:04:07,380 --> 00:04:09,870 Pokud jste někdy chtěli vědět, hodnota proměnné, 85 00:04:09,870 --> 00:04:12,507 můžete zadat p, nebo Tisk, a pak název proměnné. 86 00:04:12,507 --> 00:04:15,090 A to bude tisknout na vás, uvnitř prostředí GDB, 87 00:04:15,090 --> 00:04:19,110 jméno proměnné, že vás-- omluvte me-- hodnotu proměnné 88 00:04:19,110 --> 00:04:20,064 které jste jmenoval. 89 00:04:20,064 --> 00:04:23,230 Chcete-li znát hodnoty každý lokální proměnná přístupné z místa, kde 90 00:04:23,230 --> 00:04:25,970 se právě nacházíte ve vašem Program, můžete zadat info místní obyvatelé. 91 00:04:25,970 --> 00:04:28,332 Je to mnohem rychlejší, než psaní P a pak cokoliv, 92 00:04:28,332 --> 00:04:30,540 výpis z všechny proměnné, které víte, že existují. 93 00:04:30,540 --> 00:04:34,370 Můžete zadat info místních obyvatel, a to vytiskne vše za vás. 94 00:04:34,370 --> 00:04:37,770 Další na řadě je bt, což je zkratka pro Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nyní, obecně, zejména na počátku CS50, 96 00:04:41,680 --> 00:04:44,450 budete opravdu mít příležitost používat BT, nebo Back Trace, 97 00:04:44,450 --> 00:04:47,860 proto, že jste nemají funkce že volat další funkce. 98 00:04:47,860 --> 00:04:50,450 >> Můžete mít hlavní volat funkce, ale to je asi to. 99 00:04:50,450 --> 00:04:53,199 Nemáte tu druhou funkci volání jiné funkce, které 100 00:04:53,199 --> 00:04:54,880 volá jinou funkci, a tak dále. 101 00:04:54,880 --> 00:04:57,550 Ale jak vaše programy získat více komplexu, a to zejména 102 00:04:57,550 --> 00:05:00,290 když začnete pracovat s rekurze, zadní stopa 103 00:05:00,290 --> 00:05:05,150 může být opravdu užitečný způsob, jak vás nechat druh získat nějaké kontext, kde 104 00:05:05,150 --> 00:05:06,460 Já jsem v mém programu. 105 00:05:06,460 --> 00:05:10,590 Takže říct, že jste napsali svůj kód, a víte, že hlavní volání funkce 106 00:05:10,590 --> 00:05:14,720 f, který volá funkci g, který volá funkci h. 107 00:05:14,720 --> 00:05:17,650 Takže máme několik vrstev hnízdění děje. 108 00:05:17,650 --> 00:05:19,440 >> Pokud jste uvnitř Váš GDB prostředí, 109 00:05:19,440 --> 00:05:21,640 a znáte vnitřek H, ale zapomenete 110 00:05:21,640 --> 00:05:27,210 o tom, co se dostal na místo, kde vás are-- můžete zadat BT, nebo zadní stopu, 111 00:05:27,210 --> 00:05:32,370 a bude tisknout h, g, f hlavní, vedle dalších informací, které 112 00:05:32,370 --> 00:05:35,984 vám dává ponětí, že hlavní OK volal f, f zvané g, g nazvaný h, 113 00:05:35,984 --> 00:05:37,900 a to je, kde jsem V současné době jsem ve svém programu. 114 00:05:37,900 --> 00:05:41,380 Takže to může být opravdu užitečné, zejména jako kryptické-nost GDB 115 00:05:41,380 --> 00:05:45,667 se stává trochu ohromující, na přesně zjistit, kde se věci mají. 116 00:05:45,667 --> 00:05:48,500 Nakonec, když se provádí váš program, nebo když jste to udělal ladění 117 00:05:48,500 --> 00:05:50,125 a chcete ustoupit z prostředí GDB, 118 00:05:50,125 --> 00:05:51,940 je dobré vědět, jak se z toho dostat. 119 00:05:51,940 --> 00:05:55,500 Můžete zadat Q, nebo Quit, se dostat ven. 120 00:05:55,500 --> 00:05:59,220 Nyní, před dnešním videu Připravil jsem kočárek programu 121 00:05:59,220 --> 00:06:03,900 volal buggy1, kterou jsem sestavil ze souboru známého jako buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Jak se dalo očekávat, tento Program je ve skutečnosti buggy. 123 00:06:06,500 --> 00:06:08,990 Něco se pokazí když se snažím a spusťte jej. 124 00:06:08,990 --> 00:06:13,014 Nyní, bohužel, jsem nechtěně vypouští můj buggy1.c soubor, 125 00:06:13,014 --> 00:06:15,930 tak, aby pro mě přijít na to, co se děje špatně s tímto programem, 126 00:06:15,930 --> 00:06:18,770 Budu muset použít GDB druh slepě, snažila 127 00:06:18,770 --> 00:06:22,372 navigovat prostřednictvím tohoto programu zjistit, co přesně se děje špatně. 128 00:06:22,372 --> 00:06:24,580 Ale pouze pomocí nástrojů už jsme se dozvěděli o, 129 00:06:24,580 --> 00:06:27,700 můžeme skoro obrázek co přesně to je. 130 00:06:27,700 --> 00:06:30,740 Takže pojďme přes hlavu na CS50 IDE a podívat se. 131 00:06:30,740 --> 00:06:33,155 OK, takže jsme tady v mém CS50 IDE prostředí, 132 00:06:33,155 --> 00:06:35,697 a já přiblížit trochu takže můžete vidět trochu více. 133 00:06:35,697 --> 00:06:38,530 V mém okně terminálu, když jsem seznam obsah mého současného ředitele 134 00:06:38,530 --> 00:06:41,250 s LS, uvidíme, že já mají několik zdrojových souborů 135 00:06:41,250 --> 00:06:44,982 tady, včetně bylo popsáno dříve buggy1. 136 00:06:44,982 --> 00:06:46,940 Co přesně se děje, když Snažím se spustit buggy1. 137 00:06:46,940 --> 00:06:47,773 Tak pojďme zjistit. 138 00:06:47,773 --> 00:06:52,510 Píšu dot lomítko, buggy, a já stiskněte klávesu Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentace závady. 140 00:06:53,670 --> 00:06:55,000 To není dobré. 141 00:06:55,000 --> 00:06:57,180 Pokud si vzpomínáte, je Porucha segmentace typicky 142 00:06:57,180 --> 00:07:01,540 nastane, když jsme se přístup k paměti že jsme není dovoleno dotýkat. 143 00:07:01,540 --> 00:07:03,820 Jsme nějak dosáhl venku hranic 144 00:07:03,820 --> 00:07:05,995 o tom, co program se kompilátor, nám dal. 145 00:07:05,995 --> 00:07:08,310 A tak už to je stopa, aby v panelu nástrojů 146 00:07:08,310 --> 00:07:10,660 jak začít proces ladění. 147 00:07:10,660 --> 00:07:13,620 Něco se už trochu špatně. 148 00:07:13,620 --> 00:07:15,935 >> V pořádku, takže začněme up na životní prostředí GDB 149 00:07:15,935 --> 00:07:19,030 a uvidíme, jestli se nám podaří zjistit, co přesně je problém. 150 00:07:19,030 --> 00:07:21,674 Chystám se pročistil obrazovku, a budu psát GDB 151 00:07:21,674 --> 00:07:24,340 opět vstoupit do životního prostředí GDB, a název programu 152 00:07:24,340 --> 00:07:27,450 že chci ladit, buggy1. 153 00:07:27,450 --> 00:07:30,182 Dostaneme malý vzkaz, čtení symboly z buggy1, hotovo. 154 00:07:30,182 --> 00:07:32,390 Vše, co znamená, že je to vytáhl spolu veškerý kód, 155 00:07:32,390 --> 00:07:35,570 a teď to bylo naloženo do GDB, a je připraven jít. 156 00:07:35,570 --> 00:07:37,140 >> A teď, co chci dělat? 157 00:07:37,140 --> 00:07:39,130 Vzpomínáš si, co se Prvním krokem je obvykle 158 00:07:39,130 --> 00:07:42,540 poté, co jsem si uvnitř tohoto prostředí? 159 00:07:42,540 --> 00:07:44,540 Doufejme, že zmíněná sada bod zlomu, protože 160 00:07:44,540 --> 00:07:46,240 Ve skutečnosti, že je to, co chci dělat. 161 00:07:46,240 --> 00:07:47,990 Teď už nemají zdrojový kód pro tuto 162 00:07:47,990 --> 00:07:50,948 přede mnou, což je asi není typický případ užití, mimochodem. 163 00:07:50,948 --> 00:07:52,055 Pravděpodobně jste nebude. 164 00:07:52,055 --> 00:07:52,680 Tak to je dobře. 165 00:07:52,680 --> 00:07:55,790 Ale za předpokladu, že ne, co je ta funkce, že víte, 166 00:07:55,790 --> 00:07:58,880 existuje v každém programu C? 167 00:07:58,880 --> 00:08:04,420 Bez ohledu na to, jak velký nebo jak složité to je, je tato funkce určitě existuje. 168 00:08:04,420 --> 00:08:05,440 Main, že jo? 169 00:08:05,440 --> 00:08:08,870 >> Takže není-li vše ostatní, my můžeme Nastavte místo přerušení na hlavní. 170 00:08:08,870 --> 00:08:12,200 A opět, jsem mohl jen zadat zlomit hlavní, místo toho, b. 171 00:08:12,200 --> 00:08:14,650 A pokud jste zvědaví, jestli někdy zadejte si dlouze příkaz 172 00:08:14,650 --> 00:08:16,800 a pak si uvědomit, že vás napsal něco špatného, 173 00:08:16,800 --> 00:08:18,770 a chcete se zbavit ze všeho, jak jsem právě udělal, 174 00:08:18,770 --> 00:08:22,029 si můžete převzít kontrolu U, který bude smazat všechno a přivést zpět 175 00:08:22,029 --> 00:08:23,570 na začátek kurzorových linek. 176 00:08:23,570 --> 00:08:26,569 Mnohem rychleji než jen podržte vymazat, nebo bít 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 nastavit bod zlomu na hlavní. 179 00:08:28,740 --> 00:08:32,970 A jak můžete vidět, je to říká, že máme Nastavte místo přerušení v souboru buggy1.c, 180 00:08:32,970 --> 00:08:36,330 a zřejmě první řádek kódu z hlavní linky je sedm. 181 00:08:36,330 --> 00:08:38,080 Opět platí, že nemáme zdrojový soubor zde, 182 00:08:38,080 --> 00:08:40,429 ale budu předpokládat, že je to mi pravdu. 183 00:08:40,429 --> 00:08:44,510 A pak, jen se snažím a spustit program, r. 184 00:08:44,510 --> 00:08:45,360 Spuštění programu. 185 00:08:45,360 --> 00:08:48,160 Dobře, takže tato zpráva je trochu tajemný. 186 00:08:48,160 --> 00:08:50,160 Ale v podstatě to, co je děje, tady je to jen 187 00:08:50,160 --> 00:08:53,350 říkal mi, že jsem udeřil svou přestávku bod, bod zlomu číslo 1. 188 00:08:53,350 --> 00:08:55,877 >> A pak, že řádek kódu, Žádný takový soubor nebo adresář. 189 00:08:55,877 --> 00:08:57,710 Jediný důvod, proč Vidím tu zprávu 190 00:08:57,710 --> 00:09:00,800 je proto, že jsem nechtěně vypouští můj buggy.c souboru. 191 00:09:00,800 --> 00:09:04,050 Kdyby moje buggy1.c soubor existuje v aktuálním adresáři, 192 00:09:04,050 --> 00:09:06,920 že linka přímo tam by vlastně řekni mi, co řádek kódu 193 00:09:06,920 --> 00:09:08,214 doslova čte. 194 00:09:08,214 --> 00:09:09,380 Bohužel, Vymazal jsem ho. 195 00:09:09,380 --> 00:09:14,790 Budeme muset trochu navigaci přes to trochu víc slepě. 196 00:09:14,790 --> 00:09:17,330 >> OK, takže uvidíme, co se chci dělat? 197 00:09:17,330 --> 00:09:21,770 No, já bych rád věděl, co místní Proměnné Možná mám k dispozici. 198 00:09:21,770 --> 00:09:23,570 Já jsem začal můj program. 199 00:09:23,570 --> 00:09:28,515 Podívejme se, co by mohlo být již inicializován pro nás. 200 00:09:28,515 --> 00:09:31,430 Píšu Info místní obyvatelé, žádné místní obyvatelé. 201 00:09:31,430 --> 00:09:33,960 Dobře, takže není dej mi spoustu informací. 202 00:09:33,960 --> 00:09:37,600 Mohl bych zkusit a vytisknout proměnnou, ale já nevím, žádné názvy proměnných. 203 00:09:37,600 --> 00:09:39,930 Mohl bych zkusit zadní stopu, ale já jsem uvnitř hlavní, 204 00:09:39,930 --> 00:09:43,710 takže vím, že neučinily další volání funkce právě teď. 205 00:09:43,710 --> 00:09:47,710 >> Tak vypadá moje jediné možnosti jsou používat n nebo tak a začít do toho ponořit. 206 00:09:47,710 --> 00:09:49,630 Budu používat n. 207 00:09:49,630 --> 00:09:51,180 Tak jsem typ N. 208 00:09:51,180 --> 00:09:53,060 Ach můj bože, co se tu děje. 209 00:09:53,060 --> 00:09:56,260 Program přijímané signály, SIGSEGV chyba segmentace, 210 00:09:56,260 --> 00:09:57,880 a pak se celá parta věci. 211 00:09:57,880 --> 00:09:58,880 Já už jsem ohromen. 212 00:09:58,880 --> 00:10:00,980 No, je to vlastně Hodně se zde naučil. 213 00:10:00,980 --> 00:10:02,520 Takže to, co nám to říká? 214 00:10:02,520 --> 00:10:09,180 To, co nám říká, je tento program chystal, ale dosud nedošlo, seg chyba. 215 00:10:09,180 --> 00:10:12,550 A zejména, jdu přiblížíte ještě tady, 216 00:10:12,550 --> 00:10:18,980 je to o tom, aby Seg chybu o něco, co nazývá strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nyní, nemůžeme diskutovali Tato funkce značně. 218 00:10:22,705 --> 00:10:25,580 Ale to je--, protože nebudeme mluvit o všechny funkce, které 219 00:10:25,580 --> 00:10:28,610 existuje ve standardu C library-- ale všichni jsou vám k dispozici, 220 00:10:28,610 --> 00:10:32,110 zvláště pokud užíváte podívejte se na reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 A strcmp je opravdu silný funkce, která existuje uvnitř 222 00:10:35,000 --> 00:10:38,070 z string.h hlavičky Soubor, který je hlavička 223 00:10:38,070 --> 00:10:41,970 Soubor, který je věnován funkcím že práce se a manipulovat s řetězci. 224 00:10:41,970 --> 00:10:49,830 >> A především, co dělá, je strcmp srovnává hodnoty dvou řetězců. 225 00:10:49,830 --> 00:10:54,160 Takže jsem asi segmentace poruchy Na základě výzvy k strcmp se zdá. 226 00:10:54,160 --> 00:10:58,530 Jsem narazila n, a ve skutečnosti se zobrazí zpráva, Program ukončen signálem SIGSEGV 227 00:10:58,530 --> 00:11:01,370 chyba segmentace. Tak teď Vlastně jsem si seg vyčítáno, 228 00:11:01,370 --> 00:11:06,479 a můj program má dost mnohem efektivněji vzdal. 229 00:11:06,479 --> 00:11:07,770 To je konec programu. 230 00:11:07,770 --> 00:11:10,370 To se porouchal, havaroval. 231 00:11:10,370 --> 00:11:14,740 Takže nebylo moc, ale já ve skutečnosti se dozvěděl trochu 232 00:11:14,740 --> 00:11:16,747 z této malé zkušenosti. 233 00:11:16,747 --> 00:11:17,580 Co jsem se naučil? 234 00:11:17,580 --> 00:11:22,020 No, můj zhroucení programu skoro okamžitě. 235 00:11:22,020 --> 00:11:26,300 Můj zhroucení programu na výzva k strcmp, ale já 236 00:11:26,300 --> 00:11:30,560 nemají žádné lokální proměnné v mém Program v době, kdy došlo ke zhroucení. 237 00:11:30,560 --> 00:11:37,320 Takže to, co řetězce, nebo řetězce, bych mohl být porovnávání. 238 00:11:37,320 --> 00:11:42,140 Pokud nemám jakýkoli místní proměnné, můžete 239 00:11:42,140 --> 00:11:45,520 dohadovat, že jsem have-- tam možná je globální proměnná, která by mohla být pravda. 240 00:11:45,520 --> 00:11:47,670 >> Obecně ale, zdá se, jako bych porovnávání 241 00:11:47,670 --> 00:11:52,070 k něčemu, co neexistuje. 242 00:11:52,070 --> 00:11:54,130 Takže pojďme prozkoumat že o kousek dál. 243 00:11:54,130 --> 00:11:55,120 Takže jsem se, abych si pročistil obrazovku. 244 00:11:55,120 --> 00:11:57,536 Chystám se ukončit ven z GDB prostředí na vteřinu. 245 00:11:57,536 --> 00:12:01,300 A já jsem přemýšlel, OK, takže je tu žádné lokální proměnné v mém programu. 246 00:12:01,300 --> 00:12:06,444 Zajímalo by mě, jestli bys mám předat v řetězci jako argument příkazového řádku. 247 00:12:06,444 --> 00:12:07,610 Tak ať to jen vyzkoušet to. 248 00:12:07,610 --> 00:12:09,020 Neudělal jsem to předtím. 249 00:12:09,020 --> 00:12:14,244 >> Uvidíme, jestli Možná kdybych spustit tento program s argument příkazového řádku to funguje. 250 00:12:14,244 --> 00:12:16,140 Huh, žádná chyba tam segmentace. 251 00:12:16,140 --> 00:12:17,870 To mi řekl, že jsem na to přišel. 252 00:12:17,870 --> 00:12:19,170 Takže možná, že je to oprava sem. 253 00:12:19,170 --> 00:12:27,560 A skutečně, když jsem se vrátit a podívat se na aktuální zdrojový kód pro buggy1.c, 254 00:12:27,560 --> 00:12:31,180 se zdá, že to, co dělám, je Dělám volání strcmp bez 255 00:12:31,180 --> 00:12:34,010 ověření, zda ve skutečnosti argv [1] existuje. 256 00:12:34,010 --> 00:12:36,730 To je vlastně zdrojový kód pro buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Takže to, co opravdu potřebujete učinit zde pro opravu můj program, 258 00:12:38,855 --> 00:12:40,835 za předpokladu, že mám mít soubor přede mnou, je 259 00:12:40,835 --> 00:12:44,740 jen přidat šek, aby se zda argc je roven 2. 260 00:12:44,740 --> 00:12:47,780 Takže tento příklad, opět, jak jsem řekl, je trochu nepřirozený, že jo? 261 00:12:47,780 --> 00:12:49,840 Ty obvykle nebude omylem smazat zdrojového kódu 262 00:12:49,840 --> 00:12:51,820 a pak se muset pokusit a ladění programu. 263 00:12:51,820 --> 00:12:53,120 Ale doufejme, že dal jste ilustrace 264 00:12:53,120 --> 00:12:55,120 z druhů věcí, které byste mohli myslet 265 00:12:55,120 --> 00:12:56,610 jak jste ladění programu. 266 00:12:56,610 --> 00:12:58,760 >> Jaký je stav věcí tady? 267 00:12:58,760 --> 00:13:00,510 Co dělat proměnné I mají přístup na mě? 268 00:13:00,510 --> 00:13:03,600 Kde přesně je můj program shazovat, na jakém linie, 269 00:13:03,600 --> 00:13:05,240 o tom, co volání jakou funkci? 270 00:13:05,240 --> 00:13:06,952 Jaké stopy však, že mi dal? 271 00:13:06,952 --> 00:13:08,910 A to je přesně druh myšlení, které vám 272 00:13:08,910 --> 00:13:12,820 by mělo být dostat se do, když jste přemýšlet o ladění programů. 273 00:13:12,820 --> 00:13:13,820 >> Jsem Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 To je CS50. 275 00:13:16,140 --> 00:15:08,642