1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Bok, Ja sam [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Danas ćemo se gleda na ispravljanje pogrešaka. 4 00:00:04,410 --> 00:00:06,697 Ne samo da ćemo govoriti o nekim tehnikama, 5 00:00:06,697 --> 00:00:09,280 ali ćemo gledati na neke od značajki sadržani 6 00:00:09,280 --> 00:00:14,170 u CS50 IDE koji omogućuju jednostavno ispravljanje program. 7 00:00:14,170 --> 00:00:16,272 >> Samo jedan primjer nešto što može poći po zlu 8 00:00:16,272 --> 00:00:18,730 i to je zapravo nešto kako smo već vidjeli. 9 00:00:18,730 --> 00:00:23,200 U ovom slučaju, to je program C koja prihvaća cijeli broj od korisnika, 10 00:00:23,200 --> 00:00:27,580 dijeli po dva, te pruža izlaz natrag korisniku. 11 00:00:27,580 --> 00:00:30,610 Sada od onoga što smo vidjeli ranije u predavanjima, 12 00:00:30,610 --> 00:00:34,370 Znamo da je to zapravo će izazvati određene vrste podjela problema 13 00:00:34,370 --> 00:00:35,860 kada imamo neparne brojeve. 14 00:00:35,860 --> 00:00:40,330 >> Naime, samo ćemo baciti ništa nakon decimalne točke. 15 00:00:40,330 --> 00:00:43,170 Sada znamo da je to se događa da se slučaj. 16 00:00:43,170 --> 00:00:47,430 A ako smo ga pokrenuti, možemo potvrditi naše sumnje, prva, sastavljanjem. 17 00:00:47,430 --> 00:00:50,460 A onda, trčanjem i ulaska neparan broj. 18 00:00:50,460 --> 00:00:51,720 >> To nije ništa novo. 19 00:00:51,720 --> 00:00:54,490 Ali to je zapravo Primjer bug koji 20 00:00:54,490 --> 00:00:58,810 može postojati unutar šireg programa koje postaje sve teže pronaći. 21 00:00:58,810 --> 00:01:02,640 Iako znamo što je problem je, pravi poanta je u tome 22 00:01:02,640 --> 00:01:06,250 možda pokušava identificirati posebno gdje je pogreška, 23 00:01:06,250 --> 00:01:09,750 identificiranje što taj problem je, a onda ga srediti. 24 00:01:09,750 --> 00:01:14,400 Dakle, dati ovo kao primjer onoga što bi moglo biti nešto 25 00:01:14,400 --> 00:01:19,030 koje smo već znali, ali može biti pokopani unutar drugih elemenata koda. 26 00:01:19,030 --> 00:01:23,090 >> Dakle, otvaranjem ovog drugog izvora broj datoteka kao primjer, 27 00:01:23,090 --> 00:01:27,165 ovaj problem podjela sada dio većeg programa. 28 00:01:27,165 --> 00:01:29,040 Ipak bi moglo biti malo malo neprirodan, a mi 29 00:01:29,040 --> 00:01:31,076 mogli lako prepoznati ga, pogotovo 30 00:01:31,076 --> 00:01:32,450 jer mi smo samo raspravljati. 31 00:01:32,450 --> 00:01:38,250 Ali možemo shvatiti da je ovaj Problem može postojati na većem mjerilu. 32 00:01:38,250 --> 00:01:45,450 >> Ako sam sastaviti ovaj i sada pokrenuti ga, unesite neparan broj, 33 00:01:45,450 --> 00:01:49,816 možemo vidjeti da ne dobijemo upravo izlaz da možemo očekivati. 34 00:01:49,816 --> 00:01:51,690 U ovom konkretnom slučaju, mogli bismo reći da smo 35 00:01:51,690 --> 00:01:56,060 želite brojati sve brojeve od jedne do nekog određenog broja. 36 00:01:56,060 --> 00:01:58,130 I možemo vidjeti da smo imaju različite probleme 37 00:01:58,130 --> 00:02:03,880 Ovdje ako smo izlaza, jednostavno, 0 i 1 kad smo dati doprinos od 5. 38 00:02:03,880 --> 00:02:07,380 >> Dakle, mi već znamo da postoji problem ovdje. 39 00:02:07,380 --> 00:02:11,662 Ali mi se ne može točno znati gdje je to pitanje zapravo postoji. 40 00:02:11,662 --> 00:02:13,620 Sada je jedan od načina na koji možemo pokušati popraviti ovaj 41 00:02:13,620 --> 00:02:15,745 je nešto što smo već uveo. 42 00:02:15,745 --> 00:02:18,880 Mi samo možemo ga koristiti na većem mjerilu. 43 00:02:18,880 --> 00:02:21,680 >> Na liniji 14, imamo ovo printf funkcija, 44 00:02:21,680 --> 00:02:25,620 što nam omogućuje da ispisati države različitih komada informacija. 45 00:02:25,620 --> 00:02:28,880 A to je nešto što vam treba iskoristiti u svom programu 46 00:02:28,880 --> 00:02:33,100 pokušati shvatiti točno ono što je događa u raznim linija koda. 47 00:02:33,100 --> 00:02:36,350 Dakle, čak i ako to nije Konačni izlaz da smo zapravo 48 00:02:36,350 --> 00:02:39,830 želite proizvode iz ovaj program, još uvijek 49 00:02:39,830 --> 00:02:42,300 Možda su neki debug izjava Gdje smo 50 00:02:42,300 --> 00:02:46,970 može pokušati shvatiti upravo ono se događa unutar našeg koda. 51 00:02:46,970 --> 00:02:51,210 >> Dakle, u ovom slučaju, ja ću printf s debug oznaku. 52 00:02:51,210 --> 00:02:53,540 U ovom slučaju, to je samo debug niz 53 00:02:53,540 --> 00:02:56,840 da sam se-stavljanjem, tako da ona postaje vrlo jasno u izlazu moj broj 54 00:02:56,840 --> 00:02:59,200 što je to što želim pokazati. 55 00:02:59,200 --> 00:03:04,410 A izlaz ovdje broj da smo izračunati. 56 00:03:04,410 --> 00:03:06,800 >> U ovom slučaju, mogao bih želim znati točno 57 00:03:06,800 --> 00:03:11,380 što se događa prije i Nakon nekog specifičnog računanja. 58 00:03:11,380 --> 00:03:16,224 Dakle, ja mogu koristiti prije printf a nakon toga linije koda. 59 00:03:16,224 --> 00:03:18,640 U ovom slučaju, mogao bih čak čine ga malo jasnije 60 00:03:18,640 --> 00:03:21,960 rekavši ispravljanje prije i ispravljanje nakon toliko 61 00:03:21,960 --> 00:03:26,540 da ja ne bih brkati s više linija koje izgledaju identično. 62 00:03:26,540 --> 00:03:32,290 >> Sada, ako ćemo rekompilirati ovo i trčanje da, unesite broj kao i pet opet, 63 00:03:32,290 --> 00:03:35,090 možemo vidjeti da imamo Sada izlaz prije i poslije 64 00:03:35,090 --> 00:03:40,670 a da nismo učinili jasan podjela ili čisto vlasništvo broja 65 00:03:40,670 --> 00:03:43,680 da smo zapravo želite učiniti. 66 00:03:43,680 --> 00:03:48,660 Sada, u ovom slučaju, to je zapravo nije jasan izlaz. 67 00:03:48,660 --> 00:03:52,440 To zapravo nije jasan ishod koji želimo iz ovog posebnog programa. 68 00:03:52,440 --> 00:03:54,427 >> A to je, opet, malo neprirodan. 69 00:03:54,427 --> 00:03:57,510 Ali, možda, jedna od stvari koje smo mogli učiniti ako specifikacija rekao 70 00:03:57,510 --> 00:04:01,900 koje želimo podijeliti ovu by 2 i dodati 1-- tako drugim riječima, 71 00:04:01,900 --> 00:04:04,550 želimo zaokružiti up-- onda mogli bismo znali da smo mogli 72 00:04:04,550 --> 00:04:08,060 učiniti da određenu stvar, u ovom slučaju. 73 00:04:08,060 --> 00:04:14,010 Sada ovdje znamo da ćemo biti mogućnosti dodati 1 na naše prepolovljen broj. 74 00:04:14,010 --> 00:04:16,490 >> Idemo rekompilirati ovo i potvrditi da je ovaj 75 00:04:16,490 --> 00:04:18,860 se ponaša na način koji želimo. 76 00:04:18,860 --> 00:04:21,980 Možemo vidjeti da je sada prije ima, mi imamo broj 5. 77 00:04:21,980 --> 00:04:26,620 Nakon što imamo broj 3, koja je prema našim specifikacijama, 78 00:04:26,620 --> 00:04:29,292 je ono što smo željeli učiniti. 79 00:04:29,292 --> 00:04:31,000 Ali ako pogledamo Izlaz ovdje, možemo 80 00:04:31,000 --> 00:04:33,760 vidjeti da bismo mogli imati još jedan bug zajedno, što je 81 00:04:33,760 --> 00:04:36,940 da mi se počinju naše računati od 0. 82 00:04:36,940 --> 00:04:39,390 >> Sada opet, to je nešto koje smo vidjeli u prošlosti 83 00:04:39,390 --> 00:04:42,500 a možemo popraviti prilično lako. 84 00:04:42,500 --> 00:04:44,790 No, u ovom slučaju, mi Također je imao korist 85 00:04:44,790 --> 00:04:48,940 korištenja printf izjavu izravno unutar za petlju 86 00:04:48,940 --> 00:04:52,930 da znam točno gdje da je greška bila u tijeku. 87 00:04:52,930 --> 00:04:55,150 Dakle printf izjave vrlo korisno u pomaganju 88 00:04:55,150 --> 00:04:57,940 da odredite gdje, upravo u svom izvornom kodu, 89 00:04:57,940 --> 00:05:00,620 specifična greška se događa. 90 00:05:00,620 --> 00:05:03,650 >> I to je također važno shvatiti da, kao što smo pisanje koda, 91 00:05:03,650 --> 00:05:06,052 bismo mogli imati pretpostavke o stanju programa. 92 00:05:06,052 --> 00:05:08,510 Ili bismo mogli imati pretpostavke o tome što dio programa 93 00:05:08,510 --> 00:05:13,020 je zapravo točan ili netočan kada kasnije kao što smo graditi na tom programu 94 00:05:13,020 --> 00:05:15,950 i čine ga jedan dio složen i veći programa 95 00:05:15,950 --> 00:05:19,700 da smo shvatili da neki aspekt to je zapravo lud. 96 00:05:19,700 --> 00:05:22,680 >> Korištenje printf zaista može pomoći suziti i prepoznati 97 00:05:22,680 --> 00:05:26,430 regije se program koji ne može se ponaša upravo onako kako smo 98 00:05:26,430 --> 00:05:29,500 očekivati, na temelju naših pretpostavki. 99 00:05:29,500 --> 00:05:31,460 No, tu je druge alate raspolaganju, kao i, 100 00:05:31,460 --> 00:05:34,860 koji omogućuju nam da pokušate slici gdje pogreška se događa 101 00:05:34,860 --> 00:05:39,930 I također, Naime, ono što stvari se događa unutar programa. 102 00:05:39,930 --> 00:05:41,990 >> Tako pomoću printf vrlo korisne kada želimo 103 00:05:41,990 --> 00:05:45,900 identificirati specifična područja program koji ima neki bug. 104 00:05:45,900 --> 00:05:47,730 Ali to također postaje dosadan nakon nekog vremena. 105 00:05:47,730 --> 00:05:50,500 U ovom slučaju, to je relativno jednostavan program 106 00:05:50,500 --> 00:05:52,750 sa samo jednom ili dvije varijable. 107 00:05:52,750 --> 00:05:57,260 I to postaje vrlo lako za nas ispisati vrijednosti tih varijabli 108 00:05:57,260 --> 00:05:59,670 u kontekstu većih programa. 109 00:05:59,670 --> 00:06:02,670 >> Ali bismo mogli imati drugačiji program koji ima mnogo varijabli. 110 00:06:02,670 --> 00:06:06,530 A to ne može biti sasvim tako jednostavan za korištenje printf 111 00:06:06,530 --> 00:06:10,120 pokušati procijeniti što se događa za svaku od tih varijabli 112 00:06:10,120 --> 00:06:13,590 kao programa izvršavanja. 113 00:06:13,590 --> 00:06:16,960 Postoji program koji postoji zove ispravljanje pogrešaka programa. 114 00:06:16,960 --> 00:06:20,320 U tom slučaju, onaj koji ćemo Uporaba je GNU program za pronalaženje pogrešaka, ili GDB, 115 00:06:20,320 --> 00:06:24,260 koji nam omogućuje da provjerite unutarnje djelovanju programa u mnogo više 116 00:06:24,260 --> 00:06:25,700 detaljan način. 117 00:06:25,700 --> 00:06:28,810 >> Mi zapravo može izvršiti GDB iz naredbenog retka 118 00:06:28,810 --> 00:06:35,370 Ovdje jednostavnim upisivanjem GDB i Naredba da želimo ispravljanje. 119 00:06:35,370 --> 00:06:37,550 U ovom slučaju, računati. 120 00:06:37,550 --> 00:06:41,650 Sada, u ovom slučaju, možemo vidjeti da je to nas dovodi do redak koji kaže GDB. 121 00:06:41,650 --> 00:06:44,020 I možemo zapravo izvršavanje naredbi na GDB 122 00:06:44,020 --> 00:06:48,260 zapravo početak izvršenja Program, zaustaviti ga na određenim mjestima, 123 00:06:48,260 --> 00:06:51,060 procjenu varijabli i pregledati varijable koje 124 00:06:51,060 --> 00:06:54,152 postoje u državni program u tom trenutku, 125 00:06:54,152 --> 00:06:55,110 i tako dalje i tako dalje. 126 00:06:55,110 --> 00:06:57,240 On pruža puno snage za nas. 127 00:06:57,240 --> 00:06:59,960 >> Ali to samo tako dogodi da CS50 IDE također 128 00:06:59,960 --> 00:07:05,870 pruža GUI ili korisnika sučelje za GDB da 129 00:07:05,870 --> 00:07:11,120 omogućuje nam da to učinite bez potrebe sučelje naredbenog retka god 130 00:07:11,120 --> 00:07:13,560 ili uopće još. 131 00:07:13,560 --> 00:07:16,930 Način na koji ja mogu pristupiti da je pomoću gumba debug 132 00:07:16,930 --> 00:07:20,120 na samom vrhu CS50 IDE. 133 00:07:20,120 --> 00:07:24,280 Sada je u prošlosti, ono što imamo Vidio je da koristimo naredbu 134 00:07:24,280 --> 00:07:27,660 linije za prikupljanje i zatim pokrenite program. 135 00:07:27,660 --> 00:07:29,790 >> Gumb ispravljanje radi oba od tih koraka. 136 00:07:29,790 --> 00:07:34,380 No, to će dovesti do debugger tab na desnoj strani 137 00:07:34,380 --> 00:07:38,280 koji nam omogućuje uvid u različite svojstava programa 138 00:07:38,280 --> 00:07:40,500 kao što je izvršavanje. 139 00:07:40,500 --> 00:07:44,280 Ako sam kliknite debug, u ovom slučaj, to će dovesti do 140 00:07:44,280 --> 00:07:48,230 nova kartica u konzolu Prozor na samom dnu. 141 00:07:48,230 --> 00:07:51,160 >> I možete vidjeti da je ova kartica ima neke informacije na samom vrhu. 142 00:07:51,160 --> 00:07:52,670 A mi uvelike može ignorirati to. 143 00:07:52,670 --> 00:07:54,800 No, jedna od stvari da želimo primijetiti 144 00:07:54,800 --> 00:07:57,170 je da izlazi ista stvar koja mi 145 00:07:57,170 --> 00:08:03,000 bi dobili ako bismo pokušali pokrenuti napraviti na Program C u terminalnom prozoru. 146 00:08:03,000 --> 00:08:06,230 >> Ovdje možemo vidjeti da je pokrenut zveket, i ima razne zastave, 147 00:08:06,230 --> 00:08:12,660 i to je sastavljanje našu count.c datoteku, koja je bila odabrana kartica u vrijeme 148 00:08:12,660 --> 00:08:15,100 da sam pogodio ispravljanje. 149 00:08:15,100 --> 00:08:18,010 Dakle, to je vrlo korisno, jer Sada pomoću ovog gumba debug, 150 00:08:18,010 --> 00:08:23,280 što istovremeno može sastaviti i onda izvršiti program koji smo zapravo 151 00:08:23,280 --> 00:08:24,460 želite pokrenuti. 152 00:08:24,460 --> 00:08:27,880 >> Jedan od zastava koja je važno, u ovom slučaju, 153 00:08:27,880 --> 00:08:30,190 zapravo sam bio koristeći za najdulji vrijeme 154 00:08:30,190 --> 00:08:32,450 ali i samo je neki ruku mašući [nečujan], koja 155 00:08:32,450 --> 00:08:33,820 je ovo jedan upravo ovdje. 156 00:08:33,820 --> 00:08:35,790 U zveket, ona kaže -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 U ovom slučaju, ono što smo reći zveket, naš prevodilac, 159 00:08:41,250 --> 00:08:43,820 je da želimo sastaviti naš program. 160 00:08:43,820 --> 00:08:46,810 No također pružaju ono što su zove simbol informacije 161 00:08:46,810 --> 00:08:50,940 tako da prevodilac zapravo ima pristup na puno informacija o podlozi 162 00:08:50,940 --> 00:08:52,610 sadržan u programu. 163 00:08:52,610 --> 00:08:55,260 >> Točnije, broj funkcija koje imam, 164 00:08:55,260 --> 00:08:58,000 imena tih funkcija, varijable, vrste 165 00:08:58,000 --> 00:09:01,730 da oni varijable, te razne drugih stvari koje pomažu debugger 166 00:09:01,730 --> 00:09:04,350 obavljati svoj rad. 167 00:09:04,350 --> 00:09:06,600 Sada postoji nešto drugo to je važno napomenuti 168 00:09:06,600 --> 00:09:10,280 kada smo raspravljali trčanje program na ovaj način. 169 00:09:10,280 --> 00:09:13,660 >> Obavijest da je zapravo izveo novu karticu u našem konzoli 170 00:09:13,660 --> 00:09:14,780 po dnu. 171 00:09:14,780 --> 00:09:18,600 Mi više ne moraju komunicirati izravno s prozora terminala. 172 00:09:18,600 --> 00:09:21,420 No, ova nova kartica zapravo terminala prozor. 173 00:09:21,420 --> 00:09:26,710 To samo je specifična za trčanje Program koji smo stvorili. 174 00:09:26,710 --> 00:09:29,270 >> Obavijest da je na dnu, u Kombinacija s nekim izlazom 175 00:09:29,270 --> 00:09:33,500 po zveket prevodilac i GDB, koje smo uvelike može zanemariti, 176 00:09:33,500 --> 00:09:37,570 to zapravo pokazuje izlaz naš program na samom dnu. 177 00:09:37,570 --> 00:09:41,240 Sada je važno shvatiti da je ovo jedan prozor zapravo 178 00:09:41,240 --> 00:09:43,360 će vam pokazati izlaz iz programa 179 00:09:43,360 --> 00:09:47,190 ali također može prihvatiti ulaz za taj program, kao dobro. 180 00:09:47,190 --> 00:09:49,260 >> Tako obavijest da govori unesite broj, 181 00:09:49,260 --> 00:09:53,050 koji je isti izlaz koji smo imali imali u terminal prozoru prije. 182 00:09:53,050 --> 00:09:55,510 Ali to je sada prikazana u ovoj novoj kartici. 183 00:09:55,510 --> 00:09:56,550 I možete unijeti broj. 184 00:09:56,550 --> 00:10:00,900 I to će zapravo funkcija kao što smo očekivali 185 00:10:00,900 --> 00:10:05,890 pokazujući nam naš debug, izlaz, izlaz koji bi mogli biti lud, 186 00:10:05,890 --> 00:10:07,010 kao što smo vidjeli prije. 187 00:10:07,010 --> 00:10:10,460 A na samom dnu, to zapravo ima neke dodatne izlaz 188 00:10:10,460 --> 00:10:14,550 od BDP-a samo reći da ovaj program je završen. 189 00:10:14,550 --> 00:10:16,655 >> Sada kao što ste vidjeli u to Konkretno trčanje preko, 190 00:10:16,655 --> 00:10:19,370 nije bio osobito korisni jer čak 191 00:10:19,370 --> 00:10:23,740 iako mi je došao izbornik debugger gore, to je još uvijek trčanje plan. 192 00:10:23,740 --> 00:10:26,790 Ni u jednom trenutku je to učinio zapravo pauzirati izvršenje za nas 193 00:10:26,790 --> 00:10:30,767 da biste mogli pregledati sve varijable sadržan u. 194 00:10:30,767 --> 00:10:32,850 Nešto je drugo da moramo učiniti kako bi 195 00:10:32,850 --> 00:10:36,910 doći GDB priznati da želimo pauzirati izvršenje programa 196 00:10:36,910 --> 00:10:42,820 i to ne samo dopustiti da biste nastavili normalno kao što bi u svakom drugom slučaju. 197 00:10:42,820 --> 00:10:45,530 >> Kako bi pauzirati izvršenje, u nekom određenom retku, 198 00:10:45,530 --> 00:10:47,830 moramo stvoriti ono što je zove break point. 199 00:10:47,830 --> 00:10:52,670 I break point je vrlo jednostavno stvorio u ovom CS50 IDE uzimanjem miša 200 00:10:52,670 --> 00:10:57,090 i klikom izravno na lijevo neke specifične linije broj. 201 00:10:57,090 --> 00:10:59,920 Kad sam to učiniti, crvena točka pojavi, što ukazuje 202 00:10:59,920 --> 00:11:02,300 da je linija je sada pauza točka. 203 00:11:02,300 --> 00:11:07,540 >> A sljedeći put kad sam pokrenuti GDB ga, prestat će se izvršenje na toj točki prekida 204 00:11:07,540 --> 00:11:10,280 kad dosegne tu liniju koda. 205 00:11:10,280 --> 00:11:12,230 A ovo je važan stvar za shvatiti 206 00:11:12,230 --> 00:11:16,140 da to nije nužno Slučaj koji je svaki redak koda 207 00:11:16,140 --> 00:11:17,880 je zapravo dostupna. 208 00:11:17,880 --> 00:11:23,780 Ako mi je stvoriti funkciju ovdje, za example-- void f-- 209 00:11:23,780 --> 00:11:31,230 i samo napraviti ispis liniju here-- Pozdrav svijet-ako nikada nazvati ovu funkciju, 210 00:11:31,230 --> 00:11:34,770 to će biti slučaj da je, ako sam postaviti break ovdje 211 00:11:34,770 --> 00:11:36,220 funkcija nikada neće biti pozvan. 212 00:11:36,220 --> 00:11:38,310 I zato, ovaj Posebno break 213 00:11:38,310 --> 00:11:43,040 Nikad zapravo će pauzirati Izvršenje programa. 214 00:11:43,040 --> 00:11:48,020 >> Pa recimo da sam ispravno stvoriti pauza točka na nekoj liniji koda 215 00:11:48,020 --> 00:11:50,340 koji će zapravo biti pogubljeni. 216 00:11:50,340 --> 00:11:53,470 Sada, u ovom slučaju, to je Prvi redak u glavnoj funkciji. 217 00:11:53,470 --> 00:11:56,630 Dakle, to će sigurno biti slučaj da, čim sam početak izvršenja, 218 00:11:56,630 --> 00:11:58,580 Prva linija će biti postignut. 219 00:11:58,580 --> 00:12:00,230 GDB će pauzirati izvršenje. 220 00:12:00,230 --> 00:12:04,100 I onda, ja ću biti u mogućnosti interakciju s ispravljanje pogrešaka. 221 00:12:04,100 --> 00:12:08,480 >> Možete postaviti više redaka što kontrolne točke, ako želite. 222 00:12:08,480 --> 00:12:11,365 Također možete stvoriti liniju gore ovdje u ovom segmentu kod 223 00:12:11,365 --> 00:12:12,490 da nikada neće biti postignut. 224 00:12:12,490 --> 00:12:14,744 I mi također može postaviti jedan u nastavku. 225 00:12:14,744 --> 00:12:16,660 Razlog da bismo želim to ćemo učiniti 226 00:12:16,660 --> 00:12:19,119 ići u malo više detalj u samo trenutak. 227 00:12:19,119 --> 00:12:21,660 Dakle, za sada, neka mi samo onemogućiti te dodatne break bodova 228 00:12:21,660 --> 00:12:24,940 tako da možemo gledati na ono što se događa kad imam jednu pauzu 229 00:12:24,940 --> 00:12:27,650 točka u mom programu. 230 00:12:27,650 --> 00:12:29,410 Ja sam napravio neke Promjene ovom programu. 231 00:12:29,410 --> 00:12:30,750 Dakle, trebam ga spasiti. 232 00:12:30,750 --> 00:12:34,490 Ja ću kliknite ispravljanje, tako da ja mogu započeti prikupljanje i potom 233 00:12:34,490 --> 00:12:36,880 izvršenje ispravljanje pogrešaka. 234 00:12:36,880 --> 00:12:40,632 >> Vidjet ćemo da je, nakon što je trenutaka, linija koja smo odabrali kao pauze 235 00:12:40,632 --> 00:12:43,360 točka je označena žutom bojom. 236 00:12:43,360 --> 00:12:47,440 Također možemo primijetiti da je u Gornji desni u debug ploči 237 00:12:47,440 --> 00:12:50,940 da je ikona stanka pretvorio u malu play ikonu. 238 00:12:50,940 --> 00:12:54,710 To znači da imamo pauzu izvršenje, u ovom konkretnom slučaju. 239 00:12:54,710 --> 00:12:57,840 I udarajući gumb Play bi nam omogućiti da nastavi izvršenje 240 00:12:57,840 --> 00:13:00,000 u tom određenom trenutku. 241 00:13:00,000 --> 00:13:03,240 >> Obavijest da postoji nekoliko drugih Tipke dostupne u ovom debug ploči, 242 00:13:03,240 --> 00:13:04,220 kao. 243 00:13:04,220 --> 00:13:09,470 Korak više, što mi omogućuje da izvršiti tu jednu liniju koda 244 00:13:09,470 --> 00:13:14,030 i korak preko te crte do Sljedeći, koji, u ovom slučaju, 245 00:13:14,030 --> 00:13:17,060 bi značilo da je printf naredba izvrši. 246 00:13:17,060 --> 00:13:22,310 A onda će pauzirati Izvršenje na liniji 13, kao i toliko. 247 00:13:22,310 --> 00:13:25,090 >> A tu je i korak u funkciju, što 248 00:13:25,090 --> 00:13:28,950 Korisno je ako sam stvorio drugi Funkcije drugdje u izvornom kodu. 249 00:13:28,950 --> 00:13:31,420 I želim korak u te funkcije, a ne 250 00:13:31,420 --> 00:13:33,050 izvršiti tu funkciju u cjelini. 251 00:13:33,050 --> 00:13:37,279 No, mi ćemo izgledati u koraku u funkciju u samo trenutak. 252 00:13:37,279 --> 00:13:40,320 Sada primijetite neke druge stvari koje Zapravo postoje u ovom debug ploči. 253 00:13:40,320 --> 00:13:44,110 >> Imamo ovu ploču naziva pozvati stog, što nam pokazuje 254 00:13:44,110 --> 00:13:45,300 gdje točno smo. 255 00:13:45,300 --> 00:13:48,550 U ovom slučaju, mi smo unutar glavne funkcije. 256 00:13:48,550 --> 00:13:50,880 Naša skripta zove count.c. 257 00:13:50,880 --> 00:13:53,820 A mi se dogoditi da se na linija 13, stupac jedan, koji 258 00:13:53,820 --> 00:13:58,950 je upravo ono što je istaknuo regija izvornog koda pokazuje, kao dobro. 259 00:13:58,950 --> 00:14:02,435 >> Sada primijetite da su to također pokazuje pod lokalnom promjenjivog presjeka 260 00:14:02,435 --> 00:14:06,710 sve varijable koje postoje unutar ove funkcije. 261 00:14:06,710 --> 00:14:08,930 Važno je napomenuti da sve varijable 262 00:14:08,930 --> 00:14:12,580 će se pojaviti u ovom lokalnom varijable poglavlje u funkciji, 263 00:14:12,580 --> 00:14:14,380 čak i prije nego što su definirani. 264 00:14:14,380 --> 00:14:19,160 Ovdje možemo vidjeti da imamo varijablu zove num, ima zadanu vrijednost 0, 265 00:14:19,160 --> 00:14:21,280 a je tipa int. 266 00:14:21,280 --> 00:14:24,110 >> Sada prije nego što smo zapravo inicijalizirati svih tih varijabli, 267 00:14:24,110 --> 00:14:26,685 nismo nužno zajamčeno da vidi vrijednost 0. 268 00:14:26,685 --> 00:14:29,200 I ovisno o drugim pogubljenja da ste obavili 269 00:14:29,200 --> 00:14:32,020 i stanje vaše memorije kada što zapravo pokrenuti ovaj program, 270 00:14:32,020 --> 00:14:34,605 možda otkrijete da vas ne vidim vrijednosti 0 271 00:14:34,605 --> 00:14:36,550 i, umjesto toga, neki drugi ludi brojevi. 272 00:14:36,550 --> 00:14:38,390 >> No, ne brinite o tome. 273 00:14:38,390 --> 00:14:44,610 To neće biti relevantni do što zapravo inicijalizirati vrijednost. 274 00:14:44,610 --> 00:14:49,630 Sada, u ovom slučaju, možemo vidjeti da Izvršio sam neke izlaze. 275 00:14:49,630 --> 00:14:52,131 A ja, sada, zastao izvršenje. 276 00:14:52,131 --> 00:14:53,880 No, u ovom slučaju, ono što Ja stvarno želim raditi 277 00:14:53,880 --> 00:14:58,060 je sada korak preko te linije koda, tako da ja mogu zapravo 278 00:14:58,060 --> 00:15:04,390 upit korisniku za tu int da želimo koristiti u našem programu. 279 00:15:04,390 --> 00:15:07,060 >> Sada je u ovom slučaju, kad Sam pogodio korak više, obavijest 280 00:15:07,060 --> 00:15:11,940 da Pauza odnosno Nastavi Gumb promijenio ovaj gumb Pause 281 00:15:11,940 --> 00:15:14,022 jer ovaj broj zapravo izvršenje. 282 00:15:14,022 --> 00:15:15,730 Što se događa sada je da je 283 00:15:15,730 --> 00:15:21,630 čekaju nas da unesete neke informacije kao što možemo vidjeti naš izlazni tekst 284 00:15:21,630 --> 00:15:23,600 na samom dnu. 285 00:15:23,600 --> 00:15:25,787 >> Pa sad, ovo je zapravo ne zastane, 286 00:15:25,787 --> 00:15:28,620 iako to, nekako, pojavljuje da, jer se ništa ne događa. 287 00:15:28,620 --> 00:15:32,360 Ali to samo tako dogodi da u moj konkretan slučaj na liniji 13, 288 00:15:32,360 --> 00:15:34,210 Čekam korisničkog unosa. 289 00:15:34,210 --> 00:15:39,130 I tako GDB nije u mogućnosti pregledati program kao što je trčanje. 290 00:15:39,130 --> 00:15:43,370 >> Sada sljedeći put da ulazim neki input-- pa ću ući u taj broj 5, 291 00:15:43,370 --> 00:15:46,140 kao što smo vidjeli u past-- pritisnite Return, a mi 292 00:15:46,140 --> 00:15:51,430 primijetiti da je, odmah GDB pauza i, opet, ističe sljedeći redak. 293 00:15:51,430 --> 00:15:55,320 Ali primijetite da je sada, kao Rezultat našeg unosa vrijednosti, 294 00:15:55,320 --> 00:15:58,930 smo ažurirali tu vrijednost unutar naših lokalnih varijabli koje 295 00:15:58,930 --> 00:16:05,560 vrlo je korisno znati točno što je broj bio u memoriji. 296 00:16:05,560 --> 00:16:10,650 >> Sada mogu dopustiti da ovaj program nastaviti igrati do kraja njegova izvršenja 297 00:16:10,650 --> 00:16:12,570 udarajući životopis. 298 00:16:12,570 --> 00:16:16,410 Možemo vidjeti da je vrlo brzo li program završiti izvršavanje 299 00:16:16,410 --> 00:16:19,790 s istim izlaz koji smo imali prije, debugger zatvara, 300 00:16:19,790 --> 00:16:23,170 i sad ovaj program je u potpunosti zaustavljen. 301 00:16:23,170 --> 00:16:25,320 >> Sam pokazati da je samo za Svrha vidjeti što 302 00:16:25,320 --> 00:16:27,280 se događa kada smo zapravo udario životopis. 303 00:16:27,280 --> 00:16:30,640 Ali mi zapravo ide na žele vratiti u ovaj program 304 00:16:30,640 --> 00:16:33,820 tako da možemo pokušati ispravljanje upravo ono što se događa. 305 00:16:33,820 --> 00:16:37,980 Sada kada sam koristeći program za pronalaženje pogrešaka, smijem Ne trebaju te ispravljanje printf izjave. 306 00:16:37,980 --> 00:16:43,860 >> Zato ih ja mogao ukloniti što ću učiniti sada samo vratiti na našu jednostavniji kod 307 00:16:43,860 --> 00:16:45,950 da smo imali prije nekoliko trenutaka. 308 00:16:45,950 --> 00:16:48,790 Sad kad sam spasiti programiranje i izvršiti ga, 309 00:16:48,790 --> 00:16:53,700 to će, opet, ići u tom početnom razbiti točku koja sam imala na liniji 11. 310 00:16:53,700 --> 00:16:57,700 I ja ću biti u mogućnosti pregledati moji varijable želim učiniti. 311 00:16:57,700 --> 00:17:00,695 >> To samo tako dogodi da je ovaj dio nije jako zanimljivo, 312 00:17:00,695 --> 00:17:04,364 I znam da ću otisnuti ovu izjavu. 313 00:17:04,364 --> 00:17:05,280 Unesite broj. 314 00:17:05,280 --> 00:17:08,099 A onda, znam da ću pitati korisnika za taj cijeli broj. 315 00:17:08,099 --> 00:17:13,329 Pa možda, ja zapravo želim da se presele moj razbiti točku malo dalje. 316 00:17:13,329 --> 00:17:16,710 >> Možete ukloniti break bodova klikom, opet, izravno 317 00:17:16,710 --> 00:17:18,460 s lijeve strane tog retka broj. 318 00:17:18,460 --> 00:17:22,200 To crvena točka će nestati, što ukazuje na da je pauza točka sada je otišao. 319 00:17:22,200 --> 00:17:24,780 Sada je u ovom slučaju, Izvršenje je zastao. 320 00:17:24,780 --> 00:17:27,770 I tako to nije zapravo ide nastaviti u tom slučaju. 321 00:17:27,770 --> 00:17:30,210 Ali ja mogu postaviti pauzu usmjerite malo kasnije. 322 00:17:30,210 --> 00:17:33,880 >> A kad sam sad nastaviti moj kod, što će se nastaviti i reći 323 00:17:33,880 --> 00:17:36,190 točka tog prekida točke. 324 00:17:36,190 --> 00:17:37,374 Opet, ja udario Nastavi. 325 00:17:37,374 --> 00:17:39,040 Zar ne izgledaju kao nešto što se događa. 326 00:17:39,040 --> 00:17:41,450 Ali to je zato što je moj kod čeka ulaz. 327 00:17:41,450 --> 00:17:47,900 Ja ću unijeti broj 5, pritisnite Enter, a sada sljedeći pauze točka će biti hit. 328 00:17:47,900 --> 00:17:50,570 >> Sada, u ovom slučaju, to je linija koda 329 00:17:50,570 --> 00:17:53,820 da, prije nego što smo znali dogodilo se lud. 330 00:17:53,820 --> 00:17:57,590 Tako ćemo procijeniti što se događa u ovom trenutku. 331 00:17:57,590 --> 00:18:02,620 Kada linija istaknuo, ova crta još nije izvršen. 332 00:18:02,620 --> 00:18:06,490 Dakle, u ovom slučaju, možemo vidjeti da imam broj, koji 333 00:18:06,490 --> 00:18:11,610 Imam cijeli broj pod nazivom num koji ima vrijednost 5. 334 00:18:11,610 --> 00:18:15,090 I ja ću biti obavljanje neke matematike na taj broj. 335 00:18:15,090 --> 00:18:20,130 >> Ako sam korak preko toga, možemo Obavijest da je vrijednost num 336 00:18:20,130 --> 00:18:23,780 promijenio u skladu s aritmetička da smo zapravo učinili. 337 00:18:23,780 --> 00:18:26,810 A sada da smo unutar toga za petlju 338 00:18:26,810 --> 00:18:29,090 ili sad da je za petlju Sam je istaknuo, 339 00:18:29,090 --> 00:18:32,450 vidimo da imamo novi varijabla sam nazvao da 340 00:18:32,450 --> 00:18:35,370 će se koristiti da se u petlji za. 341 00:18:35,370 --> 00:18:38,230 >> Zapamti Prije toga sam spomenuo da ponekad si 342 00:18:38,230 --> 00:18:43,470 ćemo vidjeti nekakav ludi brojevi su zadani prije tog broja 343 00:18:43,470 --> 00:18:45,530 ili da je varijabla zapravo inicijalizacije. 344 00:18:45,530 --> 00:18:49,040 Možemo vidjeti da je upravo ovdje u ovom varijable 345 00:18:49,040 --> 00:18:51,345 Zvao sam, koji nema još inicijalizacije 346 00:18:51,345 --> 00:18:53,560 u vrijeme isticanja. 347 00:18:53,560 --> 00:18:57,070 Ali možemo vidjeti da ima neki broj da mi ne bi zapravo očekuje. 348 00:18:57,070 --> 00:18:57,620 >> To je u redu. 349 00:18:57,620 --> 00:18:59,661 Ne brinite o tome jer imamo zapravo nije 350 00:18:59,661 --> 00:19:04,970 inicijalizira taj broj dok nisam korak preko te linije i vrijednosti 351 00:19:04,970 --> 00:19:08,560 ja se inicijalizira na vrijednost 1. 352 00:19:08,560 --> 00:19:11,400 Dakle, da se vidi da je to zapravo slučaj, idemo korak više. 353 00:19:11,400 --> 00:19:14,420 Sada možete vidjeti da je to linija je pogubljen. 354 00:19:14,420 --> 00:19:17,000 A mi smo sada naglašavajući ovo printf linije. 355 00:19:17,000 --> 00:19:22,230 >> I sada možemo vidjeti kako naše vrijednosti I i 3 su se promijenile tijekom vremena. 356 00:19:22,230 --> 00:19:26,450 To je vrlo korisno za napraviti, u stvari, je na korak preko linije puta. 357 00:19:26,450 --> 00:19:30,480 A možete pronaći ono što je zapravo se događa unutar vašeg petlje za 358 00:19:30,480 --> 00:19:33,660 i što se događa s varijabli unutar petlje da je za 359 00:19:33,660 --> 00:19:39,200 kao da je izvršenje programa javlja jedan korak u isto vrijeme. 360 00:19:39,200 --> 00:19:41,110 >> Sada u ovom trenutku, ja prišao dovoljno 361 00:19:41,110 --> 00:19:44,210 da sam sad sam na kraju mog programa. 362 00:19:44,210 --> 00:19:46,980 Ako sam korak preko toga, to će zapravo prestaje izvršenje 363 00:19:46,980 --> 00:19:48,860 kao što smo vidjeli u prošlosti. 364 00:19:48,860 --> 00:19:52,110 Dopustite mi da ponovno pokrenete ovaj, opet, tako da da mogu istaknuti nešto drugo, 365 00:19:52,110 --> 00:19:53,320 kao. 366 00:19:53,320 --> 00:19:55,350 >> U ovom slučaju, to je Sada me pitaju, opet, 367 00:19:55,350 --> 00:19:57,100 za određeni broj, koji je Ja ću opet ući. 368 00:19:57,100 --> 00:20:00,300 No, ovaj put, ja ću ući u veći broj, tako da je za petlju 369 00:20:00,300 --> 00:20:02,540 će ponoviti više puta. 370 00:20:02,540 --> 00:20:06,090 U ovom slučaju, idem upisati vrijednost 11. 371 00:20:06,090 --> 00:20:08,390 >> Sada opet, jer bih postaviti pauza točka na liniji 15, 372 00:20:08,390 --> 00:20:10,490 to će naglasiti tu liniju. 373 00:20:10,490 --> 00:20:12,980 Možemo vidjeti da je naš Broj 11 je ispravno 374 00:20:12,980 --> 00:20:15,560 zastupljene u našim lokalnim varijablama. 375 00:20:15,560 --> 00:20:22,460 Ulazeći preko toga, možemo sada gledati što se događa s našim vrijednosti I 376 00:20:22,460 --> 00:20:25,680 kao što smo nastavili u to za petlju. 377 00:20:25,680 --> 00:20:31,960 Ona dobiva porastao svaki put kad smo do vrha da je za petlje. 378 00:20:31,960 --> 00:20:35,110 >> Sada jedna od stvari koje bi mogle biti korisno učiniti tijekom izvršenja 379 00:20:35,110 --> 00:20:40,490 ovog programa je za mene zapravo promijenite varijable srednjemu vidjeti 380 00:20:40,490 --> 00:20:42,450 što se događa s mojim programom. 381 00:20:42,450 --> 00:20:46,540 U tom slučaju, mogu zapravo dvaput kliknite na vrijednosti. 382 00:20:46,540 --> 00:20:48,040 Obavijest da to postaje riječi. 383 00:20:48,040 --> 00:20:50,280 >> Sada mogu ući drugačije vrijednost uopce 384 00:20:50,280 --> 00:20:55,700 vidjeti kako moj program se ponaša kad sam promijenio tu varijablu. 385 00:20:55,700 --> 00:20:59,560 Sada je u ovom slučaju, varijabla ja sada sadrži vrijednost 10. 386 00:20:59,560 --> 00:21:02,810 No, program je još Zastao je u izvršenju. 387 00:21:02,810 --> 00:21:07,610 Kad sam korak više, vidim da je Vrijednost ja, koji sam ušao kao 10., 388 00:21:07,610 --> 00:21:12,170 nije veća od vrijednosti num, koji je odmah uzrokuje za petlju 389 00:21:12,170 --> 00:21:14,240 zaustaviti izvršavanju. 390 00:21:14,240 --> 00:21:16,210 >> Sada to nije jedini Razlog zašto bi 391 00:21:16,210 --> 00:21:19,450 želite mijenjati varijablu na mjestu. 392 00:21:19,450 --> 00:21:22,210 Vi zapravo možda želite pokušati ga mijenjati tako 393 00:21:22,210 --> 00:21:24,590 da možete nastaviti izvršenje petlje 394 00:21:24,590 --> 00:21:27,370 ili, tako da možete mijenjati neke vrijednosti pred njim 395 00:21:27,370 --> 00:21:32,630 doseže neki određeni skup aritmetici da ste o obavljati. 396 00:21:32,630 --> 00:21:36,210 >> Pa sada da smo zapravo promjenu vrijednost od i kao program je izvršavao, 397 00:21:36,210 --> 00:21:39,540 što je uzrokovalo za petlju prestati prerano, jer odjednom, ja 398 00:21:39,540 --> 00:21:42,770 slučajno biti veći od vrijednosti NUM, što znači da je za petlju 399 00:21:42,770 --> 00:21:45,410 više nije potrebno da bude pogubljen. 400 00:21:45,410 --> 00:21:48,780 Nadalje, to se dogodilo da se slučaj da se promijenio vrijednost od i 401 00:21:48,780 --> 00:21:53,270 kada je istaknuta linija 17, što je točka u vremenu 402 00:21:53,270 --> 00:21:56,280 da je za izvršenje petlje bio zapravo se procjenjuje. 403 00:21:56,280 --> 00:22:00,210 >> Ako sam promijenio vrijednost ja na drugom retku, kažu 19, 404 00:22:00,210 --> 00:22:03,360 bismo vidjeli drugačije ponašanje, jer linija 19 bi 405 00:22:03,360 --> 00:22:08,310 su izvršena prije petlje Uvjet je reevaluated. 406 00:22:08,310 --> 00:22:11,900 Sada u ovom trenutku, ja sam, opet, na kraju ovog programa. 407 00:22:11,900 --> 00:22:15,707 I ja mogu dopustiti da nastavite dopustite mi program za otkaz, naravno. 408 00:22:15,707 --> 00:22:18,290 No, postoji par stvari koji su važni za oduzeti 409 00:22:18,290 --> 00:22:19,960 od pojedinačnog razgovora. 410 00:22:19,960 --> 00:22:22,490 Morate procijeniti vlastite pretpostavke 411 00:22:22,490 --> 00:22:24,710 o tome kako je kod treba ponašati. 412 00:22:24,710 --> 00:22:28,220 Svaki put kada mislite da su neki komad koda znate dogodi da rade, 413 00:22:28,220 --> 00:22:30,940 koji bi mogli biti crvena zastava ići natrag i procijeniti, i biti sigurni 414 00:22:30,940 --> 00:22:33,470 da vaše pretpostavke kako se to radi kod 415 00:22:33,470 --> 00:22:38,290 je zapravo istina kako je to izražena u izvornom kodu. 416 00:22:38,290 --> 00:22:41,300 >> No, čak i više trenutku bio, kada koristite program za pronalaženje pogrešaka, 417 00:22:41,300 --> 00:22:43,920 možete staviti kontrolne točke na različitih linija koda, 418 00:22:43,920 --> 00:22:48,110 što će uzrokovati debugger na pauzirati izvršenje na svakom od tih redaka 419 00:22:48,110 --> 00:22:52,210 tako da možete procijeniti memorije ili čak ga promijeniti na mjestu. 420 00:22:52,210 --> 00:22:55,630 I opet, sjetite se da možete stvoriti više prijelomnih točaka, tako da 421 00:22:55,630 --> 00:23:00,390 Također možete nastaviti izvršenje, preskočite nad velikim dijelovima koda, 422 00:23:00,390 --> 00:23:04,790 i ona će automatski pauzirati na sljedećem pauze točku. 423 00:23:04,790 --> 00:23:07,760 >> Tu je zapravo napredniji značajke debugger, kao dobro. 424 00:23:07,760 --> 00:23:10,170 No, morat ćemo vas uputiti nekim kasnijim videa 425 00:23:10,170 --> 00:23:14,090 kako bi se stvarno zafrkavati osim kako je koristiti one određene funkcije. 426 00:23:14,090 --> 00:23:15,990 Za sada, hvala vam vrlo mnogo za gledanje. 427 00:23:15,990 --> 00:23:18,080 I sretno ispravljanje pogrešaka.