1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> Doug LLOYD: Dobro GDB. 3 00:00:06,830 --> 00:00:08,480 Što je to točno? 4 00:00:08,480 --> 00:00:11,310 Dakle GDB, koja stoji za GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 je stvarno strašan alat koji možemo koristiti kako bi nam pomogli ispravljanje naših programa, 6 00:00:15,040 --> 00:00:18,210 ili saznati gdje su stvari ide krivo u našim programima. 7 00:00:18,210 --> 00:00:22,590 GDB je nevjerojatno moćan, ali izlaz i interakciju s njom 8 00:00:22,590 --> 00:00:23,830 može biti malo zagonetan. 9 00:00:23,830 --> 00:00:28,210 To je obično alat naredbenog retka, i to može baciti puno poruka na vas. 10 00:00:28,210 --> 00:00:31,144 A to može vrsta teško analizirati upravo ono što se događa. 11 00:00:31,144 --> 00:00:33,560 Srećom, mi smo poduzela korake popraviti ovaj problem za vas 12 00:00:33,560 --> 00:00:36,281 kao što rade kroz CS50. 13 00:00:36,281 --> 00:00:39,030 Ako ne koristite grafički program za pronalaženje pogrešaka, koje je moj kolega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse je govorio dosta malo o u videu koji 15 00:00:41,570 --> 00:00:44,740 bi trebao biti ovdje upravo sada, možda ćete morati 16 00:00:44,740 --> 00:00:48,270 koristiti ove naredbenog retka alati za rad s GDB. 17 00:00:48,270 --> 00:00:51,250 Ako radite u CS50 IDE, ne morate to učiniti. 18 00:00:51,250 --> 00:00:53,550 No, ako niste rade u CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 možda koristite inačicu od CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 ili neki drugi Linux operativni sustav s GDB instaliran na njemu, 21 00:00:58,860 --> 00:01:00,980 možda ćete morati koristiti ovi alati naredbenog retka. 22 00:01:00,980 --> 00:01:02,860 >> A budući da bi mogli morate to učiniti, to je 23 00:01:02,860 --> 00:01:06,280 korisno samo da shvate kako GDB radi iz naredbenog retka. 24 00:01:06,280 --> 00:01:09,650 Ali opet, ako ste pomoću CS50 IDE, što 25 00:01:09,650 --> 00:01:15,400 možete koristiti grafički program za pronalaženje pogrešaka koji je izgrađen u IDE. 26 00:01:15,400 --> 00:01:18,750 Tako da se stvari događa s GDB, za početak ispravljanje pogrešaka 27 00:01:18,750 --> 00:01:21,220 Proces određeni Program, sve što trebate napraviti 28 00:01:21,220 --> 00:01:23,810 je tip GDB slijedi po nazivu programa. 29 00:01:23,810 --> 00:01:28,620 Tako na primjer, ako je vaš program Pozdrav, te će upisati GDB pozdrav. 30 00:01:28,620 --> 00:01:31,210 >> Kad to učinite, vi ćete podići GDB okoliš. 31 00:01:31,210 --> 00:01:33,800 Vaš upit će se promijeniti, a umjesto da bude ono što je obično 32 00:01:33,800 --> 00:01:35,841 kada upišete stvari U naredbeni line-- LS, 33 00:01:35,841 --> 00:01:38,115 cd-- sve vaše tipične Linux naredbe, vaš upit 34 00:01:38,115 --> 00:01:42,200 će promijeniti, vjerojatno, nešto kao zagradi GDB zagradama. 35 00:01:42,200 --> 00:01:46,630 To je tvoj novi GDB brz, jer si unutar GDB okoliš. 36 00:01:46,630 --> 00:01:49,830 Jednom unutar tog okruženja, postoje dva glavna zapovjedništva 37 00:01:49,830 --> 00:01:52,290 da ćete vjerojatno koristiti u slijedećem redoslijedu. 38 00:01:52,290 --> 00:01:55,200 >> Prvi je b, koji je je kratica za odmor. 39 00:01:55,200 --> 00:01:58,690 I nakon što tip B, obično Upišite naziv funkcije, 40 00:01:58,690 --> 00:02:01,040 ili ako vam se dogoditi da znate oko što je broj linija 41 00:02:01,040 --> 00:02:04,100 vaš program počinje da se ponašaju malo čudno, 42 00:02:04,100 --> 00:02:06,370 možete upisati liniju Broj tamo. 43 00:02:06,370 --> 00:02:09,660 Što b ili pauze, ne je li vam vaš program 44 00:02:09,660 --> 00:02:13,270 pokrenuti do određene točke, naime, naziv funkcije 45 00:02:13,270 --> 00:02:15,880 da navedete ili linija broj koji ste odredili. 46 00:02:15,880 --> 00:02:18,590 >> I u tom trenutku je, će zamrznuti izvršenje. 47 00:02:18,590 --> 00:02:21,670 Ovo je stvarno dobra stvar, jer je Jednom je izvršenje zamrznuta, 48 00:02:21,670 --> 00:02:25,214 možete početi vrlo polako korak kroz svoj program. 49 00:02:25,214 --> 00:02:28,130 Obično, ako ste bili trčanje svoje programe, oni su prilično kratki. 50 00:02:28,130 --> 00:02:31,250 Obično upišete dot crta što god naziv vašeg programa, pritisnite Enter, 51 00:02:31,250 --> 00:02:33,470 i prije nego što možete treptati, vaš Program je već gotov. 52 00:02:33,470 --> 00:02:36,620 To zapravo i nije puno vremena za probati i shvatiti što se događa u krivu. 53 00:02:36,620 --> 00:02:40,920 Dakle, to je stvarno da bi mogli usporiti stvari dolje postavljanjem break sa b, 54 00:02:40,920 --> 00:02:43,040 a zatim koračni u. 55 00:02:43,040 --> 00:02:46,169 >> Onda kada ste postavili svoj odmor točka, možete pokrenuti program. 56 00:02:46,169 --> 00:02:47,960 A ako imate bilo argumente naredbenog retka, 57 00:02:47,960 --> 00:02:51,610 ih navesti ovdje, a ne kada upišete GDB vaše ime programa. 58 00:02:51,610 --> 00:02:55,980 Vi određujete sve komandne linije Argumenti po uzimanja R, ili trčanje, 59 00:02:55,980 --> 00:03:00,270 a zatim god argumente naredbenog retka trebate unutar vašeg programa. 60 00:03:00,270 --> 00:03:03,510 Postoji i niz drugih stvarno važne i korisne naredbe 61 00:03:03,510 --> 00:03:04,970 unutar okoliša BDP-a. 62 00:03:04,970 --> 00:03:07,540 Zato mi dopustite da jednostavno brzo ići preko neke od njih. 63 00:03:07,540 --> 00:03:11,320 >> Prvi je nje, što je kratica za sljedeći, a možete upisati iduće umjesto n, 64 00:03:11,320 --> 00:03:12,304 kako će raditi. 65 00:03:12,304 --> 00:03:13,470 I to je samo stenogram. 66 00:03:13,470 --> 00:03:17,540 I kao što ste vjerojatno već stečen koristi se, biti u mogućnosti upisati stvari 67 00:03:17,540 --> 00:03:20,520 kraći je općenito bolje. 68 00:03:20,520 --> 00:03:24,100 A ono što će učiniti je da će korak naprijed jedan blok koda. 69 00:03:24,100 --> 00:03:26,170 Dakle, to će pomaknuti naprijed dok funkcija poziva. 70 00:03:26,170 --> 00:03:28,350 I onda, umjesto Ronjenje u tu funkciju 71 00:03:28,350 --> 00:03:33,130 a prolazi kroz sve to funkcionira kod, samo će imati funkciju. 72 00:03:33,130 --> 00:03:34,400 >> Funkcija će se zvati. 73 00:03:34,400 --> 00:03:35,733 To će učiniti sve što je njegov rad je. 74 00:03:35,733 --> 00:03:38,870 To će vratiti vrijednost funkcija koja ga zove. 75 00:03:38,870 --> 00:03:42,490 A onda ćete prijeđite na Sljedeći redak tu funkciju poziva. 76 00:03:42,490 --> 00:03:44,555 Ako želite korak unutar funkcije, 77 00:03:44,555 --> 00:03:46,430 umjesto samo s to izvršiti, osobito 78 00:03:46,430 --> 00:03:50,004 ako mislite da je problem možda leže unutar tog funkcije, 79 00:03:50,004 --> 00:03:52,670 možete, naravno, postaviti pauzu ukazuju unutar tu funkciju. 80 00:03:52,670 --> 00:03:57,820 Ili, ako ste već pokrenut, možete Sa s korak naprijed jedan redak koda. 81 00:03:57,820 --> 00:04:01,170 >> Dakle, to će intervenirati Uronite u funkcijama, 82 00:04:01,170 --> 00:04:04,750 umjesto da samo imaju izvršiti i nastavlja se na u funkciji 83 00:04:04,750 --> 00:04:07,380 da ste u za ispravljanje pogrešaka. 84 00:04:07,380 --> 00:04:09,870 Ako ste ikada željeli znati vrijednost varijable, 85 00:04:09,870 --> 00:04:12,507 možete upisati p ili ispisati, a zatim varijabla imena. 86 00:04:12,507 --> 00:04:15,090 I to će se ispisati na vas, unutar GDB okoliša, 87 00:04:15,090 --> 00:04:19,110 naziv varijable, koje you-- oprostite me-- vrijednost varijable 88 00:04:19,110 --> 00:04:20,064 da ste nazvali. 89 00:04:20,064 --> 00:04:23,230 Ako želite znati vrijednosti svake Lokalni varijabla pristupiti odakle 90 00:04:23,230 --> 00:04:25,970 Trenutno u svom Program možete upisati info mještanima. 91 00:04:25,970 --> 00:04:28,332 To je puno brže nego upisivanjem p a zatim god, 92 00:04:28,332 --> 00:04:30,540 popis sve od varijable koje znate postoje. 93 00:04:30,540 --> 00:04:34,370 Možete upisati info mještanima, a to će ispisati sve za vas. 94 00:04:34,370 --> 00:04:37,770 Dalje se je širok, što je kratko za povratak u tragovima. 95 00:04:37,770 --> 00:04:41,680 Sada, u pravilu, osobito u ranom CS50, 96 00:04:41,680 --> 00:04:44,450 ti stvarno neće imati prigodu koristiti BT ili leđima trag, 97 00:04:44,450 --> 00:04:47,860 jer nećete jesti funkcije da zovu druge funkcije. 98 00:04:47,860 --> 00:04:50,450 >> Možda ste glavni nazvati funkciju, ali to je vjerojatno to. 99 00:04:50,450 --> 00:04:53,199 Vi nemate drugu funkciju zovete drugu funkciju, koja 100 00:04:53,199 --> 00:04:54,880 poziva drugi funkciju, i tako dalje. 101 00:04:54,880 --> 00:04:57,550 No, kao i svoje programe dobiti više kompleks, a naročito 102 00:04:57,550 --> 00:05:00,290 kada počnete raditi s rekurzije, ponovno traga 103 00:05:00,290 --> 00:05:05,150 može biti jako koristan način da vas pustiti vrsta dobiti neki kontekst u kojem 104 00:05:05,150 --> 00:05:06,460 Ja sam u svom programu. 105 00:05:06,460 --> 00:05:10,590 Dakle, reći da ste napisali svoj kod, i znate da je glavna poziva funkciju 106 00:05:10,590 --> 00:05:14,720 F, koja poziva funkciju g, što zove funkciju h. 107 00:05:14,720 --> 00:05:17,650 Dakle, imamo nekoliko slojeva od gniježđenje ovdje događa. 108 00:05:17,650 --> 00:05:19,440 >> Ako ste unutar Vaša GDB okoliš, 109 00:05:19,440 --> 00:05:21,640 i znate svoj unutrašnjost H, ali zaboraviti 110 00:05:21,640 --> 00:05:27,210 o tome što vas je dobio na kojoj ste are-- možete upisati BT ili natrag trag, 111 00:05:27,210 --> 00:05:32,370 i to će ispisati h, g, f glavna, uz neke druge informacije, koje 112 00:05:32,370 --> 00:05:35,984 daje naslutiti da je, u redu glavni zove f, f naziva g, g naziva h, 113 00:05:35,984 --> 00:05:37,900 i to je gdje sam Trenutno sam u mom programu. 114 00:05:37,900 --> 00:05:41,380 Dakle, to može biti jako korisno, osobito kao grobni-ness od GDB 115 00:05:41,380 --> 00:05:45,667 postaje malo neodoljiv, da saznati točno gdje su stvari. 116 00:05:45,667 --> 00:05:48,500 Konačno, kada je vaš program je učinio, ili kada završite ispravljanje pogrešaka ga 117 00:05:48,500 --> 00:05:50,125 a želite odmaknuti iz GDB okoliša, 118 00:05:50,125 --> 00:05:51,940 to pomaže da znate kako izaći iz nje. 119 00:05:51,940 --> 00:05:55,500 Možete upisati Q ili Quit, izaći. 120 00:05:55,500 --> 00:05:59,220 Sada, prije današnjeg videa Ja pripremio lud programa 121 00:05:59,220 --> 00:06:03,900 zove buggy1, koji sam sastavio iz datoteke poznat kao buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Kao što ste mogli očekivati, to Program je zapravo lud. 123 00:06:06,500 --> 00:06:08,990 Nešto pođe po zlu kad sam probati i pokrenite ga. 124 00:06:08,990 --> 00:06:13,014 Sada, na žalost, ja nehotice izbrisan moj buggy1.c datoteku, 125 00:06:13,014 --> 00:06:15,930 tako da bi za mene shvatiti što se događa u redu s ovim programom, 126 00:06:15,930 --> 00:06:18,770 Ću morati koristiti GDB vrsta slijepo, pokušavajući 127 00:06:18,770 --> 00:06:22,372 za navigaciju kroz ovaj program se shvatiti točno ono što se događa u krivu. 128 00:06:22,372 --> 00:06:24,580 No, koristeći samo alate smo već naučili o, 129 00:06:24,580 --> 00:06:27,700 možemo prilično mnogo figuru točno što je to. 130 00:06:27,700 --> 00:06:30,740 Pa neka je nad glavom CS50 IDE i imaju izgled. 131 00:06:30,740 --> 00:06:33,155 U redu, tako da smo ovdje u mom CS50 IDE okoliš, 132 00:06:33,155 --> 00:06:35,697 i ja ću povećavanje malo tako da možete vidjeti malo više. 133 00:06:35,697 --> 00:06:38,530 U mom prozoru terminala, ako sam popis sadržaj mog trenutnog direktora 134 00:06:38,530 --> 00:06:41,250 s LS, mi ćemo vidjeti da sam ima par izvornih datoteka 135 00:06:41,250 --> 00:06:44,982 Ovdje, uključujući prethodno objašnjeno buggy1. 136 00:06:44,982 --> 00:06:46,940 Što se točno događa kada Pokušavam pokrenuti buggy1. 137 00:06:46,940 --> 00:06:47,773 Pa neka je saznati. 138 00:06:47,773 --> 00:06:52,510 I tip dot crta, lud, a ja pritisnite Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentacija greške. 140 00:06:53,670 --> 00:06:55,000 To nije dobro. 141 00:06:55,000 --> 00:06:57,180 Ako se sjećate, A obično segmentacije kvara 142 00:06:57,180 --> 00:07:01,540 javlja kada smo pristupili memorije da mi ne smijemo dirati. 143 00:07:01,540 --> 00:07:03,820 Mi nekako smo stigli izvan granica 144 00:07:03,820 --> 00:07:05,995 onoga programa, prevodilac, nam je dao. 145 00:07:05,995 --> 00:07:08,310 I tako već da je trag držati u kutiji za alat 146 00:07:08,310 --> 00:07:10,660 kao što smo započeli proces ispravljanje pogrešaka. 147 00:07:10,660 --> 00:07:13,620 Nešto je otišao malo krivo ovdje. 148 00:07:13,620 --> 00:07:15,935 >> U redu, počnimo gore GDB okoliš 149 00:07:15,935 --> 00:07:19,030 i vidjeti ako mi može shvatiti što je točno problem. 150 00:07:19,030 --> 00:07:21,674 Idem da razbistrim zaslon, a ja ću upisati GDB 151 00:07:21,674 --> 00:07:24,340 opet ući u GDB okoliš, i naziv programa 152 00:07:24,340 --> 00:07:27,450 da želim debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Mi smo dobili malo poruku, čitanje simbola iz buggy1, učinjeno. 154 00:07:30,182 --> 00:07:32,390 Sve to znači da je on izvukao zajedno sve koda, 155 00:07:32,390 --> 00:07:35,570 a sada je stavljen u GDB, i to je spreman za ići. 156 00:07:35,570 --> 00:07:37,140 >> Sad, ono što želim učiniti? 157 00:07:37,140 --> 00:07:39,130 Sjećate li se što se Prvi korak je tipično 158 00:07:39,130 --> 00:07:42,540 nakon što sam unutar tog okruženja? 159 00:07:42,540 --> 00:07:44,540 Nadamo se da navedeni skup break point, jer 160 00:07:44,540 --> 00:07:46,240 Zapravo to je ono što želim učiniti. 161 00:07:46,240 --> 00:07:47,990 Sad, ja ne imati izvorni kod za to 162 00:07:47,990 --> 00:07:50,948 ispred mene, što je vjerojatno Nije tipična uporaba slučaj, usput. 163 00:07:50,948 --> 00:07:52,055 Vjerojatno neće. 164 00:07:52,055 --> 00:07:52,680 Dakle, to je dobro. 165 00:07:52,680 --> 00:07:55,790 Ali uz pretpostavku da ne, ono što je onaj funkcija da znate 166 00:07:55,790 --> 00:07:58,880 postoji u svakom pojedinom C program? 167 00:07:58,880 --> 00:08:04,420 Bez obzira koliko veliki ili koliko je komplicirano je, ova funkcija svakako postoji. 168 00:08:04,420 --> 00:08:05,440 Glavni, zar ne? 169 00:08:05,440 --> 00:08:08,870 >> Dakle, nije sve ostalo, možemo postaviti break na glavni. 170 00:08:08,870 --> 00:08:12,200 A opet, mogao sam samo tip razbiti glavni, umjesto b. 171 00:08:12,200 --> 00:08:14,650 A ako vas zanima, ako vas nikad tip iz dugo naredbu 172 00:08:14,650 --> 00:08:16,800 a onda shvatite da vas upisali krivu stvar, 173 00:08:16,800 --> 00:08:18,770 i želite da biste dobili osloboditi od svega što sam upravo učinio, 174 00:08:18,770 --> 00:08:22,029 možete preuzeti kontrolu U, koji će izbrisati sve i dovesti vas natrag 175 00:08:22,029 --> 00:08:23,570 na početku kursorskim linije. 176 00:08:23,570 --> 00:08:26,569 Mnogo brže nego samo držite brisati ili udaranje ga hrpa puta 177 00:08:26,569 --> 00:08:27,080 više. 178 00:08:27,080 --> 00:08:28,740 >> Tako ćemo postaviti break na glavni. 179 00:08:28,740 --> 00:08:32,970 I kao što možete vidjeti, on kaže mi smo postaviti break u datotečnom buggy1.c, 180 00:08:32,970 --> 00:08:36,330 i očito prva linija koda od glavna je crta sedam. 181 00:08:36,330 --> 00:08:38,080 Opet, mi nemamo izvor datoteka ovdje 182 00:08:38,080 --> 00:08:40,429 ali ću pretpostaviti da je govori mi istinu. 183 00:08:40,429 --> 00:08:44,510 A onda, samo pokušavam i pokrenuti program, r. 184 00:08:44,510 --> 00:08:45,360 Pokretanje programa. 185 00:08:45,360 --> 00:08:48,160 U redu, tako da ova poruka je malo zagonetan. 186 00:08:48,160 --> 00:08:50,160 No, ono što je u osnovi ovdje događa je da je to samo 187 00:08:50,160 --> 00:08:53,350 mi govori da sam pogodio moju pauzu točka, pauza točka broj 1. 188 00:08:53,350 --> 00:08:55,877 >> A onda, da je linija koda, nema takve datoteke ili direktorija. 189 00:08:55,877 --> 00:08:57,710 Jedini razlog zbog kojeg Vidim tu poruku 190 00:08:57,710 --> 00:09:00,800 je zato što sam slučajno izbrisan moj buggy.c datoteku. 191 00:09:00,800 --> 00:09:04,050 Ako je postojala moja buggy1.c datoteka u trenutnom direktoriju, 192 00:09:04,050 --> 00:09:06,920 da crta upravo tamo bi zapravo reci mi što je linija koda 193 00:09:06,920 --> 00:09:08,214 doslovno čita. 194 00:09:08,214 --> 00:09:09,380 Nažalost, to sam izbrisan. 195 00:09:09,380 --> 00:09:14,790 Ćemo morati vrsta navigaciju kroz to malo više slijepo. 196 00:09:14,790 --> 00:09:17,330 >> U redu, da vidimo, što Ne želim raditi ovdje? 197 00:09:17,330 --> 00:09:21,770 Pa, ja bih znati što lokalne varijable možda su mi dostupni. 198 00:09:21,770 --> 00:09:23,570 Ja sam počeo moj program. 199 00:09:23,570 --> 00:09:28,515 Idemo vidjeti što bi moglo biti Već inicijalizacije za nas. 200 00:09:28,515 --> 00:09:31,430 I tip Info mještani, bez mještana. 201 00:09:31,430 --> 00:09:33,960 U redu, tako da se ne dajte mi tonu informacija. 202 00:09:33,960 --> 00:09:37,600 Mogao bih pokušati ispisati varijablu, ali ja ne znam niti varijablu imena. 203 00:09:37,600 --> 00:09:39,930 Mogao bih probati natrag trag, ali sam unutar glavna, 204 00:09:39,930 --> 00:09:43,710 tako da znam nisam napravio još jedna funkcija poziva upravo sada. 205 00:09:43,710 --> 00:09:47,710 >> Tako izgleda kao moje samo su opcije koristiti nje ili tako i početi roniti u. 206 00:09:47,710 --> 00:09:49,630 Idem koristiti n. 207 00:09:49,630 --> 00:09:51,180 Tako sam tip nje. 208 00:09:51,180 --> 00:09:53,060 O, moj Bože, što se ovdje događa. 209 00:09:53,060 --> 00:09:56,260 Program za primljene signale, SIGSEGV segmentacija kriv, 210 00:09:56,260 --> 00:09:57,880 a onda cijela hrpa stvari. 211 00:09:57,880 --> 00:09:58,880 Ja sam već osvaja. 212 00:09:58,880 --> 00:10:00,980 Pa, tu je zapravo Mnogo se saznaje ovdje. 213 00:10:00,980 --> 00:10:02,520 Pa što nam to govori? 214 00:10:02,520 --> 00:10:09,180 Ono što nam govori je, ovaj program je o da, ali još nije, SEG kriv. 215 00:10:09,180 --> 00:10:12,550 A posebno, idem za povećavanje i dalje tu, 216 00:10:12,550 --> 00:10:18,980 je o SEG grešku o nešto što se zove strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Sada smo možda smo razgovarali ova funkcija opsežno. 218 00:10:22,705 --> 00:10:25,580 Ali to is--, jer ne idemo govoriti o sve funkcije koje 219 00:10:25,580 --> 00:10:28,610 postoji u C standardu library-- ali oni su sve dostupne za vas, 220 00:10:28,610 --> 00:10:32,110 pogotovo ako se uzme pogledajte reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 I strcmp je stvarno moćan funkcija koja postoji unutar 222 00:10:35,000 --> 00:10:38,070 od string.h zaglavlja datoteka, što je zaglavlje 223 00:10:38,070 --> 00:10:41,970 datoteka koja je posvećena funkcije koji rade sa i manipulirati žice. 224 00:10:41,970 --> 00:10:49,830 >> A posebno, što se je strcmp uspoređuje vrijednosti dvije žice. 225 00:10:49,830 --> 00:10:54,160 Tako ću do segmentacije kvara na poziv da strcmp čini. 226 00:10:54,160 --> 00:10:58,530 Sam pogodio nje, i zapravo dobivam poruku, Program prestaje sa signalom SIGSEGV 227 00:10:58,530 --> 00:11:01,370 Segmentacija kriv. Tako sada Ja zapravo SEG su okrivio, 228 00:11:01,370 --> 00:11:06,479 i moj program ima dosta koliko učinkovito odustali. 229 00:11:06,479 --> 00:11:07,770 Ovo je kraj programa. 230 00:11:07,770 --> 00:11:10,370 To se pokvario, on se srušio. 231 00:11:10,370 --> 00:11:14,740 Dakle, nije bilo puno, ali ja doista naučiti dosta 232 00:11:14,740 --> 00:11:16,747 iz ovog malog iskustva. 233 00:11:16,747 --> 00:11:17,580 Što sam naučio? 234 00:11:17,580 --> 00:11:22,020 Pa, moj program se ruši prilično odmah. 235 00:11:22,020 --> 00:11:26,300 Moj program ruši na poziv na strcmp, ali ja 236 00:11:26,300 --> 00:11:30,560 nemaju nikakve lokalne varijable u mom Program u vrijeme kad se ruši. 237 00:11:30,560 --> 00:11:37,320 Pa što string ili žice, bih mogao biti usporedbom. 238 00:11:37,320 --> 00:11:42,140 Ako ne imati bilo koji lokalni varijable, možda 239 00:11:42,140 --> 00:11:45,520 Pretpostavljam da sam have-- postoji možda je Globalna varijabla, koja bi mogla biti istina. 240 00:11:45,520 --> 00:11:47,670 >> Ali općenito, čini se kao da sam uspoređivanje 241 00:11:47,670 --> 00:11:52,070 na nešto što ne postoji. 242 00:11:52,070 --> 00:11:54,130 Tako ćemo istražiti da malo dalje. 243 00:11:54,130 --> 00:11:55,120 Tako ću razbistriti zaslon. 244 00:11:55,120 --> 00:11:57,536 Idem prestati iz kategorije GDB okruženje za sekundu. 245 00:11:57,536 --> 00:12:01,300 I ja sam razmišljao, u redu, tako da Nema lokalne varijable u moj program. 246 00:12:01,300 --> 00:12:06,444 Pitam se je li možda sam trebao proći u nizu kao argument komandne linije u. 247 00:12:06,444 --> 00:12:07,610 Pa neka je samo testiranje ovo. 248 00:12:07,610 --> 00:12:09,020 Nisam to učinio prije. 249 00:12:09,020 --> 00:12:14,244 >> Da vidimo je li možda, ako sam pokrenuti ovaj program s naredbenog retka argument je da radi. 250 00:12:14,244 --> 00:12:16,140 Huh, nije kriv segmentacija tamo. 251 00:12:16,140 --> 00:12:17,870 To mi je samo rekao da sam ga shvatio. 252 00:12:17,870 --> 00:12:19,170 Dakle, možda je to popraviti ovdje. 253 00:12:19,170 --> 00:12:27,560 I doista, ako sam se vratiti i pogledati stvarni izvorni kod za buggy1.c, 254 00:12:27,560 --> 00:12:31,180 čini se kao da je ono što ja radim je Ja sam upućivanja poziva za strcmp bez 255 00:12:31,180 --> 00:12:34,010 provjeru argv [1] postoji li u stvari. 256 00:12:34,010 --> 00:12:36,730 To je zapravo izvorni kod za buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Dakle, ono što stvarno trebate učiniti ovdje za škripac moj program, 258 00:12:38,855 --> 00:12:40,835 pretpostavljajući imam file ispred mene, 259 00:12:40,835 --> 00:12:44,740 samo dodati provjerite li argc jednak 2. 260 00:12:44,740 --> 00:12:47,780 Dakle, ovo je primjer, opet, kao što sam rekao, je malo neprirodan, zar ne? 261 00:12:47,780 --> 00:12:49,840 Vi obično ne ide slučajno izbrisati izvorni kod 262 00:12:49,840 --> 00:12:51,820 a onda morate probati i ispravljanje program. 263 00:12:51,820 --> 00:12:53,120 No, nadamo se, da je dao što ilustracija 264 00:12:53,120 --> 00:12:55,120 od vrste stvari koje što bi se moglo razmišljati o 265 00:12:55,120 --> 00:12:56,610 kao što ste ispravljanje pogrešaka u programu. 266 00:12:56,610 --> 00:12:58,760 >> Što je stanje ovdje stvari? 267 00:12:58,760 --> 00:13:00,510 Koje varijable ne ja imaju dostupan za mene? 268 00:13:00,510 --> 00:13:03,600 Gdje je točno moj program pad, na kojoj liniji, 269 00:13:03,600 --> 00:13:05,240 na ono što poziva na kojoj funkciji? 270 00:13:05,240 --> 00:13:06,952 Kakve tragove to mi dati? 271 00:13:06,952 --> 00:13:08,910 I to je točno vrsta razmišljanja koja vas 272 00:13:08,910 --> 00:13:12,820 Treba uzimajući u kada ste razmišljam o debugging svoje programe. 273 00:13:12,820 --> 00:13:13,820 >> Ja sam Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ovo je CS50. 275 00:13:16,140 --> 00:15:08,642