1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Bine GDB. 3 00:00:06,830 --> 00:00:08,480 Ce este mai exact? 4 00:00:08,480 --> 00:00:11,310 Deci GDB, care se afla pentru GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 este un instrument cu adevărat minunat că putem folosi pentru a ne ajuta depana programele noastre, 6 00:00:15,040 --> 00:00:18,210 sau afli de unde lucrurile sunt merge greșit în programele noastre. 7 00:00:18,210 --> 00:00:22,590 GDB este uimitor de puternic, dar de ieșire și interacțiunea cu ea 8 00:00:22,590 --> 00:00:23,830 poate fi un pic criptic. 9 00:00:23,830 --> 00:00:28,210 Este, de obicei, un instrument de linie de comandă, și se poate arunca o mulțime de mesaje de la tine. 10 00:00:28,210 --> 00:00:31,144 Și se poate cam greu să analiza exact ce se întâmplă. 11 00:00:31,144 --> 00:00:33,560 Pași fericire, ne-am luat pentru a rezolva această problemă pentru tine 12 00:00:33,560 --> 00:00:36,281 în timp ce lucrați prin CS50. 13 00:00:36,281 --> 00:00:39,030 Dacă nu utilizați grafică debugger, care colegul meu Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse a vorbit destul de un pic despre într-un video care 15 00:00:41,570 --> 00:00:44,740 ar trebui să fie aici acum, s-ar putea nevoie de 16 00:00:44,740 --> 00:00:48,270 de a utiliza aceste linie de comandă instrumente pentru a lucra cu GDB. 17 00:00:48,270 --> 00:00:51,250 Dacă lucrați în CS50 IDE, nu aveți nevoie pentru a face acest lucru. 18 00:00:51,250 --> 00:00:53,550 Dar dacă nu ești care lucrează în IDE CS50, 19 00:00:53,550 --> 00:00:55,750 probabil folosind o versiune de CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 sau operarea unei alte Linux Sistem cu GDB instalat pe el, 21 00:00:58,860 --> 00:01:00,980 posibil să aveți nevoie pentru a utiliza aceste instrumente linie de comandă. 22 00:01:00,980 --> 00:01:02,860 >> Si din moment ce s-ar putea trebuie să faci asta, e 23 00:01:02,860 --> 00:01:06,280 util doar pentru a înțelege cum GDB funcționează din linia de comandă. 24 00:01:06,280 --> 00:01:09,650 Dar, din nou, dacă ești folosind IDE CS50, tu 25 00:01:09,650 --> 00:01:15,400 pot folosi debugger grafic care este construit în IDE. 26 00:01:15,400 --> 00:01:18,750 Deci, pentru a obține lucrurile merg cu GDB, pentru a începe depanare 27 00:01:18,750 --> 00:01:21,220 proces de o anumită Programul, tot ce trebuie să faceți 28 00:01:21,220 --> 00:01:23,810 este de tip GDB urmat de numele programului. 29 00:01:23,810 --> 00:01:28,620 Deci, de exemplu, în cazul în care programul este Bună ziua, trebuie să tastați GDB salut. 30 00:01:28,620 --> 00:01:31,210 >> Când faci asta, te duci pentru a trage în sus mediul GDB. 31 00:01:31,210 --> 00:01:33,800 Promptă ta se va schimba, și în loc de a fi ceea ce, de obicei, 32 00:01:33,800 --> 00:01:35,841 este atunci când tastați lucruri la line-- comanda ls, 33 00:01:35,841 --> 00:01:38,115 cd-- toate tipic dvs. Comenzi Linux, prompta ta 34 00:01:38,115 --> 00:01:42,200 se va schimba în, probabil, ceva ca paranteze GDB paranteze. 35 00:01:42,200 --> 00:01:46,630 Asta e noua ta promptă GDB, deoarece tu ești în interiorul mediului GDB. 36 00:01:46,630 --> 00:01:49,830 Odata ajunsi acestui mediu, există două comenzi mari 37 00:01:49,830 --> 00:01:52,290 pe care le veți folosi, probabil, în următoarea ordine. 38 00:01:52,290 --> 00:01:55,200 >> Primul este b, care este prescurtarea de la pauză. 39 00:01:55,200 --> 00:01:58,690 Și după ce tastați b, tu de obicei, tastați numele unei funcții, 40 00:01:58,690 --> 00:02:01,040 sau dacă se întâmplă să știi în jurul valorii de ce numărul liniei 41 00:02:01,040 --> 00:02:04,100 programul începe să se comporte un pic ciudat, 42 00:02:04,100 --> 00:02:06,370 aveți posibilitatea să tastați o linie Numărul acolo, de asemenea. 43 00:02:06,370 --> 00:02:09,660 Ce b, sau pauza, nu este permite programul 44 00:02:09,660 --> 00:02:13,270 pentru a rula până la un anumit punct, și anume, numele funcției 45 00:02:13,270 --> 00:02:15,880 pe care le specificați sau linia Numărul pe care îl specificați. 46 00:02:15,880 --> 00:02:18,590 >> Și în acel moment el, va îngheța execuție. 47 00:02:18,590 --> 00:02:21,670 Acesta este un lucru foarte bun, pentru că odată executare a fost congelat, 48 00:02:21,670 --> 00:02:25,214 puteți începe să foarte lent pas prin programul tău. 49 00:02:25,214 --> 00:02:28,130 De obicei, în cazul în care ați fost difuzate programele, acestea sunt destul de scurt. 50 00:02:28,130 --> 00:02:31,250 De obicei, tastați slash punct indiferent numele programului dumneavoastră este, lovit Enter, 51 00:02:31,250 --> 00:02:33,470 și înainte de a putea clipi, dvs. Programul este deja terminat. 52 00:02:33,470 --> 00:02:36,620 Nu este într-adevăr o mulțime de timp pentru a încerca și dau seama ce se întâmplă greșit. 53 00:02:36,620 --> 00:02:40,920 Deci, într-adevăr să fie în măsură să încetinească lucruri în funcție de stabilirea unui punct de pauză cu b, 54 00:02:40,920 --> 00:02:43,040 și apoi pas cu pas în. 55 00:02:43,040 --> 00:02:46,169 >> Apoi, după ce ați setat pauză punct, puteți rula programul. 56 00:02:46,169 --> 00:02:47,960 Și dacă aveți orice argumente în linia de comandă, 57 00:02:47,960 --> 00:02:51,610 le specificați aici, nu atunci când tastați numele GDB program. 58 00:02:51,610 --> 00:02:55,980 Specificați toate linia de comandă argumente prin luarea R, sau a alerga, 59 00:02:55,980 --> 00:03:00,270 și apoi argumente în linia de comandă, indiferent de aveți nevoie în interiorul programului. 60 00:03:00,270 --> 00:03:03,510 Există o serie de alte adevărat comenzi importante și utile 61 00:03:03,510 --> 00:03:04,970 în interiorul mediului PIB. 62 00:03:04,970 --> 00:03:07,540 Deci, lasă-mă să rapid du-te peste unele dintre ele. 63 00:03:07,540 --> 00:03:11,320 >> Primul este N, care este prescurtarea de la următoarea, și aveți posibilitatea să tastați următoarea loc de n, 64 00:03:11,320 --> 00:03:12,304 ambele ar funcționa. 65 00:03:12,304 --> 00:03:13,470 Și e doar scurtătura. 66 00:03:13,470 --> 00:03:17,540 Și, după cum probabil ați ajuns deja folosit pentru a, fiind capabil de tip lucruri 67 00:03:17,540 --> 00:03:20,520 mai scurt este, în general, mai bine. 68 00:03:20,520 --> 00:03:24,100 Și ce va face este să un pas înainte un bloc de cod. 69 00:03:24,100 --> 00:03:26,170 Deci, va merge mai departe până la un apel de funcție. 70 00:03:26,170 --> 00:03:28,350 Și apoi în loc de scufundări în această funcție 71 00:03:28,350 --> 00:03:33,130 și trece prin toate astea funcții cod, acesta va avea doar functia. 72 00:03:33,130 --> 00:03:34,400 >> Funcția va fi numit. 73 00:03:34,400 --> 00:03:35,733 Se va face tot ce activitatea sa este. 74 00:03:35,733 --> 00:03:38,870 Acesta va reveni la o valoare funcția pe care a numit-o. 75 00:03:38,870 --> 00:03:42,490 Și apoi veți trece la următoarea linie de această funcție de asteptare. 76 00:03:42,490 --> 00:03:44,555 Dacă doriți să-și intensifice în interiorul a funcției, 77 00:03:44,555 --> 00:03:46,430 în loc de a avea doar executa, mai ales 78 00:03:46,430 --> 00:03:50,004 dacă credeți că problema s-ar putea minți în interiorul acestei funcții, 79 00:03:50,004 --> 00:03:52,670 ai putea, desigur, stabilit o pauză punct în interiorul acestei funcții. 80 00:03:52,670 --> 00:03:57,820 Sau dacă sunteți deja în execuție, puteți utilizați de a pas înainte cu o linie de cod. 81 00:03:57,820 --> 00:04:01,170 >> Deci, acest lucru va pas în și se arunca cu capul în funcții, 82 00:04:01,170 --> 00:04:04,750 în loc de a avea doar executa și continuând pe în funcția de 83 00:04:04,750 --> 00:04:07,380 ca esti in pentru depanare. 84 00:04:07,380 --> 00:04:09,870 Dacă doriți vreodată să știți valoarea unei variabile, 85 00:04:09,870 --> 00:04:12,507 aveți posibilitatea să tastați p, sau Print, și apoi numele variabilei. 86 00:04:12,507 --> 00:04:15,090 Și care va imprima la tine, în interiorul mediului GDB, 87 00:04:15,090 --> 00:04:19,110 numele variabilei, care Tu-- scuzați mine-- valoarea variabilei 88 00:04:19,110 --> 00:04:20,064 care le-ați numit. 89 00:04:20,064 --> 00:04:23,230 Dacă doriți să știți valorile fiecare locală variabilă accesibil de unde 90 00:04:23,230 --> 00:04:25,970 te în prezent se află în dumneavoastră Programul, aveți posibilitatea să tastați informații localnici. 91 00:04:25,970 --> 00:04:28,332 E mult mai repede decât tastarea p și apoi orice, 92 00:04:28,332 --> 00:04:30,540 Listing toate din variabile ca stii există. 93 00:04:30,540 --> 00:04:34,370 Aveți posibilitatea să tastați informații localnici, și va imprima totul pentru tine. 94 00:04:34,370 --> 00:04:37,770 Următorul este bt, care este scurt pentru spate Trace. 95 00:04:37,770 --> 00:04:41,680 Acum, în general, în special la începutul CS50, 96 00:04:41,680 --> 00:04:44,450 nu veți avea într-adevăr ocazia de a utiliza bt, sau Back Trace, 97 00:04:44,450 --> 00:04:47,860 pentru că nu te cu funcții care numesc alte funcții. 98 00:04:47,860 --> 00:04:50,450 >> S-ar putea avea un apel principal funcție, dar asta e, probabil,. 99 00:04:50,450 --> 00:04:53,199 Nu aveți că alte funcții apelarea altă funcție, care 100 00:04:53,199 --> 00:04:54,880 solicită o altă funcție, și așa mai departe. 101 00:04:54,880 --> 00:04:57,550 Dar, așa cum programele obține mai multe complex, și în special 102 00:04:57,550 --> 00:05:00,290 atunci când începe lucrul cu recursivitate, urme înapoi 103 00:05:00,290 --> 00:05:05,150 poate fi un mod foarte util să te las un fel de a lua niște context în care 104 00:05:05,150 --> 00:05:06,460 Sunt în programul meu. 105 00:05:06,460 --> 00:05:10,590 Deci spun ai scris codul, și știți că principala numește funcție 106 00:05:10,590 --> 00:05:14,720 f, prin care se solicită o funcție g, prin care se solicită o funcție h. 107 00:05:14,720 --> 00:05:17,650 Deci, avem mai multe straturi de cuiburi se întâmplă aici. 108 00:05:17,650 --> 00:05:19,440 >> Dacă sunteți în interiorul mediul de GDB, 109 00:05:19,440 --> 00:05:21,640 și știi în interiorul tău de h, dar uitați 110 00:05:21,640 --> 00:05:27,210 despre ceea ce ai de unde ai are-- aveți posibilitatea să tastați bt, sau urme înapoi, 111 00:05:27,210 --> 00:05:32,370 și se va tipări h, g, f principal, alături de unele alte informații, care 112 00:05:32,370 --> 00:05:35,984 vă oferă un indiciu că, principala OK numit f, f numit g, g numit h, 113 00:05:35,984 --> 00:05:37,900 și asta e în cazul în care am Sunt în prezent în programul meu. 114 00:05:37,900 --> 00:05:41,380 Astfel că poate fi foarte util, mai ales ca criptic-Ness a GDB 115 00:05:41,380 --> 00:05:45,667 devine un pic coplesitoare, la afla exact unde lucrurile sunt. 116 00:05:45,667 --> 00:05:48,500 În cele din urmă, atunci când programul se face, sau atunci când ați făcut-o de depanare 117 00:05:48,500 --> 00:05:50,125 si doriti sa pas departe din mediul GDB, 118 00:05:50,125 --> 00:05:51,940 ajută să știe cum să iasă din ea. 119 00:05:51,940 --> 00:05:55,500 Aveți posibilitatea să tastați q, sau Quit, să iasă. 120 00:05:55,500 --> 00:05:59,220 Acum, înainte de film de azi Am pregătit un program de buggy 121 00:05:59,220 --> 00:06:03,900 numit buggy1, pe care am compilat dintr-un fișier cunoscut sub numele de buggy1.c. 122 00:06:03,900 --> 00:06:06,500 După cum s-ar putea aștepta, acest Programul este, de fapt buggy. 123 00:06:06,500 --> 00:06:08,990 Ceva nu merge bine când am încerca și a alerga it. 124 00:06:08,990 --> 00:06:13,014 Acum, din păcate, am neatenție eliminat dosarul meu buggy1.c, 125 00:06:13,014 --> 00:06:15,930 astfel încât, în scopul de a-mi dau seama ce se întâmplă în neregulă cu acest program, 126 00:06:15,930 --> 00:06:18,770 Am de gând să aibă de a utiliza GDB fel de orbește, încercând 127 00:06:18,770 --> 00:06:22,372 pentru a naviga prin acest program pentru a dau seama exact ce se întâmplă greșit. 128 00:06:22,372 --> 00:06:24,580 Dar folosind doar instrumentele am învățat deja despre, 129 00:06:24,580 --> 00:06:27,700 putem destul de mult figura exact ceea ce este. 130 00:06:27,700 --> 00:06:30,740 Deci, haideți să peste cap de la CS50 IDE și au o privire. 131 00:06:30,740 --> 00:06:33,155 OK, asa ca suntem aici, în meu CS50 IDE mediu, 132 00:06:33,155 --> 00:06:35,697 și voi mări un pic astfel încât să puteți vedea un pic mai mult. 133 00:06:35,697 --> 00:06:38,530 În fereastra mea terminale, dacă aș enumera conținutul directorului meu actual 134 00:06:38,530 --> 00:06:41,250 cu ls, vom vedea că am o pereche de fișiere sursă 135 00:06:41,250 --> 00:06:44,982 aici, inclusiv discutat anterior buggy1. 136 00:06:44,982 --> 00:06:46,940 Ce anume se întâmplă atunci când Încerc și a alerga buggy1. 137 00:06:46,940 --> 00:06:47,773 Ei bine, hai să aflăm. 138 00:06:47,773 --> 00:06:52,510 Am tip slash dot, buggy, și l-am lovit Enter. 139 00:06:52,510 --> 00:06:53,670 >> Defecte de segmentare. 140 00:06:53,670 --> 00:06:55,000 Asta nu este bine. 141 00:06:55,000 --> 00:06:57,180 Dacă vă amintiți, un eroare de segmentare de obicei 142 00:06:57,180 --> 00:07:01,540 apare atunci când accesăm memorie că nu avem voie să atingă. 143 00:07:01,540 --> 00:07:03,820 Am ajuns într-un fel ne- în afara limitelor 144 00:07:03,820 --> 00:07:05,995 din ceea ce a programului, compilator, ne-a dat. 145 00:07:05,995 --> 00:07:08,310 Și astfel deja că este un indiciu pentru a păstra în caseta de instrumente 146 00:07:08,310 --> 00:07:10,660 cum vom începe procesul de depanare. 147 00:07:10,660 --> 00:07:13,620 Ceva a mers un pic greșit aici. 148 00:07:13,620 --> 00:07:15,935 >> Bine, așa că să începem mediului de GDB 149 00:07:15,935 --> 00:07:19,030 și a vedea dacă ne putem da seama exact ceea ce este problema. 150 00:07:19,030 --> 00:07:21,674 Am de gând să îndepărteze ecranul meu, și am de gând să tastați GDB 151 00:07:21,674 --> 00:07:24,340 din nou, pentru a intra în mediul GDB, și numele programului 152 00:07:24,340 --> 00:07:27,450 pe care vreau pentru a depana, buggy1. 153 00:07:27,450 --> 00:07:30,182 Vom obține un mesaj scurt, citind simboluri din buggy1, făcut. 154 00:07:30,182 --> 00:07:32,390 Tot ceea ce înseamnă este tras împreună toate din cod, 155 00:07:32,390 --> 00:07:35,570 iar acum a fost încărcate în GDB, și este gata să meargă. 156 00:07:35,570 --> 00:07:37,140 >> Acum, ce vreau să fac? 157 00:07:37,140 --> 00:07:39,130 Îți amintești Ce Primul pas este de obicei 158 00:07:39,130 --> 00:07:42,540 după ce sunt in interiorul acestui mediu? 159 00:07:42,540 --> 00:07:44,540 Sperăm că, ai spus setați un punct de pauză, pentru că 160 00:07:44,540 --> 00:07:46,240 De fapt, asta este ceea ce vreau să fac. 161 00:07:46,240 --> 00:07:47,990 Acum, eu nu am codul sursă pentru acest 162 00:07:47,990 --> 00:07:50,948 în fața mea, care este, probabil, nu este cazul utilizării tipic, apropo. 163 00:07:50,948 --> 00:07:52,055 Probabil, va. 164 00:07:52,055 --> 00:07:52,680 Așa că e bine. 165 00:07:52,680 --> 00:07:55,790 Dar presupunând că nu, ceea ce este funcția unul care știi 166 00:07:55,790 --> 00:07:58,880 există în fiecare program unic C? 167 00:07:58,880 --> 00:08:04,420 Nu contează cât de mare sau cât de complicat este, această funcție cu siguranta exista. 168 00:08:04,420 --> 00:08:05,440 Principal, nu? 169 00:08:05,440 --> 00:08:08,870 >> Deci, lipsa de toate, ne putem stabilit un punct de pauză la principal. 170 00:08:08,870 --> 00:08:12,200 Și din nou, aș putea chiar tip rupe principal, în loc de b. 171 00:08:12,200 --> 00:08:14,650 Și dacă ești curios, dacă vreodată tip o comandă lung 172 00:08:14,650 --> 00:08:16,800 și apoi dau seama că te tastat ceva gresit, 173 00:08:16,800 --> 00:08:18,770 si doriti sa scapi de toate ca am facut-o, 174 00:08:18,770 --> 00:08:22,029 puteți prelua controlul U, care va șterge totul și să vă aducă înapoi 175 00:08:22,029 --> 00:08:23,570 la începutul liniilor cursor. 176 00:08:23,570 --> 00:08:26,569 Mult mai repede decât țineți doar în jos pe șterge, sau lovind-l ori buchet 177 00:08:26,569 --> 00:08:27,080 peste. 178 00:08:27,080 --> 00:08:28,740 >> Deci vom stabili un punct de pauză la principal. 179 00:08:28,740 --> 00:08:32,970 Și, după cum puteți vedea, se spune ne-am stabilit un punct de pauză la dosar buggy1.c, 180 00:08:32,970 --> 00:08:36,330 și se pare că prima linie de Codul de principal este linia de șapte. 181 00:08:36,330 --> 00:08:38,080 Din nou, nu avem fișierul sursă aici, 182 00:08:38,080 --> 00:08:40,429 dar voi presupune că este mi-a spus adevărul. 183 00:08:40,429 --> 00:08:44,510 Și apoi, eu doar încerc și executați programul, r. 184 00:08:44,510 --> 00:08:45,360 Programul de pornire. 185 00:08:45,360 --> 00:08:48,160 Bine, deci acest mesaj este un pic criptic. 186 00:08:48,160 --> 00:08:50,160 Dar în esență ceea ce este se întâmplă aici este doar 187 00:08:50,160 --> 00:08:53,350 spunându-mi-am lovit pauză am mea punct, pauza numărul punctul 1. 188 00:08:53,350 --> 00:08:55,877 >> Și apoi, ca linie de cod, Nu există un astfel de fișier sau director. 189 00:08:55,877 --> 00:08:57,710 Singurul motiv pentru care Văd că mesajul 190 00:08:57,710 --> 00:09:00,800 este pentru că am accidental eliminat dosarul meu buggy.c. 191 00:09:00,800 --> 00:09:04,050 Dacă fișierul meu buggy1.c existat în directorul curent, 192 00:09:04,050 --> 00:09:06,920 acest drept linie acolo ar fapt spune-mi ce linia de cod 193 00:09:06,920 --> 00:09:08,214 literalmente citește. 194 00:09:08,214 --> 00:09:09,380 Din păcate, l-am șters. 195 00:09:09,380 --> 00:09:14,790 Vom avea la fel de navigare prin această un pic mai mult orbește. 196 00:09:14,790 --> 00:09:17,330 >> OK, deci să vedem, ce Nu vreau să fac aici? 197 00:09:17,330 --> 00:09:21,770 Ei bine, aș vrea să știu ce locale variabile poate sunt disponibile pentru mine. 198 00:09:21,770 --> 00:09:23,570 Am început programul meu. 199 00:09:23,570 --> 00:09:28,515 Să vedem care ar putea fi deja inițializat pentru noi. 200 00:09:28,515 --> 00:09:31,430 Am tip localnici Info, nu localnici. 201 00:09:31,430 --> 00:09:33,960 Bine, pentru ca nu da-mi o tona de informații. 202 00:09:33,960 --> 00:09:37,600 Am putea încerca și imprima o variabilă, dar nu știu nici un nume de variabile. 203 00:09:37,600 --> 00:09:39,930 Am putea încerca o urmă înapoi, dar eu sunt în interiorul principal, 204 00:09:39,930 --> 00:09:43,710 așa că știu că nu am făcut o altă funcție de apel chiar acum. 205 00:09:43,710 --> 00:09:47,710 >> Deci, se pare ca doar mele opțiuni sunt de a utiliza n sau așa și începe să se scufunde în. 206 00:09:47,710 --> 00:09:49,630 Am de gând să utilizeze n. 207 00:09:49,630 --> 00:09:51,180 Așa că am de tip n. 208 00:09:51,180 --> 00:09:53,060 Oh Doamne, ce se întâmplă aici. 209 00:09:53,060 --> 00:09:56,260 Programul a primit semnale, SIGSEGV eroare de segmentare, 210 00:09:56,260 --> 00:09:57,880 și apoi o grămadă de lucruri. 211 00:09:57,880 --> 00:09:58,880 Sunt deja copleșit. 212 00:09:58,880 --> 00:10:00,980 Ei bine, există de fapt o multe de învățat aici. 213 00:10:00,980 --> 00:10:02,520 Deci, ce ne spune aceasta? 214 00:10:02,520 --> 00:10:09,180 Ceea ce ne spune este, acest program este pe cale de a, dar nu a fost încă, vina SEG. 215 00:10:09,180 --> 00:10:12,550 Și în special, am de gând pentru a mări și mai mult aici, 216 00:10:12,550 --> 00:10:18,980 este pe cale de a Seg vina despre ceva numit strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Acum, noi nu am discutat această funcție pe larg. 218 00:10:22,705 --> 00:10:25,580 Dar este-- că nu mergem pentru a vorbi despre fiecare funcție care 219 00:10:25,580 --> 00:10:28,610 există în standardul C library-- dar toate acestea sunt disponibile pentru tine, 220 00:10:28,610 --> 00:10:32,110 mai ales dacă luați o uita-te la reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Si strcmp este un foarte puternic funcție care există în interiorul 222 00:10:35,000 --> 00:10:38,070 din antetul string.h fișier, care este un antet 223 00:10:38,070 --> 00:10:41,970 fișier care este dedicat funcțiilor care lucrează cu și manipula siruri de caractere. 224 00:10:41,970 --> 00:10:49,830 >> Și în special, ceea ce face este strcmp compară valorile două șiruri. 225 00:10:49,830 --> 00:10:54,160 Așa că sunt pe cale de a segmentare vina pe un apel la strcmp se pare. 226 00:10:54,160 --> 00:10:58,530 Am lovit n, și, de fapt, am primit mesajul, Programul terminat cu semnal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 eroare de segmentare. Asa ca acum Eu de fapt am acuzat SEG, 228 00:11:01,370 --> 00:11:06,479 și programul meu are destul de mult dat în mod eficient. 229 00:11:06,479 --> 00:11:07,770 Acesta este sfârșitul programului. 230 00:11:07,770 --> 00:11:10,370 A rupt în jos, sa prăbușit. 231 00:11:10,370 --> 00:11:14,740 Deci, nu a fost mult, dar eu de fapt, a făcut să învețe destul de un pic 232 00:11:14,740 --> 00:11:16,747 din această puțină experiență. 233 00:11:16,747 --> 00:11:17,580 Ce am învățat? 234 00:11:17,580 --> 00:11:22,020 Ei bine, programul meu se blochează destul de mult imediat. 235 00:11:22,020 --> 00:11:26,300 Programul meu se blochează pe Un apel la strcmp, dar am 236 00:11:26,300 --> 00:11:30,560 Nu are nici un variabile locale în mea Programul în momentul în care se avariază. 237 00:11:30,560 --> 00:11:37,320 Deci, ceea ce string sau siruri de caractere, aș putea fi, eventual, compararea. 238 00:11:37,320 --> 00:11:42,140 Dacă nu am nici o locală variabile, s-ar putea 239 00:11:42,140 --> 00:11:45,520 presupun că există have-- poate este o variabilă globală, care ar putea fi adevărat. 240 00:11:45,520 --> 00:11:47,670 >> Dar, în general, se pare ca și cum aș compara 241 00:11:47,670 --> 00:11:52,070 la ceva ce nu există. 242 00:11:52,070 --> 00:11:54,130 Deci, haideți să investigheze că un pic mai departe. 243 00:11:54,130 --> 00:11:55,120 Deci, am de gând să îndepărteze ecranul meu. 244 00:11:55,120 --> 00:11:57,536 Am de gând să renunț afară din Mediu GDB pentru un al doilea. 245 00:11:57,536 --> 00:12:01,300 Și mă gândesc, OK, deci nu e nu variabile locale în programul meu. 246 00:12:01,300 --> 00:12:06,444 Mă întreb dacă nu cumva eu ​​ar trebui să treacă într-un șir ca un argument în linia de comandă. 247 00:12:06,444 --> 00:12:07,610 Deci, hai să testa acest lucru. 248 00:12:07,610 --> 00:12:09,020 Eu nu am făcut acest lucru înainte. 249 00:12:09,020 --> 00:12:14,244 >> Să vedem dacă poate dacă am rula acest program cu un argument linie de comandă funcționează. 250 00:12:14,244 --> 00:12:16,140 Nu-i asa, nici o vină segmentare acolo. 251 00:12:16,140 --> 00:12:17,870 Pur și simplu mi-a spus că l-am dat seama. 252 00:12:17,870 --> 00:12:19,170 Poate că e fix aici. 253 00:12:19,170 --> 00:12:27,560 Și într-adevăr, dacă mă duc înapoi și uita-te la codul actual sursă pentru buggy1.c, 254 00:12:27,560 --> 00:12:31,180 se pare ca și cum ceea ce fac este Fac un apel la strcmp fără 255 00:12:31,180 --> 00:12:34,010 a verifica dacă, de fapt, argv [1] există. 256 00:12:34,010 --> 00:12:36,730 Aceasta este de fapt codul sursă pentru buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Deci, ceea ce într-adevăr am nevoie pentru a face aici pentru a repara programul meu, 258 00:12:38,855 --> 00:12:40,835 presupunând Am fișier în fața mea, este 259 00:12:40,835 --> 00:12:44,740 pentru a adăuga doar un cec pentru a face sigur că argc este egal cu 2. 260 00:12:44,740 --> 00:12:47,780 Deci acest exemplu, din nou, cum am spus, este un pic contrived, nu? 261 00:12:47,780 --> 00:12:49,840 Te general, nu de gând să ștergeți accidental codul sursă 262 00:12:49,840 --> 00:12:51,820 și apoi trebuie să încercați și depanare a programului. 263 00:12:51,820 --> 00:12:53,120 Dar sperăm, le-a dat ai o ilustrație 264 00:12:53,120 --> 00:12:55,120 de tipuri de lucruri pe care ai putea să te gândești 265 00:12:55,120 --> 00:12:56,610 ca esti depanarea programului. 266 00:12:56,610 --> 00:12:58,760 >> Care este starea de lucruri aici? 267 00:12:58,760 --> 00:13:00,510 Ce variabile fac eu trebuie accesibile pentru mine? 268 00:13:00,510 --> 00:13:03,600 În cazul în care este exact programul meu crashing, pe ce linie, 269 00:13:03,600 --> 00:13:05,240 asupra a ceea ce apel la ce funcție? 270 00:13:05,240 --> 00:13:06,952 Ce fel de indicii nu care dau mine? 271 00:13:06,952 --> 00:13:08,910 Și asta este exact un fel de stare de spirit pe care le 272 00:13:08,910 --> 00:13:12,820 ar trebui să fie obținerea în când ești gândindu-debugging programele dumneavoastră. 273 00:13:12,820 --> 00:13:13,820 >> Sunt Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Acest lucru este CS50. 275 00:13:16,140 --> 00:15:08,642