1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Okay GDB. 3 00:00:06,830 --> 00:00:08,480 Hvad er det præcist? 4 00:00:08,480 --> 00:00:11,310 Så GDB, som står for GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 er en virkelig fantastisk værktøj, som vi kan bruge til at hjælpe os med debug vores programmer, 6 00:00:15,040 --> 00:00:18,210 eller finde ud af hvor tingene er går galt i vores programmer. 7 00:00:18,210 --> 00:00:22,590 GDB er forbavsende kraftfuld, men output og interaktion med det 8 00:00:22,590 --> 00:00:23,830 kan være en lille smule kryptisk. 9 00:00:23,830 --> 00:00:28,210 Det er normalt en kommandolinje værktøj, og det kan kaste en masse beskeder på dig. 10 00:00:28,210 --> 00:00:31,144 Og det kan slags svært at parse præcis, hvad der foregår. 11 00:00:31,144 --> 00:00:33,560 Heldigvis har vi taget skridt at løse dette problem for dig 12 00:00:33,560 --> 00:00:36,281 som du arbejder gennem CS50. 13 00:00:36,281 --> 00:00:39,030 Hvis du ikke bruger den grafiske debugger, som min kollega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse har talt helt lidt om i en video, der 15 00:00:41,570 --> 00:00:44,740 bør være herovre lige nu, skal du muligvis 16 00:00:44,740 --> 00:00:48,270 at bruge disse kommandolinjen redskaber til at arbejde med GDB. 17 00:00:48,270 --> 00:00:51,250 Hvis du arbejder i CS50 IDE, behøver du ikke at gøre dette. 18 00:00:51,250 --> 00:00:53,550 Men hvis du ikke er arbejder i CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 måske ved hjælp af en version af CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 eller en anden Linux-operativsystem Systemet med GDB installeret på den, 21 00:00:58,860 --> 00:01:00,980 du måske nødt til at bruge disse kommandolinje værktøjer. 22 00:01:00,980 --> 00:01:02,860 >> Og da du måske nødt til at gøre det, er det 23 00:01:02,860 --> 00:01:06,280 nyttige bare at forstå, hvordan GDB værker fra kommandolinjen. 24 00:01:06,280 --> 00:01:09,650 Men igen, hvis du er ved hjælp af CS50 IDE, du 25 00:01:09,650 --> 00:01:15,400 kan bruge den grafiske debugger der er indbygget i IDE. 26 00:01:15,400 --> 00:01:18,750 Så for at få tingene i gang med GDB, at starte debugging 27 00:01:18,750 --> 00:01:21,220 processen af ​​en bestemt program, alt hvad du behøver gøre 28 00:01:21,220 --> 00:01:23,810 er skriv GDB følges ved navn programmet. 29 00:01:23,810 --> 00:01:28,620 Så for eksempel, hvis dit program er hej, ville du skriver GDB hej. 30 00:01:28,620 --> 00:01:31,210 >> Når du gør det, er du nødt at trække op GDB miljø. 31 00:01:31,210 --> 00:01:33,800 Din prompt vil ændre sig, og stedet for at være, hvad det normalt 32 00:01:33,800 --> 00:01:35,841 er, når du skriver ting på kommandoen line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- alle dine typiske Linux kommandoer, dit hurtige 34 00:01:38,115 --> 00:01:42,200 vil skifte til, formentlig, noget ligesom parenteser GDB parentes. 35 00:01:42,200 --> 00:01:46,630 Det er din nye GDB prompt, fordi du er inde GDB miljø. 36 00:01:46,630 --> 00:01:49,830 Når du er inde i dette miljø, Der er to store kommandoer 37 00:01:49,830 --> 00:01:52,290 at du sandsynligvis vil bruge i følgende rækkefølge. 38 00:01:52,290 --> 00:01:55,200 >> Den første er b, som er en forkortelse for pause. 39 00:01:55,200 --> 00:01:58,690 Og efter du skriver b, du typisk skrive navnet på en funktion, 40 00:01:58,690 --> 00:02:01,040 eller hvis du tilfældigvis kender omkring hvad linjenummer 41 00:02:01,040 --> 00:02:04,100 dit program er begyndt at opføre sig lidt underligt, 42 00:02:04,100 --> 00:02:06,370 du kan skrive en linje nummer der. 43 00:02:06,370 --> 00:02:09,660 Hvad b, eller pause, gør er det giver dit program 44 00:02:09,660 --> 00:02:13,270 at køre indtil et vist punkt, nemlig navnet på funktionen 45 00:02:13,270 --> 00:02:15,880 som du angiver eller linjen nummer, som du angiver. 46 00:02:15,880 --> 00:02:18,590 >> Og på det tidspunkt, det vil fryse udførelse. 47 00:02:18,590 --> 00:02:21,670 Dette er en virkelig god ting, fordi når udførelsen har været frosset, 48 00:02:21,670 --> 00:02:25,214 du kan begynde at meget langsomt gå gennem dit program. 49 00:02:25,214 --> 00:02:28,130 Typisk hvis du har været at køre dine programmer, de er temmelig kort. 50 00:02:28,130 --> 00:02:31,250 Normalt, du skriver dot skråstreg uanset navnet på dit program, tryk på Enter, 51 00:02:31,250 --> 00:02:33,470 og før du kan blinke, din Programmet er allerede færdig. 52 00:02:33,470 --> 00:02:36,620 Det er egentlig ikke en masse tid til at prøve og finde ud af hvad der går galt. 53 00:02:36,620 --> 00:02:40,920 Så det virkelig at være i stand til at bremse tingene ned ved at sætte en pause punkt med b, 54 00:02:40,920 --> 00:02:43,040 og derefter træde ind. 55 00:02:43,040 --> 00:02:46,169 >> Så når du har indstillet din pause punkt, kan du køre programmet. 56 00:02:46,169 --> 00:02:47,960 Og hvis du har nogen kommandolinjeargumenter, 57 00:02:47,960 --> 00:02:51,610 du angiver dem her, ikke når du skriver GDB dit program navn. 58 00:02:51,610 --> 00:02:55,980 Du angiver alle kommandolinjen argumenter ved at tage r, eller løbe, 59 00:02:55,980 --> 00:03:00,270 og derefter hvad kommandolinjeargumenter du har brug for inde i dit program. 60 00:03:00,270 --> 00:03:03,510 Der er en række andre virkelig vigtige og nyttige kommandoer 61 00:03:03,510 --> 00:03:04,970 indersiden af ​​BNP miljøet. 62 00:03:04,970 --> 00:03:07,540 Så lad mig lige hurtigt gå over nogle af dem. 63 00:03:07,540 --> 00:03:11,320 >> Den første er n, som er en forkortelse for næste, og du kan skrive næste i stedet for n, 64 00:03:11,320 --> 00:03:12,304 begge ville arbejde. 65 00:03:12,304 --> 00:03:13,470 Og det er netop den stenografi. 66 00:03:13,470 --> 00:03:17,540 Og som du sikkert allerede har fået vant til, at kunne skrive ting 67 00:03:17,540 --> 00:03:20,520 kortere er generelt bedre. 68 00:03:20,520 --> 00:03:24,100 Og hvad det vil gøre, er at det vil træde frem en blok af kode. 69 00:03:24,100 --> 00:03:26,170 Så det vil bevæge sig fremad indtil et funktionskald. 70 00:03:26,170 --> 00:03:28,350 Og derefter i stedet for dykning i denne funktion 71 00:03:28,350 --> 00:03:33,130 og går gennem alle, der fungerer kode, vil det blot har den funktion. 72 00:03:33,130 --> 00:03:34,400 >> Funktionen vil blive kaldt. 73 00:03:34,400 --> 00:03:35,733 Det vil gøre, hvad dens arbejde er. 74 00:03:35,733 --> 00:03:38,870 Det vil returnere en værdi til den funktion, der kaldte det. 75 00:03:38,870 --> 00:03:42,490 Og så vil du gå videre til næste linje af denne kaldende funktion. 76 00:03:42,490 --> 00:03:44,555 Hvis du ønsker at træde indersiden af ​​funktionen, 77 00:03:44,555 --> 00:03:46,430 i stedet for bare at have det udføre, især 78 00:03:46,430 --> 00:03:50,004 hvis du tror, ​​at problemet kunne ligge inde i denne funktion, 79 00:03:50,004 --> 00:03:52,670 man kunne selvfølgelig indstille en pause peger indersiden af ​​denne funktion. 80 00:03:52,670 --> 00:03:57,820 Eller hvis du allerede kører, kan du bruge s til at træde frem én linje kode. 81 00:03:57,820 --> 00:04:01,170 >> Så dette vil træde i og dykke ned i funktioner, 82 00:04:01,170 --> 00:04:04,750 i stedet for bare have den udføre og fortsætter i funktionen 83 00:04:04,750 --> 00:04:07,380 at du er i for fejlretning. 84 00:04:07,380 --> 00:04:09,870 Hvis du nogensinde ønsker at vide værdien af ​​en variabel, 85 00:04:09,870 --> 00:04:12,507 du kan skrive p, eller Udskriv, og derefter variabelnavnet. 86 00:04:12,507 --> 00:04:15,090 Og der vil printe ud til dig, indersiden af ​​GDB miljø, 87 00:04:15,090 --> 00:04:19,110 navnet på den variable, der du-- undskylde mig-- værdien af ​​variablen 88 00:04:19,110 --> 00:04:20,064 at du har navngivet. 89 00:04:20,064 --> 00:04:23,230 Hvis du ønsker at vide værdien af ​​hver lokal variabel tilgængelige hvorfra 90 00:04:23,230 --> 00:04:25,970 du i øjeblikket er i din program, kan du skrive info lokale. 91 00:04:25,970 --> 00:04:28,332 Det er meget hurtigere end skrive p og derefter uanset hvad, 92 00:04:28,332 --> 00:04:30,540 notering ud af alle de variabler, som du kender eksisterer. 93 00:04:30,540 --> 00:04:34,370 Du kan skrive info lokale, og det vil udskrive alt for dig. 94 00:04:34,370 --> 00:04:37,770 Næste op er bt, som er forkortelse for Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nu generelt især tidligt i CS50, 96 00:04:41,680 --> 00:04:44,450 vil du ikke rigtig har lejlighed at bruge bt, eller Back Trace, 97 00:04:44,450 --> 00:04:47,860 fordi du ikke har funktioner at ringe til andre funktioner. 98 00:04:47,860 --> 00:04:50,450 >> Du har måske vigtigste opkald en funktion, men det er sandsynligvis det. 99 00:04:50,450 --> 00:04:53,199 Du behøver ikke at andre funktion ringer til en anden funktion, som 100 00:04:53,199 --> 00:04:54,880 kalder en anden funktion, og så videre. 101 00:04:54,880 --> 00:04:57,550 Men da dine programmer får mere kompleks, og især 102 00:04:57,550 --> 00:05:00,290 når du begynder at arbejde med rekursion, back spor 103 00:05:00,290 --> 00:05:05,150 kan være en rigtig nyttig måde at lade dig slags få nogle kontekst for hvor 104 00:05:05,150 --> 00:05:06,460 Jeg er i mit program. 105 00:05:06,460 --> 00:05:10,590 Så siger du har skrevet din kode, og du ved, at main kalder en funktion 106 00:05:10,590 --> 00:05:14,720 f, der kalder en funktion g, hvilket kræver en funktion h. 107 00:05:14,720 --> 00:05:17,650 Så vi har flere lag af rugende foregår her. 108 00:05:17,650 --> 00:05:19,440 >> Hvis du er inde i din GDB miljø, 109 00:05:19,440 --> 00:05:21,640 og du kender din indeni af H, men du glemmer 110 00:05:21,640 --> 00:05:27,210 om, hvad der fik dig til, hvor du are-- du kan skrive bt, eller ryg spor, 111 00:05:27,210 --> 00:05:32,370 og det vil udskrive h, g, f vigtigste, sammen med nogle andre oplysninger, som 112 00:05:32,370 --> 00:05:35,984 giver dig et fingerpeg om, at, OK vigtigste kaldes f, f kaldes g, g kaldet H, 113 00:05:35,984 --> 00:05:37,900 og det er hvor jeg i øjeblikket er i mit program. 114 00:05:37,900 --> 00:05:41,380 Så det kan være virkelig nyttige, især da den kryptiske-ness af GDB 115 00:05:41,380 --> 00:05:45,667 bliver lidt overvældende, at finde ud af præcis, hvor tingene er. 116 00:05:45,667 --> 00:05:48,500 Endelig, når dit program er færdig, eller når du er færdig debugging det 117 00:05:48,500 --> 00:05:50,125 og du ønsker at træde væk fra GDB miljø, 118 00:05:50,125 --> 00:05:51,940 det hjælper at vide, hvordan man får ud af det. 119 00:05:51,940 --> 00:05:55,500 Du kan skrive q eller Quit, at komme ud. 120 00:05:55,500 --> 00:05:59,220 Nu, før dagens video Jeg forberedt et fejlbehæftet program 121 00:05:59,220 --> 00:06:03,900 kaldet buggy1, som jeg kompileret fra en fil kaldet buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Som man kunne forvente, er dette Programmet er i virkeligheden buggy. 123 00:06:06,500 --> 00:06:08,990 Noget går galt når jeg forsøger og køre den. 124 00:06:08,990 --> 00:06:13,014 Nu, desværre, jeg uforvarende slettet min buggy1.c fil, 125 00:06:13,014 --> 00:06:15,930 så for mig at finde ud af hvad der går galt med dette program, 126 00:06:15,930 --> 00:06:18,770 Jeg har tænkt mig at bruge GDB slags blindt, forsøger 127 00:06:18,770 --> 00:06:22,372 at navigere gennem dette program til finde ud af præcis hvad der går galt. 128 00:06:22,372 --> 00:06:24,580 Men ved hjælp af kun de værktøjer vi allerede har lært om, 129 00:06:24,580 --> 00:06:27,700 Vi kan temmelig meget figur ud af, præcis hvad det er. 130 00:06:27,700 --> 00:06:30,740 Så lad os gå over til CS50 IDE og få et kig. 131 00:06:30,740 --> 00:06:33,155 OK, så vi er her i min CS50 IDE miljø, 132 00:06:33,155 --> 00:06:35,697 og jeg vil zoome ind en lille smule så du kan se lidt mere. 133 00:06:35,697 --> 00:06:38,530 I mit terminalvindue, hvis jeg liste indholdet af min nuværende direktør 134 00:06:38,530 --> 00:06:41,250 med ls, vil vi se, at jeg har et par kildefiler 135 00:06:41,250 --> 00:06:44,982 her, herunder tidligere diskuteret buggy1. 136 00:06:44,982 --> 00:06:46,940 Hvad der præcist foregår, når Jeg prøver og køre buggy1. 137 00:06:46,940 --> 00:06:47,773 Jamen så lad os finde ud af. 138 00:06:47,773 --> 00:06:52,510 Jeg skriver dot skråstreg, buggy, og jeg ramte Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentering fejl. 140 00:06:53,670 --> 00:06:55,000 Det er ikke godt. 141 00:06:55,000 --> 00:06:57,180 Hvis du husker, en segmentering fejl typisk 142 00:06:57,180 --> 00:07:01,540 opstår, når vi adgang til hukommelsen at vi ikke får lov til at røre ved. 143 00:07:01,540 --> 00:07:03,820 Vi har en eller anden måde nået uden for grænserne 144 00:07:03,820 --> 00:07:05,995 af, hvad programmet, compiler, har givet os. 145 00:07:05,995 --> 00:07:08,310 Og så allerede der er en fingerpeg til at holde i værktøjskassen 146 00:07:08,310 --> 00:07:10,660 når vi begynder debugging proces. 147 00:07:10,660 --> 00:07:13,620 Noget er gået lidt galt her. 148 00:07:13,620 --> 00:07:15,935 >> Okay, så lad os starte op GDB miljø 149 00:07:15,935 --> 00:07:19,030 og se om vi kan finde ud af hvad problemet er. 150 00:07:19,030 --> 00:07:21,674 Jeg har tænkt mig at rydde min skærm, og jeg har tænkt mig at skrive GDB 151 00:07:21,674 --> 00:07:24,340 igen, for at komme ind i GDB miljø, og navnet på det program 152 00:07:24,340 --> 00:07:27,450 at jeg ønsker at debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Vi får en lille besked, læsning symboler fra buggy1, gjort. 154 00:07:30,182 --> 00:07:32,390 Alt det betyder, er det trak sammen hele koden, 155 00:07:32,390 --> 00:07:35,570 og nu er det blevet indlæst i GDB, og det er klar til at gå. 156 00:07:35,570 --> 00:07:37,140 >> Nu, hvad ønsker jeg at gøre? 157 00:07:37,140 --> 00:07:39,130 Kan du huske, hvad den første skridt typisk er 158 00:07:39,130 --> 00:07:42,540 efter at jeg er inde i dette miljø? 159 00:07:42,540 --> 00:07:44,540 Forhåbentlig sagde du indstille et knækpunkt, fordi 160 00:07:44,540 --> 00:07:46,240 i virkeligheden det er, hvad jeg ønsker at gøre. 161 00:07:46,240 --> 00:07:47,990 Nu har jeg ikke den kildekoden til dette 162 00:07:47,990 --> 00:07:50,948 foran mig, hvilket sandsynligvis ikke den typiske brug tilfældet, ved den måde. 163 00:07:50,948 --> 00:07:52,055 Du sandsynligvis vil. 164 00:07:52,055 --> 00:07:52,680 Så det er godt. 165 00:07:52,680 --> 00:07:55,790 Men forudsat at du ikke gør det, hvad der er den ene funktion, som du kender 166 00:07:55,790 --> 00:07:58,880 findes i hver eneste C-program? 167 00:07:58,880 --> 00:08:04,420 Uanset hvor stor eller hvor kompliceret Det er denne funktion faktisk findes. 168 00:08:04,420 --> 00:08:05,440 Main, ikke? 169 00:08:05,440 --> 00:08:08,870 >> Så mangel alt andet, vi kan sætte en pause punkt ved main. 170 00:08:08,870 --> 00:08:12,200 Og igen, jeg kunne bare skrive bryde vigtigste, i stedet for b. 171 00:08:12,200 --> 00:08:14,650 Og hvis du er nysgerrig, hvis du nogensinde skrive en lang kommando 172 00:08:14,650 --> 00:08:16,800 og derefter indse, at du indtastet de forkerte ting, 173 00:08:16,800 --> 00:08:18,770 og du ønsker at slippe af alle som jeg lige gjorde, 174 00:08:18,770 --> 00:08:22,029 du kan tage kontrol U, som vil slette alt og bringe dig tilbage 175 00:08:22,029 --> 00:08:23,570 til begyndelsen af ​​markøren linjer. 176 00:08:23,570 --> 00:08:26,569 Meget hurtigere end bare holde nede slette eller slå den en masse gange 177 00:08:26,569 --> 00:08:27,080 i. 178 00:08:27,080 --> 00:08:28,740 >> Så vi vil sætte en pause punkt ved main. 179 00:08:28,740 --> 00:08:32,970 Og som du kan se, det siger vi har sætte en pause punkt fil buggy1.c, 180 00:08:32,970 --> 00:08:36,330 og tilsyneladende den første linje kode af vigtigste er linie syv. 181 00:08:36,330 --> 00:08:38,080 Igen, har vi ikke kildefilen her, 182 00:08:38,080 --> 00:08:40,429 men jeg vil antage, at det er fortæller mig sandheden. 183 00:08:40,429 --> 00:08:44,510 Og så, jeg prøver bare og køre programmet, r. 184 00:08:44,510 --> 00:08:45,360 Start af programmet. 185 00:08:45,360 --> 00:08:48,160 Okay, så dette budskab er lidt kryptisk. 186 00:08:48,160 --> 00:08:50,160 Men dybest set, hvad der er sker her, er det bare 187 00:08:50,160 --> 00:08:53,350 fortæller mig jeg har ramt min pause punkt, break point nummer 1. 188 00:08:53,350 --> 00:08:55,877 >> Og så, at linje kode, Ingen sådan fil eller mappe. 189 00:08:55,877 --> 00:08:57,710 Den eneste grund til at Jeg ser dette budskab 190 00:08:57,710 --> 00:09:00,800 er fordi jeg uforvarende slettet min buggy.c fil. 191 00:09:00,800 --> 00:09:04,050 Hvis min buggy1.c fil eksisterede i det aktuelle bibliotek, 192 00:09:04,050 --> 00:09:06,920 denne linje lige der ville faktisk fortælle mig, hvad den linje kode 193 00:09:06,920 --> 00:09:08,214 bogstaveligt læser. 194 00:09:08,214 --> 00:09:09,380 Desværre, jeg slettede det. 195 00:09:09,380 --> 00:09:14,790 Vi bliver nødt til at slags navigere gennem denne lidt mere blindt. 196 00:09:14,790 --> 00:09:17,330 >> OK, så lad os se, hvad ønsker jeg at gøre her? 197 00:09:17,330 --> 00:09:21,770 Nå, jeg vil gerne vide, hvad lokale variabler måske er tilgængelige for mig. 198 00:09:21,770 --> 00:09:23,570 Jeg er begyndt mit program. 199 00:09:23,570 --> 00:09:28,515 Lad os se, hvad der kunne være allerede initialiseret for os. 200 00:09:28,515 --> 00:09:31,430 Jeg skriver Info lokalbefolkningen, ingen lokale. 201 00:09:31,430 --> 00:09:33,960 Okay, så ikke give mig et ton af oplysninger. 202 00:09:33,960 --> 00:09:37,600 Jeg kunne prøve at udskrive en variabel, men jeg kender ikke nogen variabelnavne. 203 00:09:37,600 --> 00:09:39,930 Jeg kunne prøve en back spor, men jeg er inde i main, 204 00:09:39,930 --> 00:09:43,710 så jeg ved, jeg ikke har gjort en anden funktion opkald lige nu. 205 00:09:43,710 --> 00:09:47,710 >> Så ligner min eneste muligheder er at bruge n eller så og begynder at dykke i. 206 00:09:47,710 --> 00:09:49,630 Jeg har tænkt mig at bruge n. 207 00:09:49,630 --> 00:09:51,180 Så jeg skriver n. 208 00:09:51,180 --> 00:09:53,060 Åh min gosh, hvad der foregår her. 209 00:09:53,060 --> 00:09:56,260 Program, der modtages signaler, SIGSEGV segmentering skyld, 210 00:09:56,260 --> 00:09:57,880 og derefter en hel masse ting. 211 00:09:57,880 --> 00:09:58,880 Jeg er allerede overvældet. 212 00:09:58,880 --> 00:10:00,980 Tja, der er faktisk en meget at lære her. 213 00:10:00,980 --> 00:10:02,520 Så hvad siger det os? 214 00:10:02,520 --> 00:10:09,180 Hvad det fortæller os, er, dette program er ved at, men har endnu ikke, seg fejl. 215 00:10:09,180 --> 00:10:12,550 Og i særdeleshed, vil jeg at zoome ind endnu længere her, 216 00:10:12,550 --> 00:10:18,980 det handler om at seg fejl om noget, der hedder strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nu kan vi ikke har diskuteret denne funktion i vid udstrækning. 218 00:10:22,705 --> 00:10:25,580 Men det is-- fordi vi ikke kommer at tale om hver funktion, 219 00:10:25,580 --> 00:10:28,610 eksisterer i C standarden library-- men de er alle til rådighed for dig, 220 00:10:28,610 --> 00:10:32,110 især hvis du tager en se på reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Og strcmp er en virkelig kraftfuld funktion, der eksisterer inde 222 00:10:35,000 --> 00:10:38,070 af string.h header fil, som er en header 223 00:10:38,070 --> 00:10:41,970 fil, der er dedikeret til funktioner at arbejdet med og manipulere strenge. 224 00:10:41,970 --> 00:10:49,830 >> Og i særdeleshed, hvad strcmp gør, er sammenligner værdierne af to strenge. 225 00:10:49,830 --> 00:10:54,160 Så jeg er ved at segmentering fejl på et kald til strcmp det ser ud. 226 00:10:54,160 --> 00:10:58,530 Jeg ramte n, og faktisk får jeg beskeden, Programmet afsluttes med signal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentering skyld. Så nu Jeg har faktisk seg afbrudt, 228 00:11:01,370 --> 00:11:06,479 og mit program har temmelig meget effektivt givet op. 229 00:11:06,479 --> 00:11:07,770 Dette er afslutningen af ​​programmet. 230 00:11:07,770 --> 00:11:10,370 Det brød ned, det styrtede ned. 231 00:11:10,370 --> 00:11:14,740 Så var ikke meget, men jeg faktisk gjorde lære en hel del 232 00:11:14,740 --> 00:11:16,747 fra denne lille oplevelse. 233 00:11:16,747 --> 00:11:17,580 Hvad har jeg lært? 234 00:11:17,580 --> 00:11:22,020 Nå, mit program går ned temmelig meget det samme. 235 00:11:22,020 --> 00:11:26,300 Mit program går ned på Et opkald til strcmp, men jeg 236 00:11:26,300 --> 00:11:30,560 har ikke nogen lokale variable i min programmet på det tidspunkt, det går ned. 237 00:11:30,560 --> 00:11:37,320 Så hvad streng, eller strygere, kunne jeg muligvis være at sammenligne. 238 00:11:37,320 --> 00:11:42,140 Hvis jeg ikke har nogen lokal variabler, kan du 239 00:11:42,140 --> 00:11:45,520 formode, at jeg have-- der måske er en global variabel, som kunne være sandt. 240 00:11:45,520 --> 00:11:47,670 >> Men generelt forekommer det ligesom jeg sammenligne 241 00:11:47,670 --> 00:11:52,070 til noget, der ikke eksisterer. 242 00:11:52,070 --> 00:11:54,130 Så lad os undersøge at en lidt længere. 243 00:11:54,130 --> 00:11:55,120 Så jeg har tænkt mig at rydde min skærm. 244 00:11:55,120 --> 00:11:57,536 Jeg har tænkt mig at holde op ud af det GDB miljø for et sekund. 245 00:11:57,536 --> 00:12:01,300 Og jeg tænker, OK, så der er ingen lokale variabler i mit program. 246 00:12:01,300 --> 00:12:06,444 Jeg spekulerer på, om måske jeg skulle passere i en streng som en kommandolinje argument. 247 00:12:06,444 --> 00:12:07,610 Så lad os bare prøve det ud. 248 00:12:07,610 --> 00:12:09,020 Jeg har ikke gjort det før. 249 00:12:09,020 --> 00:12:14,244 >> Lad os se, om måske hvis jeg køre dette program med en kommandolinje argument det virker. 250 00:12:14,244 --> 00:12:16,140 Huh, ingen segmentering fejl der. 251 00:12:16,140 --> 00:12:17,870 Det lige fortalt mig, at jeg regnede det ud. 252 00:12:17,870 --> 00:12:19,170 Så måske det er rettelsen her. 253 00:12:19,170 --> 00:12:27,560 Og ja, hvis jeg går tilbage og se på den faktiske kildekoden til buggy1.c, 254 00:12:27,560 --> 00:12:31,180 det virker som om, hvad jeg gør, er Jeg gør et opkald til strcmp uden 255 00:12:31,180 --> 00:12:34,010 kontrollere, om faktisk argv [1] findes. 256 00:12:34,010 --> 00:12:36,730 Dette er faktisk den kildekoden til buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Så hvad jeg virkelig har brug for at gøre her for at lave mit program, 258 00:12:38,855 --> 00:12:40,835 antager jeg har den fil foran mig, er 259 00:12:40,835 --> 00:12:44,740 at blot tilføje en check til at gøre sikker på, at argc er lig med 2. 260 00:12:44,740 --> 00:12:47,780 Så dette eksempel igen, som jeg sagde, er en lille smule konstruerede, ikke? 261 00:12:47,780 --> 00:12:49,840 Du normalt ikke kommer til at uheld sletter din kildekode 262 00:12:49,840 --> 00:12:51,820 og derefter nødt til at prøve og debug af programmet. 263 00:12:51,820 --> 00:12:53,120 Men forhåbentlig, det gav du en illustration 264 00:12:53,120 --> 00:12:55,120 af den slags ting, der kunne du tænke 265 00:12:55,120 --> 00:12:56,610 som du fejlfindingen af ​​programmet. 266 00:12:56,610 --> 00:12:58,760 >> Hvad er tingenes tilstand her? 267 00:12:58,760 --> 00:13:00,510 Hvilke variabler gør jeg har adgang til mig? 268 00:13:00,510 --> 00:13:03,600 Hvor præcist er mit program styrter ned, på hvilken linje, 269 00:13:03,600 --> 00:13:05,240 på hvilke opkald til hvilken funktion? 270 00:13:05,240 --> 00:13:06,952 Hvilken slags spor betyder det giver mig? 271 00:13:06,952 --> 00:13:08,910 Og det er præcis den slags tankegang, at du 272 00:13:08,910 --> 00:13:12,820 skal komme ind, når du er tænker debugging dine programmer. 273 00:13:12,820 --> 00:13:13,820 >> Jeg er Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Det er CS50. 275 00:13:16,140 --> 00:15:08,642