1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Ahoj, Jsem [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Dnes se budeme být při pohledu na ladění. 4 00:00:04,410 --> 00:00:06,697 Nejen, že budeme mluvit o některých technikách, 5 00:00:06,697 --> 00:00:09,280 ale také budeme dívat na některé funkce obsažené 6 00:00:09,280 --> 00:00:14,170 v rámci CS50 IDE, které umožňují snadno ladit program. 7 00:00:14,170 --> 00:00:16,272 >> Jen jeden příklad něco, co se může pokazit 8 00:00:16,272 --> 00:00:18,730 a je to vlastně něco že jsme již viděli dříve. 9 00:00:18,730 --> 00:00:23,200 V tomto případě se jedná o program, C který přijímá celé číslo od uživatele, 10 00:00:23,200 --> 00:00:27,580 rozdělí ji dva, a poskytuje výstup zpět uživateli. 11 00:00:27,580 --> 00:00:30,610 Teď z toho, co jsme viděli, dříve v přednáškách, 12 00:00:30,610 --> 00:00:34,370 víme, že to bude skutečně způsobit specifické typy problémů divize 13 00:00:34,370 --> 00:00:35,860 když máme lichá čísla. 14 00:00:35,860 --> 00:00:40,330 >> Konkrétně, budeme prostě vyhodit za desetinnou čárkou cokoliv. 15 00:00:40,330 --> 00:00:43,170 Teď víme, že to se stane být případ. 16 00:00:43,170 --> 00:00:47,430 A pokud bychom jej spustit, můžeme potvrdit, naše podezření, první, kompilací. 17 00:00:47,430 --> 00:00:50,460 A pak, spuštěním a zadávání lichý počet. 18 00:00:50,460 --> 00:00:51,720 >> To není nic nového. 19 00:00:51,720 --> 00:00:54,490 Ale to je vlastně Příkladem chybu, která 20 00:00:54,490 --> 00:00:58,810 mohou existovat v rámci většího programu že se stává těžší vystopovat. 21 00:00:58,810 --> 00:01:02,640 I když víme, co je problém Je pravda, jádro věci 22 00:01:02,640 --> 00:01:06,250 by se mohly pokusit identifikovat zejména pokud dojde k chybě, 23 00:01:06,250 --> 00:01:09,750 určení toho, co tento problém je, a pak ji opravit. 24 00:01:09,750 --> 00:01:14,400 Takže Poskytujeme tuto jako příklad z toho, co by mohlo být něco 25 00:01:14,400 --> 00:01:19,030 že už víme, ale mohou být pohřben v rámci jiných prvků kódu. 26 00:01:19,030 --> 00:01:23,090 >> Takže otevřením tohoto dalšího zdroje kód soubor jako příklad, 27 00:01:23,090 --> 00:01:27,165 Toto rozdělení problém je nyní součástí širšího programu. 28 00:01:27,165 --> 00:01:29,040 Přesto by mohlo být trochu bit nepřirozený, a my 29 00:01:29,040 --> 00:01:31,076 by mohl být schopen snadno identifikovat, zejména 30 00:01:31,076 --> 00:01:32,450 od té doby jsme jen diskutovat o tomto. 31 00:01:32,450 --> 00:01:38,250 Ale můžeme přijít na to, že tento Problém může existovat ve větším měřítku. 32 00:01:38,250 --> 00:01:45,450 >> Pokud bych to kompilace a teď spusťte jej, zadejte liché číslo, 33 00:01:45,450 --> 00:01:49,816 můžeme vidět, že nebudeme mít přesně výstup, že můžeme očekávat. 34 00:01:49,816 --> 00:01:51,690 V tomto konkrétním případě, můžeme říci, že jsme 35 00:01:51,690 --> 00:01:56,060 chcete spočítat všechna čísla od jednoho do určité konkrétní číslo. 36 00:01:56,060 --> 00:01:58,130 A my můžeme vidět, že jsme mají řadu problémů 37 00:01:58,130 --> 00:02:03,880 zde, pokud budeme výstup, jednoduše, 0 a 1, když jsme poskytují vstup 5. 38 00:02:03,880 --> 00:02:07,380 >> Takže už víme, že tam je tu problém. 39 00:02:07,380 --> 00:02:11,662 Ale my se nemusí přesně vědět, kde tento problém skutečně existuje. 40 00:02:11,662 --> 00:02:13,620 Teď jeden ze způsobů, se můžeme pokusit opravit 41 00:02:13,620 --> 00:02:15,745 je něco, co máme již byl představen. 42 00:02:15,745 --> 00:02:18,880 Můžeme stačí použít ve větším měřítku. 43 00:02:18,880 --> 00:02:21,680 >> Na řádku 14, máme tato funkce printf, 44 00:02:21,680 --> 00:02:25,620 což nám umožňuje vytisknout státu z různých informací. 45 00:02:25,620 --> 00:02:28,880 A to je něco, co vás by měl využít v rámci svého programu 46 00:02:28,880 --> 00:02:33,100 aby se pokusili zjistit, co přesně je se děje v různých řádků kódu. 47 00:02:33,100 --> 00:02:36,350 Takže i když to není Konečný výstup, že jsme vlastně 48 00:02:36,350 --> 00:02:39,830 chtějí vyrábět z tento program, stále 49 00:02:39,830 --> 00:02:42,300 může mít nějaké ladění Prohlášení kde jsme 50 00:02:42,300 --> 00:02:46,970 může pokusit se zjistit, co přesně se děje uvnitř našeho kódu. 51 00:02:46,970 --> 00:02:51,210 >> Takže v tomto případě, budu printf se značkou ladění. 52 00:02:51,210 --> 00:02:53,540 V tomto případě se jedná jen ladění řetězec 53 00:02:53,540 --> 00:02:56,840 že jsem až nepříjemné, takže se stane velmi jasně ve výstupu mého kódu 54 00:02:56,840 --> 00:02:59,200 co to je, že chci ukázat. 55 00:02:59,200 --> 00:03:04,410 A výstup zde číslo které jsme vypočítány. 56 00:03:04,410 --> 00:03:06,800 >> V tomto případě, já bych mohl chtějí přesně vědět, 57 00:03:06,800 --> 00:03:11,380 , co se děje před a Po nějaké konkrétní výpočty. 58 00:03:11,380 --> 00:03:16,224 Takže jsem mohl před použít printf a po tomto řádku kódu. 59 00:03:16,224 --> 00:03:18,640 V tomto případě by mohla dokonce jsem aby to trochu víc jasné, 60 00:03:18,640 --> 00:03:21,960 tím, že říká ladění před a ladění po tak 61 00:03:21,960 --> 00:03:26,540 že nemám plést sám s více řádků, které vypadají totožné. 62 00:03:26,540 --> 00:03:32,290 >> Teď, když jsme to překompilovat a běh to, zadejte číslo jako pět znovu, 63 00:03:32,290 --> 00:03:35,090 můžeme vidět, že máme Nyní výstup před a po 64 00:03:35,090 --> 00:03:40,670 a zjistíte, že jsme neudělali jasné rozdělení nebo jasné mají čísla 65 00:03:40,670 --> 00:03:43,680 že jsme vlastně chcete dělat. 66 00:03:43,680 --> 00:03:48,660 Nyní v tomto případě se jedná ve skutečnosti není jasný výstup. 67 00:03:48,660 --> 00:03:52,440 Není to opravdu jasné, že výsledek chceme z tohoto konkrétního programu. 68 00:03:52,440 --> 00:03:54,427 >> A to je, opět, je trochu nepřirozený. 69 00:03:54,427 --> 00:03:57,510 Ale možná, jednou z věcí, které bychom mohli udělat v případě, že specifikace řekl, 70 00:03:57,510 --> 00:04:01,900 že chceme rozdělit tím, 2 a přidá se 1-- tak, jinými slovy, 71 00:04:01,900 --> 00:04:04,550 chceme zaokrouhlit up-- pak abychom věděli, že jsme mohli 72 00:04:04,550 --> 00:04:08,060 dělat, že konkrétní věc, v tomto případě. 73 00:04:08,060 --> 00:04:14,010 Teď víme, že budeme možné přidat 1 do našeho sníží na polovinu počtu. 74 00:04:14,010 --> 00:04:16,490 >> Pojďme to překompilovat a potvrzují, že tato 75 00:04:16,490 --> 00:04:18,860 se chová tak, že chceme. 76 00:04:18,860 --> 00:04:21,980 Můžeme vidět, že nyní před s, máme číslo 5. 77 00:04:21,980 --> 00:04:26,620 Poté, co, máme číslo 3, která je podle našeho specifikace, 78 00:04:26,620 --> 00:04:29,292 je to, co jsme chtěli udělat. 79 00:04:29,292 --> 00:04:31,000 Ale když se podíváme na Výstup tady, můžeme 80 00:04:31,000 --> 00:04:33,760 vidět, že bychom mohli mít další bug celkem, což je 81 00:04:33,760 --> 00:04:36,940 že začínáme naši počítat od 0. 82 00:04:36,940 --> 00:04:39,390 >> Nyní se znovu, to je něco, že jsme viděli v minulosti 83 00:04:39,390 --> 00:04:42,500 a můžeme opravit poměrně snadno. 84 00:04:42,500 --> 00:04:44,790 Ale v tomto případě jsme také měl výhodu 85 00:04:44,790 --> 00:04:48,940 použití příkazu printf přímo uvnitř smyčky for 86 00:04:48,940 --> 00:04:52,930 přesně vědět, kde se děje, že chyba. 87 00:04:52,930 --> 00:04:55,150 Takže printf prohlášení jsou velmi užitečné při pomoci 88 00:04:55,150 --> 00:04:57,940 určit, kde, Přesně ve zdrojovém kódu, 89 00:04:57,940 --> 00:05:00,620 specifická chyba nastane. 90 00:05:00,620 --> 00:05:03,650 >> A to je také důležité si uvědomit, že, jak jsme psaní kódu, 91 00:05:03,650 --> 00:05:06,052 bychom mohli mít předpoklady o stavu programu. 92 00:05:06,052 --> 00:05:08,510 Nebo bychom mohli mít předpoklady o tom, co část programu 93 00:05:08,510 --> 00:05:13,020 je vlastně správné, nebo nesprávné, při později, když jsme stavět na tomto programu 94 00:05:13,020 --> 00:05:15,950 a učinit z něj součást komplexní a větší program, 95 00:05:15,950 --> 00:05:19,700 že bychom si uvědomit, že některé aspekty z toho není ve skutečnosti buggy. 96 00:05:19,700 --> 00:05:22,680 >> Použití printf může opravdu pomoci zúžit a identifikovat 97 00:05:22,680 --> 00:05:26,430 regiony programu, který nemusí chová přesně tak, že jsme 98 00:05:26,430 --> 00:05:29,500 očekávat, že, na základě našich předpokladů. 99 00:05:29,500 --> 00:05:31,460 Ale je tu další nástroje k dispozici, stejně, 100 00:05:31,460 --> 00:05:34,860 že nám umožní pokusit se zjistit , kde se chyba vyskytuje 101 00:05:34,860 --> 00:05:39,930 A také, konkrétně, jaké věci se děje uvnitř programu. 102 00:05:39,930 --> 00:05:41,990 >> Takže pomocí printf je velmi užitečné, pokud chceme, 103 00:05:41,990 --> 00:05:45,900 určit konkrétní oblasti program, který má nějakou chybu. 104 00:05:45,900 --> 00:05:47,730 Ale je to také stává únavné po chvíli. 105 00:05:47,730 --> 00:05:50,500 V tomto případě se jedná o relativně jednoduchý program 106 00:05:50,500 --> 00:05:52,750 jen s jedním nebo dvěma proměnnými. 107 00:05:52,750 --> 00:05:57,260 A to se stává pro nás velmi snadné vytisknout hodnotu těchto proměnných 108 00:05:57,260 --> 00:05:59,670 v rámci většího programu. 109 00:05:59,670 --> 00:06:02,670 >> Ale abychom mohli mít jiný program, který má mnoho proměnných. 110 00:06:02,670 --> 00:06:06,530 A to nemusí být zcela tak snadné printf 111 00:06:06,530 --> 00:06:10,120 pokusit se vyhodnotit, co se děje každému z těchto proměnných 112 00:06:10,120 --> 00:06:13,590 Jelikož je program provádění. 113 00:06:13,590 --> 00:06:16,960 Tam je program, který existuje volal debugger programu. 114 00:06:16,960 --> 00:06:20,320 V tomto případě je ten, který budeme Použití je GNU debugger, nebo GDB, 115 00:06:20,320 --> 00:06:24,260 že nám umožňuje kontrolovat interní workings programu v mnohem 116 00:06:24,260 --> 00:06:25,700 detailní cesta. 117 00:06:25,700 --> 00:06:28,810 >> Můžeme skutečně provádět GDB z příkazového řádku 118 00:06:28,810 --> 00:06:35,370 zde jednoduše napsáním GDB a příkaz, který chceme ladit. 119 00:06:35,370 --> 00:06:37,550 V tomto případě počítat. 120 00:06:37,550 --> 00:06:41,650 Nyní v tomto případě můžeme vidět, že to nás přivádí do řádku, který říká, že GDB. 121 00:06:41,650 --> 00:06:44,020 A můžeme skutečně provádění příkazů k GDB 122 00:06:44,020 --> 00:06:48,260 skutečně zahájit provádění z Program, zastavte jej v určitých bodech, 123 00:06:48,260 --> 00:06:51,060 vyhodnotit proměnné a zkontrolujte proměnné, které 124 00:06:51,060 --> 00:06:54,152 existují ve stavu programu v danou chvíli 125 00:06:54,152 --> 00:06:55,110 a tak dále a tak dále. 126 00:06:55,110 --> 00:06:57,240 Poskytuje hodně síly k nám. 127 00:06:57,240 --> 00:06:59,960 >> Ale to jen tak se stane že CS50 IDE také 128 00:06:59,960 --> 00:07:05,870 poskytuje GUI nebo uživatele rozhraní pro GDB, že 129 00:07:05,870 --> 00:07:11,120 umožňuje nám to udělat, aniž byste museli příkazového řádku rozhraní vůbec 130 00:07:11,120 --> 00:07:13,560 nebo dokonce vůbec. 131 00:07:13,560 --> 00:07:16,930 Tak, že mohu získat přístup, že je pomocí tlačítka ladění 132 00:07:16,930 --> 00:07:20,120 na samém vrcholu CS50 IDE. 133 00:07:20,120 --> 00:07:24,280 Nyní v minulosti, co máme vidět, je to, že pomocí příkazu 134 00:07:24,280 --> 00:07:27,660 linka kompilace a spustit program. 135 00:07:27,660 --> 00:07:29,790 >> Tlačítko ladění dělá obou těchto kroků. 136 00:07:29,790 --> 00:07:34,380 Ale také to přinese až Karta debugger na extrémní pravici 137 00:07:34,380 --> 00:07:38,280 který nám umožňuje prohlédnout celou řadu vlastností programu 138 00:07:38,280 --> 00:07:40,500 jak je provádění. 139 00:07:40,500 --> 00:07:44,280 Mám-li na tlačítko Debug, v tomto případ, bude vychovávat 140 00:07:44,280 --> 00:07:48,230 nová karta v konzoli Okno na samém dně. 141 00:07:48,230 --> 00:07:51,160 >> A můžete vidět, že tato karta má některé informace na samém vrcholu. 142 00:07:51,160 --> 00:07:52,670 A můžeme do značné míry ignorovat. 143 00:07:52,670 --> 00:07:54,800 Ale jedna z věcí, že chceme všimnout 144 00:07:54,800 --> 00:07:57,170 je to, že výstupy totéž, co jsme 145 00:07:57,170 --> 00:08:03,000 by se dostat, pokud jsme se snažili spustit, aby na C program v terminálovém okně. 146 00:08:03,000 --> 00:08:06,230 >> Zde můžeme vidět, že to běží řinčení, a má celou řadu příznaků, 147 00:08:06,230 --> 00:08:12,660 a to je kompilace naši count.c soubor, která byla vybraná karta v době 148 00:08:12,660 --> 00:08:15,100 že jsem narazila ladění. 149 00:08:15,100 --> 00:08:18,010 Tak to je velmi užitečná, protože nyní pomocí tohoto tlačítka ladění, 150 00:08:18,010 --> 00:08:23,280 můžeme současně kompilace a spustit program, který jsme vlastně 151 00:08:23,280 --> 00:08:24,460 chcete spustit. 152 00:08:24,460 --> 00:08:27,880 >> Jedním z příznaků, které je důležité, v tomto případě, 153 00:08:27,880 --> 00:08:30,190 jsme skutečně používali nejdelší dobu 154 00:08:30,190 --> 00:08:32,450 ale také jen dělal nějaký ruku mávání [neslyšitelný], který 155 00:08:32,450 --> 00:08:33,820 je tohle tady. 156 00:08:33,820 --> 00:08:35,790 V zazvoněním, říká -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 V tomto případě to, co jsme vyprávění zazvoněním, náš překladač, 159 00:08:41,250 --> 00:08:43,820 je to, že chceme sestavit náš program. 160 00:08:43,820 --> 00:08:46,810 Ale také jaké jsou označované jako informace o symbol 161 00:08:46,810 --> 00:08:50,940 takže kompilátor má skutečně přístup na mnoha podkladových informací 162 00:08:50,940 --> 00:08:52,610 obsažené v rámci programu. 163 00:08:52,610 --> 00:08:55,260 >> Přesněji řečeno, je počet funkcí, které mám, 164 00:08:55,260 --> 00:08:58,000 jména těchto funkcí, proměnné, typy 165 00:08:58,000 --> 00:09:01,730 že tyto proměnné jsou, a různé z dalších věcí, které pomáhají debugger 166 00:09:01,730 --> 00:09:04,350 vykonávat svou činnost. 167 00:09:04,350 --> 00:09:06,600 Teď je tu ještě něco to je důležité zmínit, 168 00:09:06,600 --> 00:09:10,280 když mluvíme o chod program tímto způsobem. 169 00:09:10,280 --> 00:09:13,660 >> Všimněte si, že to má vlastně vychoval novou kartu v naší konzole 170 00:09:13,660 --> 00:09:14,780 po dně. 171 00:09:14,780 --> 00:09:18,600 Máme již nemusí komunikovat přímo s okno terminálu. 172 00:09:18,600 --> 00:09:21,420 Ale tato nová karta je ve skutečnosti okno terminálu. 173 00:09:21,420 --> 00:09:26,710 Prostě je specifická pro chod Program, který jsme vytvořili. 174 00:09:26,710 --> 00:09:29,270 >> Všimněte si, že ve spodní části, v v kombinaci s nějakým výstupem 175 00:09:29,270 --> 00:09:33,500 tím, zvonit kompilátor a GDB, které můžeme do značné míry ignorovat, 176 00:09:33,500 --> 00:09:37,570 ve skutečnosti ukazuje výstup náš program na samém dně. 177 00:09:37,570 --> 00:09:41,240 Teď je důležité si uvědomit, že toto jedno okno vlastně 178 00:09:41,240 --> 00:09:43,360 vám ukáže Výstup z programu 179 00:09:43,360 --> 00:09:47,190 ale také může přijímat vstup pro daný program, stejně. 180 00:09:47,190 --> 00:09:49,260 >> Takže oznámení, která říká, Prosím, zadejte číslo, 181 00:09:49,260 --> 00:09:53,050 který je stejný výstup, který jsme měli měl v terminálovém okně předtím. 182 00:09:53,050 --> 00:09:55,510 Ale už je to uvedeno v této nové kartě. 183 00:09:55,510 --> 00:09:56,550 I můžete zadat číslo. 184 00:09:56,550 --> 00:10:00,900 A to bude skutečně fungují jako očekáváme 185 00:10:00,900 --> 00:10:05,890 nám ukazuje náš ladění, výstup, výstup, který by mohl být buggy, 186 00:10:05,890 --> 00:10:07,010 jak jsme viděli dříve. 187 00:10:07,010 --> 00:10:10,460 A na samém dně, jej ve skutečnosti má nějaký přídavný výstup 188 00:10:10,460 --> 00:10:14,550 z HDP, jen říkám, že tento program ukončen. 189 00:10:14,550 --> 00:10:16,655 >> Teď, jak jste viděli v této zejména běh přes, 190 00:10:16,655 --> 00:10:19,370 by bylo velmi málo užitečné, protože i 191 00:10:19,370 --> 00:10:23,740 když jsme měli přijít menu debugger up, to bylo ještě běžící program. 192 00:10:23,740 --> 00:10:26,790 V žádném okamžiku udělal to vlastně pozastavit výkon pro nás 193 00:10:26,790 --> 00:10:30,767 aby bylo možné kontrolovat všechny proměnné obsažené. 194 00:10:30,767 --> 00:10:32,850 Je tu něco jiného že musíme udělat, aby 195 00:10:32,850 --> 00:10:36,910 dostat GDB si uvědomit, že chceme, pozastavit provádění programu 196 00:10:36,910 --> 00:10:42,820 a ne jen aby mohl pokračovat v řízení obvykle jako bychom ve všech ostatních případech. 197 00:10:42,820 --> 00:10:45,530 >> Za účelem pozastavení plnění, v nějaké konkrétní lince, 198 00:10:45,530 --> 00:10:47,830 musíme vytvořit to, co je volal bodu zlomu. 199 00:10:47,830 --> 00:10:52,670 A zlom je velmi snadno vytvořena v tomto CS50 IDE tím, že myši 200 00:10:52,670 --> 00:10:57,090 a klepnutím na tlačítko přímo vlevo nějaké konkrétní číslo řádku. 201 00:10:57,090 --> 00:10:59,920 Jednou jsem to udělal, červená tečka Zobrazí se, což znamená, 202 00:10:59,920 --> 00:11:02,300 že linka je nyní bodu zlomu. 203 00:11:02,300 --> 00:11:07,540 >> A příště, který jsem běžet GDB to, se zastavíte v tomto bodu zlomu 204 00:11:07,540 --> 00:11:10,280 jakmile dosáhne tento řádek kódu. 205 00:11:10,280 --> 00:11:12,230 Nyní je tento důležitý si uvědomit 206 00:11:12,230 --> 00:11:16,140 že to není nezbytně případ, že každý řádek kódu 207 00:11:16,140 --> 00:11:17,880 je ve skutečnosti k dispozici. 208 00:11:17,880 --> 00:11:23,780 Pokud bych měl vytvořit funkci tady, pro example-- void F-- 209 00:11:23,780 --> 00:11:31,230 a prostě tiskovou linku here-- ahoj world-- pokud Nikdy jsem zavolat tuto funkci, 210 00:11:31,230 --> 00:11:34,770 to bude v případě, že když jsem nastavit bodu zlomu, 211 00:11:34,770 --> 00:11:36,220 funkce nebude nikdy volal. 212 00:11:36,220 --> 00:11:38,310 A proto je tento zejména zlom 213 00:11:38,310 --> 00:11:43,040 Nikdy vlastně pozastaví provádění programu. 214 00:11:43,040 --> 00:11:48,020 >> Takže řekněme, že jsem správně vytvořit přestávka bod na nějakém řádku kódu 215 00:11:48,020 --> 00:11:50,340 , který bude skutečně provedena. 216 00:11:50,340 --> 00:11:53,470 Nyní je v tomto případě, to je První řádek v hlavní funkce. 217 00:11:53,470 --> 00:11:56,630 Tak to bude jistě případ že jakmile začnu provedení, 218 00:11:56,630 --> 00:11:58,580 bude dosaženo velmi první řádek. 219 00:11:58,580 --> 00:12:00,230 GDB se zastaví provádění. 220 00:12:00,230 --> 00:12:04,100 A pak budu moci interakci s ladicí program. 221 00:12:04,100 --> 00:12:08,480 >> Můžete nastavit více řádky jako Hraniční hodnoty, pokud byste chtěli. 222 00:12:08,480 --> 00:12:11,365 Můžeme také vytvořit line up zde v tomto segmentu kódu 223 00:12:11,365 --> 00:12:12,490 že nikdy nebude dosaženo. 224 00:12:12,490 --> 00:12:14,744 A můžeme také nastavit jednu níže. 225 00:12:14,744 --> 00:12:16,660 Důvod, že bychom Chcete to uděláme 226 00:12:16,660 --> 00:12:19,119 jít do trochu víc detail za chvíli. 227 00:12:19,119 --> 00:12:21,660 Takže teď mi dovolte, abych prostě zakázat tyto další body přerušení 228 00:12:21,660 --> 00:12:24,940 takže se můžeme podívat na to, co se děje když mám jednu přestávku 229 00:12:24,940 --> 00:12:27,650 bod v mém programu. 230 00:12:27,650 --> 00:12:29,410 Udělal jsem nějaké změny tohoto programu. 231 00:12:29,410 --> 00:12:30,750 Tak jsem třeba uložit. 232 00:12:30,750 --> 00:12:34,490 Budu klepněte na příkaz debug tak, že můžu začne kompilace a poté 233 00:12:34,490 --> 00:12:36,880 provádění ladicí program. 234 00:12:36,880 --> 00:12:40,632 >> Budeme vidět, že po okamžicích, o linka, která jsme vybrali jako přestávce 235 00:12:40,632 --> 00:12:43,360 bod je zvýrazněn žlutě. 236 00:12:43,360 --> 00:12:47,440 Můžeme také všimnout, že v horní přímo v ladění panelu 237 00:12:47,440 --> 00:12:50,940 že ikona pauza změnil do malé ikony přehrávání. 238 00:12:50,940 --> 00:12:54,710 To znamená, že máme pauzu provedení, v tomto konkrétním případě. 239 00:12:54,710 --> 00:12:57,840 A bít na tlačítko Přehrát by nám umožní pokračovat v provádění 240 00:12:57,840 --> 00:13:00,000 v tomto konkrétním bodě. 241 00:13:00,000 --> 00:13:03,240 >> Všimněte si, že je tu pár dalších Tlačítka jsou k dispozici v tomto ladění panelu, 242 00:13:03,240 --> 00:13:04,220 také. 243 00:13:04,220 --> 00:13:09,470 Krok přes, což mi umožňuje spustit, že jeden řádek kódu 244 00:13:09,470 --> 00:13:14,030 a krok se k tomuto řádku na příští, která, v tomto případě, 245 00:13:14,030 --> 00:13:17,060 by znamenalo, že printf příkaz proveden. 246 00:13:17,060 --> 00:13:22,310 A bude pak pauza exekuce na řádku 13, tak jako. 247 00:13:22,310 --> 00:13:25,090 >> A je tu také krok do funkce, což 248 00:13:25,090 --> 00:13:28,950 je užitečné, pokud jsem vytvořil další Funkce jinde ve zdrojovém kódu. 249 00:13:28,950 --> 00:13:31,420 A chci vstoupit do ty funkce spíše než 250 00:13:31,420 --> 00:13:33,050 vykonávat tuto funkci, jako celek. 251 00:13:33,050 --> 00:13:37,279 Ale podíváme více na kroku do funkce za chvíli. 252 00:13:37,279 --> 00:13:40,320 Nyní si všimnout některé další věci, které ve skutečnosti existují v tomto ladění panelu. 253 00:13:40,320 --> 00:13:44,110 >> Máme tento panel nazvaný zásobník volání, který nám ukazuje, 254 00:13:44,110 --> 00:13:45,300 kde přesně jsme. 255 00:13:45,300 --> 00:13:48,550 V tomto případě jsme jsou uvnitř z hlavních funkcí. 256 00:13:48,550 --> 00:13:50,880 Náš scénář se nazývá count.c. 257 00:13:50,880 --> 00:13:53,820 A my stalo, že se na řádek 13, sloupec onu, který 258 00:13:53,820 --> 00:13:58,950 je přesně to, co zvýrazní region zdrojového kódu indikuje, stejně. 259 00:13:58,950 --> 00:14:02,435 >> Nyní si všimněte, že to také ukazuje, pod lokální proměnné úseku 260 00:14:02,435 --> 00:14:06,710 všechny proměnné, které existují v rámci této funkce. 261 00:14:06,710 --> 00:14:08,930 Je důležité si uvědomit, že všechny proměnné 262 00:14:08,930 --> 00:14:12,580 se objeví v tomto lokální proměnné část uvnitř funkce, 263 00:14:12,580 --> 00:14:14,380 ještě před tím, než jsou definovány. 264 00:14:14,380 --> 00:14:19,160 Vidíme tu, že máme proměnnou volal num, má výchozí hodnotu 0, 265 00:14:19,160 --> 00:14:21,280 a to je typu int. 266 00:14:21,280 --> 00:14:24,110 >> Nyní, než jsme vlastně inicializovat všechny tyto proměnné, 267 00:14:24,110 --> 00:14:26,685 nejsme nutně zaručeno, že vidět hodnotu 0. 268 00:14:26,685 --> 00:14:29,200 A v závislosti na dalších popravách že jste provedli 269 00:14:29,200 --> 00:14:32,020 a stav vaší paměti při jste skutečně spustit tento program, 270 00:14:32,020 --> 00:14:34,605 můžete zjistit, že vás Nevidím hodnoty 0 271 00:14:34,605 --> 00:14:36,550 a, místo toho, některé další bláznivé čísla. 272 00:14:36,550 --> 00:14:38,390 >> Ale nebojte se o tom. 273 00:14:38,390 --> 00:14:44,610 Nebude to být relevantní, dokud jste skutečně inicializovat hodnotu. 274 00:14:44,610 --> 00:14:49,630 Nyní v tomto případě můžeme vidět, že Jsem provedl nějaké výstupy. 275 00:14:49,630 --> 00:14:52,131 A já, právě teď, se zastavil popravu. 276 00:14:52,131 --> 00:14:53,880 Ale v tomto případě to, co Opravdu chci dělat 277 00:14:53,880 --> 00:14:58,060 je nyní překročit tento řádek kódu, takže můžu vlastně 278 00:14:58,060 --> 00:15:04,390 dotaz uživatele pro toto int, že chceme používat v našem programu. 279 00:15:04,390 --> 00:15:07,060 >> Nyní v tomto případě, kdy Jsem narazila překročit, oznámení 280 00:15:07,060 --> 00:15:11,940 že Pozastavení nebo spíše Resume Tlačítko se změní na toto tlačítko Pause 281 00:15:11,940 --> 00:15:14,022 proto, že tento kód je ve skutečnosti provádění. 282 00:15:14,022 --> 00:15:15,730 Co se děje právě teď je, že je 283 00:15:15,730 --> 00:15:21,630 na nás čeká na vstup nějaké informace jak můžeme vidět naše výstupním textu 284 00:15:21,630 --> 00:15:23,600 na samém dně. 285 00:15:23,600 --> 00:15:25,787 >> Takže teď, je to ne ve skutečnosti se odmlčel, 286 00:15:25,787 --> 00:15:28,620 I když to, tak nějak se zdá, být proto, že se nic neděje. 287 00:15:28,620 --> 00:15:32,360 Ale jen tak se stane, že v můj specifický případ na řádku 13, 288 00:15:32,360 --> 00:15:34,210 Čekám na vstup uživatele. 289 00:15:34,210 --> 00:15:39,130 A tak GDB není schopen kontrolovat program se rozběhne. 290 00:15:39,130 --> 00:15:43,370 >> Nyní příště, že mám zadat některé input-- takže budu zadejte toto číslo 5, 291 00:15:43,370 --> 00:15:46,140 jak jsme viděli v past-- hit Return, a my 292 00:15:46,140 --> 00:15:51,430 Všimněte si, že okamžitě, GDB pauzy a opět upozorňuje na další řádek. 293 00:15:51,430 --> 00:15:55,320 Ale všimněte si, že teď, jako Výsledkem naší zadáním hodnoty, 294 00:15:55,320 --> 00:15:58,930 jsme aktualizovali tuto hodnotu uvnitř z našich lokálních proměnných, které 295 00:15:58,930 --> 00:16:05,560 je velmi užitečné, aby přesně znát co, že číslo bylo v paměti. 296 00:16:05,560 --> 00:16:10,650 >> Nyní mohu dovolit tento program pokračovat hrát až do konce jeho provedení 297 00:16:10,650 --> 00:16:12,570 tím, že udeří Pokračovat. 298 00:16:12,570 --> 00:16:16,410 Vidíme, že velmi rychle dělá program skončit vykonávající 299 00:16:16,410 --> 00:16:19,790 o stejném výkonu, které jsme předtím, ladicí program zavře, 300 00:16:19,790 --> 00:16:23,170 a nyní tento program zcela nezastaví. 301 00:16:23,170 --> 00:16:25,320 >> I ukazují, že pouze pro účely vidí to, co 302 00:16:25,320 --> 00:16:27,280 se stane, když jsme vlastně hit Pokračovat. 303 00:16:27,280 --> 00:16:30,640 Ale my ve skutečnosti se chystáme chci se vrátit do tohoto programu 304 00:16:30,640 --> 00:16:33,820 takže se můžeme pokusit ladění přesně to, co se děje. 305 00:16:33,820 --> 00:16:37,980 Teď, když jsem pomocí ladicího programu, mohu Není nutné tyto debug printf prohlášení. 306 00:16:37,980 --> 00:16:43,860 >> Takže jsem je mohl odstranit co budu dělat Nyní stačí se vrátit k našemu jednodušší kód 307 00:16:43,860 --> 00:16:45,950 že jsme měli před chvílí. 308 00:16:45,950 --> 00:16:48,790 Teď, když jsem se zachránit naprogramovat a spustit jej, 309 00:16:48,790 --> 00:16:53,700 to bude, opět, jděte na tuto počáteční zlomit bod, který jsem měl na lince 11. 310 00:16:53,700 --> 00:16:57,700 A budu moci prohlédnout moje proměnné jako já chci dělat. 311 00:16:57,700 --> 00:17:00,695 >> To jen tak se stane, že to Součástí není příliš zajímavé, 312 00:17:00,695 --> 00:17:04,364 A vím, že jdu vytisknout toto prohlášení. 313 00:17:04,364 --> 00:17:05,280 Prosím, zadejte číslo. 314 00:17:05,280 --> 00:17:08,099 A pak, já vím, že jdu požádat uživatele pro toto celé číslo. 315 00:17:08,099 --> 00:17:13,329 Tak snad jsem skutečně chtějí hýbat rozbít bod trochu dál. 316 00:17:13,329 --> 00:17:16,710 >> Můžete odstranit body přerušení kliknutím, opět přímo 317 00:17:16,710 --> 00:17:18,460 na levo od uvedené číslo řádku. 318 00:17:18,460 --> 00:17:22,200 To red dot zmizí, což znamená, že tento zlom je nyní pryč. 319 00:17:22,200 --> 00:17:24,780 Nyní v tomto případě, poprava byla pozastavena. 320 00:17:24,780 --> 00:17:27,770 A tak to není vlastně bude pokračovat v tomto konkrétním případě. 321 00:17:27,770 --> 00:17:30,210 Ale mohu nastavit pauzu bod o něco později. 322 00:17:30,210 --> 00:17:33,880 >> A když teď jsem znovu můj kód, bude pokračovat a říct 323 00:17:33,880 --> 00:17:36,190 bod tohoto bodem zlomu. 324 00:17:36,190 --> 00:17:37,374 Opět platí, že jsem narazila životopis. 325 00:17:37,374 --> 00:17:39,040 Nevypadá jako nic se neděje. 326 00:17:39,040 --> 00:17:41,450 Ale to je proto, že moje kód čeká na vstup. 327 00:17:41,450 --> 00:17:47,900 Budu zadat číslo 5, stiskněte klávesu Enter, a Nyní bude hit další zlom. 328 00:17:47,900 --> 00:17:50,570 >> Nyní v tomto případě to je řádek kódu 329 00:17:50,570 --> 00:17:53,820 že předtím, než jsme věděli, náhodou buggy. 330 00:17:53,820 --> 00:17:57,590 Takže pojďme hodnotit, co se stane v tomto konkrétním okamžiku. 331 00:17:57,590 --> 00:18:02,620 Když je zvýrazněna čára, to linka dosud nebyl vykonán. 332 00:18:02,620 --> 00:18:06,490 Takže v tomto případě můžeme vidět že mám číslo, které 333 00:18:06,490 --> 00:18:11,610 Mám číslo s názvem num, že má hodnotu 5. 334 00:18:11,610 --> 00:18:15,090 A já budu vykonávat někteří matematiky na tomto čísle. 335 00:18:15,090 --> 00:18:20,130 >> Kdybych krok nad tím, můžeme Všimněte si, že hodnotu pro num 336 00:18:20,130 --> 00:18:23,780 změnilo v souladu se aritmetika, že jsme skutečně udělali. 337 00:18:23,780 --> 00:18:26,810 A teď, že jsme z toho pro vnitřní smyčky 338 00:18:26,810 --> 00:18:29,090 nebo nyní, že pro smyčce sám je zvýrazněn, 339 00:18:29,090 --> 00:18:32,450 vidíme, že máme nový Proměnná Volal jsem, že 340 00:18:32,450 --> 00:18:35,370 se bude použit v tom, že na smyčce. 341 00:18:35,370 --> 00:18:38,230 >> Nyní pamatovat Předtím jsem zmínil, že někdy, že jste 342 00:18:38,230 --> 00:18:43,470 uvidí nějaký blázen Čísla jsou ve výchozím nastavení před tímto číslem 343 00:18:43,470 --> 00:18:45,530 nebo že proměnná je ve skutečnosti inicializován. 344 00:18:45,530 --> 00:18:49,040 Můžeme vidět, že přesně zde v této proměnné 345 00:18:49,040 --> 00:18:51,345 Volal jsem, který nemá dosud inicializován 346 00:18:51,345 --> 00:18:53,560 v době zvýraznění. 347 00:18:53,560 --> 00:18:57,070 Ale můžeme vidět, že má nějaké číslo že bychom vlastně očekávat. 348 00:18:57,070 --> 00:18:57,620 >> To je v pohodě. 349 00:18:57,620 --> 00:18:59,661 Nebojte se o tom protože jsme vlastně 350 00:18:59,661 --> 00:19:04,970 inicializuje toto číslo až I překročit této přímky a hodnotu 351 00:19:04,970 --> 00:19:08,560 i byla inicializována na hodnotu 1. 352 00:19:08,560 --> 00:19:11,400 Tak vidět, že to je vlastně v případě, pojďme překročit. 353 00:19:11,400 --> 00:19:14,420 Nyní můžeme vidět, že linka byla popravena. 354 00:19:14,420 --> 00:19:17,000 A jsme nyní zvýraznění printf tento řádek. 355 00:19:17,000 --> 00:19:22,230 >> A teď můžeme vidět, jak naše hodnoty o i a 3 se měnily v průběhu času. 356 00:19:22,230 --> 00:19:26,450 To je velmi užitečné k tomu, ve skutečnosti, je překročit linky opakovaně. 357 00:19:26,450 --> 00:19:30,480 A můžete najít to, co ve skutečnosti se děje uvnitř vašeho pro smyčky 358 00:19:30,480 --> 00:19:33,660 a co se stane s proměnné uvnitř, že pro smyčce 359 00:19:33,660 --> 00:19:39,200 jako to provádění programu vyskytuje jeden krok v době. 360 00:19:39,200 --> 00:19:41,110 >> Právě v tomto bodě, I Překročila tak akorát 361 00:19:41,110 --> 00:19:44,210 že jsem teď jsem na konci mého programu. 362 00:19:44,210 --> 00:19:46,980 Kdybych krok přes to, že to bude vlastně přestane provádění 363 00:19:46,980 --> 00:19:48,860 jak jsme viděli v minulosti. 364 00:19:48,860 --> 00:19:52,110 Dovolte mi, abych to znovu, opět, tak že mohu poukázat něco jiného ven, 365 00:19:52,110 --> 00:19:53,320 také. 366 00:19:53,320 --> 00:19:55,350 >> V tomto případě je Nyní mě ptá, znovu, 367 00:19:55,350 --> 00:19:57,100 pro množství, které Budu znovu zadejte. 368 00:19:57,100 --> 00:20:00,300 Ale tentokrát, já jdu pro vstup do větší počet, takže pro smyčce 369 00:20:00,300 --> 00:20:02,540 bude opakovat vícekrát. 370 00:20:02,540 --> 00:20:06,090 V tomto případě, jdu zadejte hodnotu 11. 371 00:20:06,090 --> 00:20:08,390 >> Teď znovu, protože jsem nastavit bod zlomu na řádku 15, 372 00:20:08,390 --> 00:20:10,490 to bude upozornit na tento řádek. 373 00:20:10,490 --> 00:20:12,980 Můžeme vidět, že naše Číslo 11 je správně 374 00:20:12,980 --> 00:20:15,560 zastoupeny v našich lokálních proměnných. 375 00:20:15,560 --> 00:20:22,460 Stepping přes to, že můžeme nyní sledujte, co se stane s naší hodnotu i 376 00:20:22,460 --> 00:20:25,680 jak budeme pokračovat uvnitř to pro smyčku. 377 00:20:25,680 --> 00:20:31,960 To dostane zvýšen pokaždé, když dostat na vrchol, který pro smyčky. 378 00:20:31,960 --> 00:20:35,110 >> A teď jedna z věcí, které by mohly být užitečné provést během provádění 379 00:20:35,110 --> 00:20:40,490 tohoto programu je pro mě skutečně změnit proměnné Midstream vidět 380 00:20:40,490 --> 00:20:42,450 co se stane s mým programem. 381 00:20:42,450 --> 00:20:46,540 V tomto případě, můžu vlastně dvakrát klikněte na hodnotu. 382 00:20:46,540 --> 00:20:48,040 Všimněte si, že se stane textové pole. 383 00:20:48,040 --> 00:20:50,280 >> Nyní mohu vstoupit jiný úplně cení 384 00:20:50,280 --> 00:20:55,700 vidět, jak můj program se chová když jsem se změnil této proměnné. 385 00:20:55,700 --> 00:20:59,560 Nyní je v tomto případě, je proměnná i nyní obsahuje hodnotu 10. 386 00:20:59,560 --> 00:21:02,810 Ale program je stále zastavila popravy. 387 00:21:02,810 --> 00:21:07,610 Když jsem se překročit, vidím, že hodnota i, který jsem vstoupil jako 10, 388 00:21:07,610 --> 00:21:12,170 není větší než hodnota num, který okamžitě způsobí, že pro smyčce 389 00:21:12,170 --> 00:21:14,240 zastavit provádění. 390 00:21:14,240 --> 00:21:16,210 >> Teď to není jediný Důvodem, proč byste 391 00:21:16,210 --> 00:21:19,450 Chcete změnit proměnnou na místě. 392 00:21:19,450 --> 00:21:22,210 Dalo by se skutečně chtějí pokusit se tak změnit 393 00:21:22,210 --> 00:21:24,590 že můžete pokračovat vykonání smyčky 394 00:21:24,590 --> 00:21:27,370 nebo tak, že si můžete upravit nějakou hodnotu před ním 395 00:21:27,370 --> 00:21:32,630 dosáhne nějaké konkrétní sadu aritmetiky že se chystáte provést. 396 00:21:32,630 --> 00:21:36,210 >> Takže teď, že jsme vlastně změnit hodnota i jako program se provádění, 397 00:21:36,210 --> 00:21:39,540 to způsobilo, že pro smyčce přestat předčasně, protože najednou, i 398 00:21:39,540 --> 00:21:42,770 se stalo, že je větší než hodnota NUM, což znamená, že pro smyčce 399 00:21:42,770 --> 00:21:45,410 již nejsou potřebné, které mají být provedeny. 400 00:21:45,410 --> 00:21:48,780 Dále se to stalo, že je případ, který jsme změnili hodnotu i 401 00:21:48,780 --> 00:21:53,270 kdy byl zdůrazněn linka 17, což byl okamžik 402 00:21:53,270 --> 00:21:56,280 že pro provedení smyčky byl ve skutečnosti hodnoceny. 403 00:21:56,280 --> 00:22:00,210 >> Kdybych změnil hodnotu i na jiné lince, řekněme 19, 404 00:22:00,210 --> 00:22:03,360 bychom viděli jiný chování, protože linka 19 by 405 00:22:03,360 --> 00:22:08,310 byly provedeny před smyčky podmínka byla přehodnotila. 406 00:22:08,310 --> 00:22:11,900 Nyní na tomto místě, že jsem opět, Na konci tohoto programu. 407 00:22:11,900 --> 00:22:15,707 A mohu dovolit to přistoupit k aby můj program ukončit přirozeně. 408 00:22:15,707 --> 00:22:18,290 Ale je tu pár věcí, které jsou důležité, aby vzali 409 00:22:18,290 --> 00:22:19,960 z tohoto konkrétního jednání. 410 00:22:19,960 --> 00:22:22,490 Je třeba vyhodnotit Vaše vlastní předpoklady 411 00:22:22,490 --> 00:22:24,710 o tom, jak by měl být kód chová. 412 00:22:24,710 --> 00:22:28,220 Kdykoli si myslíte, že nějaký kus o kód víte, se stane i práci, 413 00:22:28,220 --> 00:22:30,940 to by mohlo být červená vlajka jít dozadu a vyhodnocovat, a ujistěte se, 414 00:22:30,940 --> 00:22:33,470 že vaše převzetí jak tento kód funguje 415 00:22:33,470 --> 00:22:38,290 je vlastně pravda, jak to je vyjádřeno ve zdrojovém kódu. 416 00:22:38,290 --> 00:22:41,300 >> Ale ještě více k bodu byl, když jsme pomocí debugger, 417 00:22:41,300 --> 00:22:43,920 si můžete dát na zarážky různé řádků kódu, 418 00:22:43,920 --> 00:22:48,110 který způsobí, že ladicí pauza provádění v každém z těchto linek 419 00:22:48,110 --> 00:22:52,210 takže můžete hodnotit paměti nebo dokonce ji změnit na svém místě. 420 00:22:52,210 --> 00:22:55,630 A opět, nezapomeňte, že můžete vytvořit více zarážky, abyste 421 00:22:55,630 --> 00:23:00,390 Můžete také pokračovat v provádění, přeskočte přes velké části kódu, 422 00:23:00,390 --> 00:23:04,790 a to bude automaticky pozastaví při dalším bodem zlomu. 423 00:23:04,790 --> 00:23:07,760 >> Tam je vlastně vyspělejší funkce ladicí program, stejně. 424 00:23:07,760 --> 00:23:10,170 Ale musíme vás odkázat některých dalších videa 425 00:23:10,170 --> 00:23:14,090 aby se skutečně dráždit od sebe, jak používat tyto konkrétní funkce. 426 00:23:14,090 --> 00:23:15,990 Pro tuto chvíli, děkuji moc za sledování. 427 00:23:15,990 --> 00:23:18,080 A hodně štěstí ladění.