1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Okej GDB. 3 00:00:06,830 --> 00:00:08,480 Vad är det exakt? 4 00:00:08,480 --> 00:00:11,310 Så GDB, som står för GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 är en riktigt fantastisk verktyg som vi kan använda för att hjälpa oss att felsöka våra program, 6 00:00:15,040 --> 00:00:18,210 eller ta reda på var saker och ting är går fel i våra program. 7 00:00:18,210 --> 00:00:22,590 GDB är otroligt kraftfullt, men utgången och interaktion med det 8 00:00:22,590 --> 00:00:23,830 kan vara lite kryptiskt. 9 00:00:23,830 --> 00:00:28,210 Det är oftast ett kommandoradsverktyg, och det kan kasta en hel del meddelanden på dig. 10 00:00:28,210 --> 00:00:31,144 Och det kan typ av svårt att tolka exakt vad som händer. 11 00:00:31,144 --> 00:00:33,560 Lyckligtvis har vi vidtagit åtgärder att åtgärda problemet för dig 12 00:00:33,560 --> 00:00:36,281 när du arbetar genom CS50. 13 00:00:36,281 --> 00:00:39,030 Om du inte använder den grafiska debugger, som min kollega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse har talat ganska lite om i en video som 15 00:00:41,570 --> 00:00:44,740 bör vara över här just nu, kan du behöva 16 00:00:44,740 --> 00:00:48,270 att använda dessa kommandorad verktyg för att arbeta med GDB. 17 00:00:48,270 --> 00:00:51,250 Om du arbetar i CS50 IDE, behöver du inte göra detta. 18 00:00:51,250 --> 00:00:53,550 Men om du inte arbetar i CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 kanske med hjälp av en version av CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 eller annan Linux Systemet med GDB installerat på det, 21 00:00:58,860 --> 00:01:00,980 Du kan behöva använda Dessa kommandoraden. 22 00:01:00,980 --> 00:01:02,860 >> Och eftersom du kanske måste göra det, det är 23 00:01:02,860 --> 00:01:06,280 användbar bara för att förstå hur GDB arbetar från kommandoraden. 24 00:01:06,280 --> 00:01:09,650 Men återigen, om du är använder CS50 IDE, du 25 00:01:09,650 --> 00:01:15,400 kan använda den grafiska debugger som är inbyggd i IDE. 26 00:01:15,400 --> 00:01:18,750 Så för att få saker och ting med GDB, att starta felsökning 27 00:01:18,750 --> 00:01:21,220 processen av en viss program, behöver du göra 28 00:01:21,220 --> 00:01:23,810 är typ GDB följt av programmets namn. 29 00:01:23,810 --> 00:01:28,620 Så till exempel, om ditt program är Hej, skulle du skriver GDB hej. 30 00:01:28,620 --> 00:01:31,210 >> När du gör det, du kommer att dra upp GDB miljön. 31 00:01:31,210 --> 00:01:33,800 Ditt snabba kommer att förändras, och istället för att vara vad den vanligtvis 32 00:01:33,800 --> 00:01:35,841 är när du skriver saker vid kommandot line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- alla dina typiska Linux kommandon, ditt snabba 34 00:01:38,115 --> 00:01:42,200 kommer att ändras till, förmodligen, något liknande parentes GDB parenteser. 35 00:01:42,200 --> 00:01:46,630 Det är din nya GDB snabb, eftersom du är inne i GDB miljön. 36 00:01:46,630 --> 00:01:49,830 Väl inne i denna miljö, det finns två stora kommandon 37 00:01:49,830 --> 00:01:52,290 att du antagligen kommer att använda i följande ordning. 38 00:01:52,290 --> 00:01:55,200 >> Den första är b, som är en förkortning för paus. 39 00:01:55,200 --> 00:01:58,690 Och när du skriver b, du vanligtvis Skriv namnet på en funktion, 40 00:01:58,690 --> 00:02:01,040 eller om du råkar veta kring vad radnummer 41 00:02:01,040 --> 00:02:04,100 ditt program börjar att bete sig lite konstigt, 42 00:02:04,100 --> 00:02:06,370 Du kan skriva en linje nummer där också. 43 00:02:06,370 --> 00:02:09,660 Vilken b, eller paus, gör är det tillåter ditt program 44 00:02:09,660 --> 00:02:13,270 att köra fram till en viss punkt, nämligen, namnet på funktionen 45 00:02:13,270 --> 00:02:15,880 som du anger eller linjen nummer som du anger. 46 00:02:15,880 --> 00:02:18,590 >> Och på den punkten, det fryser utförande. 47 00:02:18,590 --> 00:02:21,670 Detta är en riktigt bra sak, eftersom när avrättning har varit fryst, 48 00:02:21,670 --> 00:02:25,214 du kan börja mycket långsamt stega igenom ditt program. 49 00:02:25,214 --> 00:02:28,130 Vanligtvis om du har varit igång dina program, de är ganska kort. 50 00:02:28,130 --> 00:02:31,250 Vanligtvis skriver du punkt snedstreck allt namnet på programmet, tryck Enter, 51 00:02:31,250 --> 00:02:33,470 och innan du kan blinka, din Programmet är redan klar. 52 00:02:33,470 --> 00:02:36,620 Det är inte verkligen en hel del tid att försöka och räkna ut vad som går fel. 53 00:02:36,620 --> 00:02:40,920 Så det verkligen att kunna bromsa saker ner genom att sätta en brytpunkt med b, 54 00:02:40,920 --> 00:02:43,040 och sedan kliva in. 55 00:02:43,040 --> 00:02:46,169 >> Sen när du har ställt in paus Nu kan du köra programmet. 56 00:02:46,169 --> 00:02:47,960 Och om du har någon kommandoradsargumenten, 57 00:02:47,960 --> 00:02:51,610 du anger dem här, inte när du skriver GDB ditt programnamnet. 58 00:02:51,610 --> 00:02:55,980 Du anger alla kommandoraden argument genom att ta r eller springa, 59 00:02:55,980 --> 00:03:00,270 och sedan vad kommandoradsargumenten du behöver inne i ditt program. 60 00:03:00,270 --> 00:03:03,510 Det finns ett antal andra riktigt viktiga och användbara kommandon 61 00:03:03,510 --> 00:03:04,970 insidan av BNP miljön. 62 00:03:04,970 --> 00:03:07,540 Så låt mig bara snabbt gå igenom några av dem. 63 00:03:07,540 --> 00:03:11,320 >> Den första är N, som är en förkortning för nästa, och du kan skriva nästa istället för n, 64 00:03:11,320 --> 00:03:12,304 båda skulle fungera. 65 00:03:12,304 --> 00:03:13,470 Och det är bara stenografi. 66 00:03:13,470 --> 00:03:17,540 Och som du har förmodligen redan fått används till att kunna skriva saker 67 00:03:17,540 --> 00:03:20,520 kortare är generellt bättre. 68 00:03:20,520 --> 00:03:24,100 Och vad det kommer att göra är det kommer kliva fram ett kodblock. 69 00:03:24,100 --> 00:03:26,170 Så det kommer att gå framåt tills ett funktionsanrop. 70 00:03:26,170 --> 00:03:28,350 Och sedan i stället för dykning i denna funktion 71 00:03:28,350 --> 00:03:33,130 och gå igenom allt detta funktioner kod, kommer det bara funktionen. 72 00:03:33,130 --> 00:03:34,400 >> Funktionen kommer att kallas. 73 00:03:34,400 --> 00:03:35,733 Det kommer att göra allt sitt arbete är. 74 00:03:35,733 --> 00:03:38,870 Det kommer att returnera ett värde till funktionen som kallade det. 75 00:03:38,870 --> 00:03:42,490 Och då kommer du gå vidare till nästa rad i nämnda anropsfunktionen. 76 00:03:42,490 --> 00:03:44,555 Om du vill kliva insidan av funktionen, 77 00:03:44,555 --> 00:03:46,430 i stället för att bara ha det utför, särskilt 78 00:03:46,430 --> 00:03:50,004 om du tror att problemet kan ligga inne i denna funktion, 79 00:03:50,004 --> 00:03:52,670 Du kan naturligtvis sätta en paus punkt inuti av den funktionen. 80 00:03:52,670 --> 00:03:57,820 Eller om du redan kör, kan du Använd s att kliva fram en rad kod. 81 00:03:57,820 --> 00:04:01,170 >> Så det här kommer att gå in och dyka i funktioner, 82 00:04:01,170 --> 00:04:04,750 istället för att bara ha execute och fortsätter i funktion 83 00:04:04,750 --> 00:04:07,380 att du är i för felsökning. 84 00:04:07,380 --> 00:04:09,870 Om du någonsin vill veta värdet på en variabel, 85 00:04:09,870 --> 00:04:12,507 Du kan skriva p, eller ut, och sedan variabelnamnet. 86 00:04:12,507 --> 00:04:15,090 Och det kommer att skriva ut till dig, insidan av GDB miljön, 87 00:04:15,090 --> 00:04:19,110 namnet på den variabel, som du-- ursäkta mig-- värdet av variabeln 88 00:04:19,110 --> 00:04:20,064 att du har namngett. 89 00:04:20,064 --> 00:04:23,230 Om du vill veta värdet av varje lokal variabel tillgänglig från där 90 00:04:23,230 --> 00:04:25,970 du befinner dig i ditt program, kan du skriva info lokalbefolkningen. 91 00:04:25,970 --> 00:04:28,332 Det är mycket snabbare än skriver p och sedan vad som helst, 92 00:04:28,332 --> 00:04:30,540 notering ut alla variabler som du vet existerar. 93 00:04:30,540 --> 00:04:34,370 Du kan skriva info lokalbefolkningen, och det kommer att skriva ut allt för dig. 94 00:04:34,370 --> 00:04:37,770 Nästa är upp bt, som är kort för Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nu, i allmänhet, speciellt i början av CS50, 96 00:04:41,680 --> 00:04:44,450 du kommer inte riktigt att få tillfälle att använda bt eller Back Trace, 97 00:04:44,450 --> 00:04:47,860 eftersom du inte ska ha funktioner att ringa till andra funktioner. 98 00:04:47,860 --> 00:04:50,450 >> Du kanske har huvud kallar en funktion, men det är förmodligen det. 99 00:04:50,450 --> 00:04:53,199 Du behöver inte ha den andra funktion ringer en annan funktion, som 100 00:04:53,199 --> 00:04:54,880 anropar en annan funktion, och så vidare. 101 00:04:54,880 --> 00:04:57,550 Men som dina program får mer komplex, och i synnerhet 102 00:04:57,550 --> 00:05:00,290 när du börjar arbeta med rekursion, rygg spår 103 00:05:00,290 --> 00:05:05,150 kan vara ett riktigt bra sätt att låta dig typ av få något sammanhang för var 104 00:05:05,150 --> 00:05:06,460 Jag är i mitt program. 105 00:05:06,460 --> 00:05:10,590 Så säger du har skrivit din kod, och du vet att huvud anropar en funktion 106 00:05:10,590 --> 00:05:14,720 f, vilket kräver en funktion g, vilket kräver en funktion h. 107 00:05:14,720 --> 00:05:17,650 Så vi har flera skikt av häckande pågår här. 108 00:05:17,650 --> 00:05:19,440 >> Om du är inne i din GDB miljö, 109 00:05:19,440 --> 00:05:21,640 och du vet att din insida av h, men du glömmer 110 00:05:21,640 --> 00:05:27,210 vad fick dig dit du är-- du kan skriva bt, eller tillbaka spår, 111 00:05:27,210 --> 00:05:32,370 och det kommer att skriva ut h, g, f main, tillsammans med några andra uppgifter, som 112 00:05:32,370 --> 00:05:35,984 ger dig en aning om att, OK huvud kallas f, f kallas g, g kallas h, 113 00:05:35,984 --> 00:05:37,900 och det är där jag för närvarande är i mitt program. 114 00:05:37,900 --> 00:05:41,380 Så det kan vara riktigt bra, särskilt som det kryptiska ness GDB 115 00:05:41,380 --> 00:05:45,667 blir lite överväldigande, till ta reda på exakt var saker är. 116 00:05:45,667 --> 00:05:48,500 Slutligen, när programmet är klar, eller när du är klar felsökning det 117 00:05:48,500 --> 00:05:50,125 och du vill steg bort från GDB miljön, 118 00:05:50,125 --> 00:05:51,940 hjälper det att veta hur man får ut av det. 119 00:05:51,940 --> 00:05:55,500 Du kan skriva q, eller avsluta, att komma ut. 120 00:05:55,500 --> 00:05:59,220 Nu, innan dagens video Jag förberedde en buggig program 121 00:05:59,220 --> 00:06:03,900 kallas buggy1, som jag sammanställt från en fil som kallas buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Som man kan förvänta sig, detta Programmet är i själva verket paraplyvagn. 123 00:06:06,500 --> 00:06:08,990 Något går fel när jag försöker och kör den. 124 00:06:08,990 --> 00:06:13,014 Nu, tyvärr, jag av misstag bort min buggy1.c fil, 125 00:06:13,014 --> 00:06:15,930 så för mig att räkna ut vad som händer fel med det här programmet, 126 00:06:15,930 --> 00:06:18,770 Jag kommer att behöva använda GDB typ av blint, försöker 127 00:06:18,770 --> 00:06:22,372 att navigera genom detta program för att räkna ut exakt vad som går fel. 128 00:06:22,372 --> 00:06:24,580 Men med bara de verktyg Vi har redan lärt oss om, 129 00:06:24,580 --> 00:06:27,700 Vi kan ganska mycket siffra reda på exakt vad det är. 130 00:06:27,700 --> 00:06:30,740 Så låt oss gå över till CS50 IDE och ta en titt. 131 00:06:30,740 --> 00:06:33,155 OK, så vi är här i min CS50 IDE miljö, 132 00:06:33,155 --> 00:06:35,697 och jag ska zooma in en liten bit så att du kan se en lite mer. 133 00:06:35,697 --> 00:06:38,530 I mitt terminalfönster, om jag lista innehållet i min nuvarande chef 134 00:06:38,530 --> 00:06:41,250 med ls, vi får se att jag har ett par källfiler 135 00:06:41,250 --> 00:06:44,982 här, inklusive tidigare diskuterats buggy1. 136 00:06:44,982 --> 00:06:46,940 Vad exakt som händer när Jag försöker köra buggy1. 137 00:06:46,940 --> 00:06:47,773 Nåväl låt oss ta reda på. 138 00:06:47,773 --> 00:06:52,510 Jag skriver dot slash, buggy, och jag slog Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmente fel. 140 00:06:53,670 --> 00:06:55,000 Det är inte bra. 141 00:06:55,000 --> 00:06:57,180 Om ni minns, en segmentering fel typiskt 142 00:06:57,180 --> 00:07:01,540 uppstår när vi tillgång till minne att vi inte är tillåtet att röra. 143 00:07:01,540 --> 00:07:03,820 Vi har på något sätt kommit utanför gränserna 144 00:07:03,820 --> 00:07:05,995 av vad programmet, den kompilator, har gett oss. 145 00:07:05,995 --> 00:07:08,310 Och så redan det är en ledtråd för att hålla i verktygslådan 146 00:07:08,310 --> 00:07:10,660 när vi börjar felsökningsprocessen. 147 00:07:10,660 --> 00:07:13,620 Något har gått lite fel här. 148 00:07:13,620 --> 00:07:15,935 >> Okej, så låt oss börja upp GDB miljön 149 00:07:15,935 --> 00:07:19,030 och se om vi kan lista ut exakt vad problemet är. 150 00:07:19,030 --> 00:07:21,674 Jag kommer att rensa skärmen, och jag kommer att skriva GDB 151 00:07:21,674 --> 00:07:24,340 igen, att komma in i GDB miljön, och namnet på programmet 152 00:07:24,340 --> 00:07:27,450 att jag vill felsöka, buggy1. 153 00:07:27,450 --> 00:07:30,182 Vi får ett litet meddelande, läsning symboler från buggy1, gjort. 154 00:07:30,182 --> 00:07:32,390 Allt detta betyder är det drog tillsammans all kod, 155 00:07:32,390 --> 00:07:35,570 och nu är det laddats in GDB, och det är redo att gå. 156 00:07:35,570 --> 00:07:37,140 >> Nu, vad jag vill göra? 157 00:07:37,140 --> 00:07:39,130 Minns du vad första steg typiskt är 158 00:07:39,130 --> 00:07:42,540 efter att jag är inne i denna miljö? 159 00:07:42,540 --> 00:07:44,540 Förhoppningsvis, sade du ställer en brytpunkt, eftersom 160 00:07:44,540 --> 00:07:46,240 i själva verket det är vad jag vill göra. 161 00:07:46,240 --> 00:07:47,990 Nu behöver jag inte har källkoden för detta 162 00:07:47,990 --> 00:07:50,948 framför mig, som är förmodligen inte den typiska användningsfall, förresten. 163 00:07:50,948 --> 00:07:52,055 Du kommer förmodligen. 164 00:07:52,055 --> 00:07:52,680 Så det är bra. 165 00:07:52,680 --> 00:07:55,790 Men förutsatt att du inte, vad är den funktion som du vet 166 00:07:55,790 --> 00:07:58,880 finns i varenda C-programmet? 167 00:07:58,880 --> 00:08:04,420 Oavsett hur stor eller hur komplicerat Det är, finns denna funktion definitivt. 168 00:08:04,420 --> 00:08:05,440 Main, eller hur? 169 00:08:05,440 --> 00:08:08,870 >> Så inte allt, vi kan ange en brytpunkt vid huvud. 170 00:08:08,870 --> 00:08:12,200 Och återigen, jag kunde bara skriva break, i stället för miljarder. 171 00:08:12,200 --> 00:08:14,650 Och om du är nyfiken, om du någonsin skriva ut en lång kommando 172 00:08:14,650 --> 00:08:16,800 och sedan inser att du skrev fel sak, 173 00:08:16,800 --> 00:08:18,770 och du vill bli av allt som jag gjorde precis, 174 00:08:18,770 --> 00:08:22,029 du kan ta kontroll U, som kommer radera allt och ta dig tillbaka 175 00:08:22,029 --> 00:08:23,570 till början av markörlinjer. 176 00:08:23,570 --> 00:08:26,569 Mycket snabbare än bara hålla ner ta bort eller slå det ett gäng gånger 177 00:08:26,569 --> 00:08:27,080 över. 178 00:08:27,080 --> 00:08:28,740 >> Så vi ska sätta en brytpunkt vid huvud. 179 00:08:28,740 --> 00:08:32,970 Och som ni kan se, säger vi har ange en brytpunkt vid fil buggy1.c, 180 00:08:32,970 --> 00:08:36,330 och uppenbarligen den första raden kod för huvud ligger i linje sju. 181 00:08:36,330 --> 00:08:38,080 Återigen, vi har inte källfilen här, 182 00:08:38,080 --> 00:08:40,429 men jag kommer att anta att det är berättade sanningen. 183 00:08:40,429 --> 00:08:44,510 Och sedan, jag försöker bara och kör programmet, r. 184 00:08:44,510 --> 00:08:45,360 Startprogrammet. 185 00:08:45,360 --> 00:08:48,160 Okej, så det här meddelandet är lite kryptiskt. 186 00:08:48,160 --> 00:08:50,160 Men i grund och botten vad händer här är att det är bara 187 00:08:50,160 --> 00:08:53,350 säger att jag har nått min paus punkt, brytpunktsnummer 1. 188 00:08:53,350 --> 00:08:55,877 >> Och sedan att kodrad, ingen sådan fil eller katalog. 189 00:08:55,877 --> 00:08:57,710 Enda anledningen till att Jag ser detta meddelande 190 00:08:57,710 --> 00:09:00,800 är att jag av misstag bort min buggy.c fil. 191 00:09:00,800 --> 00:09:04,050 Om mitt buggy1.c fil existerade i den aktuella katalogen, 192 00:09:04,050 --> 00:09:06,920 den linjen rätt det skulle faktiskt berätta vad kodraden 193 00:09:06,920 --> 00:09:08,214 rally läser. 194 00:09:08,214 --> 00:09:09,380 Tyvärr, jag tog bort det. 195 00:09:09,380 --> 00:09:14,790 Vi kommer att behöva slags navigera genom detta lite mer blint. 196 00:09:14,790 --> 00:09:17,330 >> OK, så låt oss se, vad vill jag göra här? 197 00:09:17,330 --> 00:09:21,770 Tja, skulle jag vilja veta vad lokal variabler kanske är tillgängliga för mig. 198 00:09:21,770 --> 00:09:23,570 Jag har börjat mitt program. 199 00:09:23,570 --> 00:09:28,515 Låt oss se vad som kan vara redan initierats för oss. 200 00:09:28,515 --> 00:09:31,430 Jag skriver Infolokalbefolkningen, ingen lokalbefolkningen. 201 00:09:31,430 --> 00:09:33,960 Okej, så att inte ge mig massor av information. 202 00:09:33,960 --> 00:09:37,600 Jag kunde försöka skriva ut en variabel, men jag vet inte något variabelnamn. 203 00:09:37,600 --> 00:09:39,930 Jag kunde prova en back spår, men jag är inne i huvud, 204 00:09:39,930 --> 00:09:43,710 så jag vet att jag har inte gjort en annan funktion samtal just nu. 205 00:09:43,710 --> 00:09:47,710 >> Så ser ut som min enda alternativ är att använda n eller så och börja dyka. 206 00:09:47,710 --> 00:09:49,630 Jag kommer att använda n. 207 00:09:49,630 --> 00:09:51,180 Så jag skriver n. 208 00:09:51,180 --> 00:09:53,060 Oh my gosh, vad som händer här. 209 00:09:53,060 --> 00:09:56,260 Program mottagna signaler, SIGSEGV segmentering fel, 210 00:09:56,260 --> 00:09:57,880 och sedan en massa grejer. 211 00:09:57,880 --> 00:09:58,880 Jag är redan överväldigad. 212 00:09:58,880 --> 00:10:00,980 Tja, det finns faktiskt en mycket att lära här. 213 00:10:00,980 --> 00:10:02,520 Vad säger detta oss? 214 00:10:02,520 --> 00:10:09,180 Vad det säger oss är detta program är om, men har ännu inte, seg fel. 215 00:10:09,180 --> 00:10:12,550 Och framför allt, jag kommer för att zooma in ännu längre här, 216 00:10:12,550 --> 00:10:18,980 det handlar om att seg fel om något som kallas strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nu kanske vi inte har diskuterat denna funktion utförligt. 218 00:10:22,705 --> 00:10:25,580 Men det är-- eftersom vi inte tänker att prata om varje funktion som 219 00:10:25,580 --> 00:10:28,610 existerar i C-standard library-- men de är alla tillgängliga för dig, 220 00:10:28,610 --> 00:10:32,110 särskilt om du tar en titta på reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Och strcmp är en riktigt kraftfull funktion som finns inuti 222 00:10:35,000 --> 00:10:38,070 av string.h sidhuvud fil, som är en rubrik 223 00:10:38,070 --> 00:10:41,970 fil som är tillägnad funktioner som arbetar med och manipulera strängar. 224 00:10:41,970 --> 00:10:49,830 >> Och framför allt, vad strcmp gör är jämförs värdena för två strängar. 225 00:10:49,830 --> 00:10:54,160 Så jag är på väg att segmentering fel på ett samtal till strcmp det verkar. 226 00:10:54,160 --> 00:10:58,530 Jag slog n, och faktum är att jag får meddelandet, Programmet avslutas med signal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentering fel. Så nu Jag har faktiskt seg klandras, 228 00:11:01,370 --> 00:11:06,479 och mitt program har ganska mycket effektivt gett upp. 229 00:11:06,479 --> 00:11:07,770 Detta är slutet av programmet. 230 00:11:07,770 --> 00:11:10,370 Det gick sönder, kraschade den. 231 00:11:10,370 --> 00:11:14,740 Så var inte mycket, men jag faktiskt lärde en hel del 232 00:11:14,740 --> 00:11:16,747 från denna lilla erfarenhet. 233 00:11:16,747 --> 00:11:17,580 Vad har jag lärt mig? 234 00:11:17,580 --> 00:11:22,020 Tja, kraschar mitt program ganska mycket omedelbart. 235 00:11:22,020 --> 00:11:26,300 Mitt program kraschar på ett samtal till strcmp, men jag 236 00:11:26,300 --> 00:11:30,560 inte har några lokala variabler i mitt program vid den tidpunkt då den kraschar. 237 00:11:30,560 --> 00:11:37,320 Så vad sträng eller strängar, skulle jag kunna vara att jämföra. 238 00:11:37,320 --> 00:11:42,140 Om jag inte har någon lokal variabler, kanske du 239 00:11:42,140 --> 00:11:45,520 förmoda att jag have-- det kanske är en global variabel, som kan vara sant. 240 00:11:45,520 --> 00:11:47,670 >> Men generellt verkar det som jag jämföra 241 00:11:47,670 --> 00:11:52,070 till något som inte existerar. 242 00:11:52,070 --> 00:11:54,130 Så låt oss undersöka att lite längre. 243 00:11:54,130 --> 00:11:55,120 Så jag kommer att rensa skärmen. 244 00:11:55,120 --> 00:11:57,536 Jag ska sluta ut ur GDB miljö för en sekund. 245 00:11:57,536 --> 00:12:01,300 Och jag tänker, OK, så det finns inga lokala variabler i mitt program. 246 00:12:01,300 --> 00:12:06,444 Jag undrar om kanske jag ska passera i en sträng som en kommandorad argument. 247 00:12:06,444 --> 00:12:07,610 Så låt oss bara testa detta. 248 00:12:07,610 --> 00:12:09,020 Jag har inte gjort det här förut. 249 00:12:09,020 --> 00:12:14,244 >> Låt oss se om kanske om jag kör det här programmet med en kommandorad argument det fungerar. 250 00:12:14,244 --> 00:12:16,140 Huh, ingen segmentering fel där. 251 00:12:16,140 --> 00:12:17,870 Det sa bara till mig att jag räknat ut. 252 00:12:17,870 --> 00:12:19,170 Så kanske det är fix här. 253 00:12:19,170 --> 00:12:27,560 Och faktiskt, om jag går tillbaka och titta på själva källkoden för buggy1.c, 254 00:12:27,560 --> 00:12:31,180 verkar det som om det jag gör är Jag gör ett anrop till strcmp utan 255 00:12:31,180 --> 00:12:34,010 kontrollera om i själva verket argv [1] föreligger. 256 00:12:34,010 --> 00:12:36,730 Detta är faktiskt den källkoden för buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Så vad jag verkligen behöver göra här för att fixa mitt program, 258 00:12:38,855 --> 00:12:40,835 förutsatt att jag har fil framför mig, är 259 00:12:40,835 --> 00:12:44,740 att bara lägga till en kontroll att göra till att argc är lika med två. 260 00:12:44,740 --> 00:12:47,780 Så det här exemplet, igen, som jag sa, är lite krystat, eller hur? 261 00:12:47,780 --> 00:12:49,840 Du vanligtvis inte kommer att av misstag tar bort din källkod 262 00:12:49,840 --> 00:12:51,820 och sedan måste försöka och felsöka programmet. 263 00:12:51,820 --> 00:12:53,120 Men förhoppningsvis gav det du en illustration 264 00:12:53,120 --> 00:12:55,120 av den typen av saker som du kan tänka på 265 00:12:55,120 --> 00:12:56,610 som du felsökt programmet. 266 00:12:56,610 --> 00:12:58,760 >> Vad är läget här? 267 00:12:58,760 --> 00:13:00,510 Vilka variabler gör jag har tillgång till mig? 268 00:13:00,510 --> 00:13:03,600 Var exakt är mitt program kraschar, på vilken linje, 269 00:13:03,600 --> 00:13:05,240 på vilken anrop till vilken funktion? 270 00:13:05,240 --> 00:13:06,952 Vilken typ av ledtrådar ger detta mig? 271 00:13:06,952 --> 00:13:08,910 Och det är precis det typ av tänkesätt som du 272 00:13:08,910 --> 00:13:12,820 bör få i när du är funderar på att felsöka dina program. 273 00:13:12,820 --> 00:13:13,820 >> Jag är Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Detta är CS50. 275 00:13:16,140 --> 00:15:08,642