1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Oké GDB. 3 00:00:06,830 --> 00:00:08,480 Wat is het precies? 4 00:00:08,480 --> 00:00:11,310 Dus GDB, wat staat voor de GNU debugger, 5 00:00:11,310 --> 00:00:15,040 is echt een geweldig instrument dat we kunnen te gebruiken om ons te helpen debuggen onze programma's, 6 00:00:15,040 --> 00:00:18,210 of uit te vinden waar de dingen zijn fout gaat in onze programma's. 7 00:00:18,210 --> 00:00:22,590 GDB is ongelooflijk krachtig, maar de output en interactie ermee 8 00:00:22,590 --> 00:00:23,830 kan een beetje cryptisch. 9 00:00:23,830 --> 00:00:28,210 Het is meestal een command-line tool, en het kan veel berichten naar je gooien. 10 00:00:28,210 --> 00:00:31,144 En het kan een beetje moeilijk om ontleden precies wat er aan de hand. 11 00:00:31,144 --> 00:00:33,560 Gelukkig hebben we maatregelen genomen om dit probleem op te lossen voor u 12 00:00:33,560 --> 00:00:36,281 terwijl u werkt door middel van CS50. 13 00:00:36,281 --> 00:00:39,030 Als u geen gebruik maakt van de grafische debugger, die mijn collega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse heeft vrij gesproken een beetje over in een video, die een 15 00:00:41,570 --> 00:00:44,740 moet hier worden op dit moment, zou je nodig hebt 16 00:00:44,740 --> 00:00:48,270 deze command line te gebruiken gereedschappen om te werken met GDB. 17 00:00:48,270 --> 00:00:51,250 Als je werkt in de CS50 IDE, heb je niet nodig om dit te doen. 18 00:00:51,250 --> 00:00:53,550 Maar als je niet werken in de CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 misschien een versie van CS50 Appliance 20 00:00:55,750 --> 00:00:58,860 of een andere Linux operating GDB systeem geïnstalleerd is, 21 00:00:58,860 --> 00:01:00,980 u kan nodig zijn om te gebruiken Deze command line tools. 22 00:01:00,980 --> 00:01:02,860 >> En omdat je misschien om dat te doen, het is 23 00:01:02,860 --> 00:01:06,280 handig gewoon om te begrijpen hoe GDB werkt vanaf de opdrachtregel. 24 00:01:06,280 --> 00:01:09,650 Maar nogmaals, als je met behulp van de CS50 IDE, u 25 00:01:09,650 --> 00:01:15,400 kan de grafische debugger gebruiken die is ingebouwd in de IDE. 26 00:01:15,400 --> 00:01:18,750 Dus dingen gaan met te krijgen GDB, de debug starten 27 00:01:18,750 --> 00:01:21,220 Werkwijze van een bepaalde programma, moet alles wat je doet 28 00:01:21,220 --> 00:01:23,810 wordt het type GDB gevolgd Door de programmanaam. 29 00:01:23,810 --> 00:01:28,620 Dus bijvoorbeeld, als uw programma hallo, je zou GDB hallo typen. 30 00:01:28,620 --> 00:01:31,210 >> Als je dat doet, je gaat te trekken van het GDB milieu. 31 00:01:31,210 --> 00:01:33,800 Je prompt zal veranderen, en in plaats van wat gewoonlijk 32 00:01:33,800 --> 00:01:35,841 is wanneer je dingen typt op de opdrachtregel line-- ls, 33 00:01:35,841 --> 00:01:38,115 CD-- al uw typische Linux-commando's, je prompt 34 00:01:38,115 --> 00:01:42,200 zal veranderen, waarschijnlijk iets zoals haakjes GDB haakjes. 35 00:01:42,200 --> 00:01:46,630 Dat is uw nieuwe GDB prompt, omdat u bent in de GDB milieu. 36 00:01:46,630 --> 00:01:49,830 Eenmaal binnen van die omgeving, er zijn twee grote opdrachten 37 00:01:49,830 --> 00:01:52,290 die je waarschijnlijk zult gebruiken in deze volgorde. 38 00:01:52,290 --> 00:01:55,200 >> De eerste is b, waarin is de afkorting voor pauze. 39 00:01:55,200 --> 00:01:58,690 En na u, u doorgaans typt b typt u de naam van een functie, 40 00:01:58,690 --> 00:02:01,040 of als je toevallig weten rond wat lijnnummer 41 00:02:01,040 --> 00:02:04,100 het programma begint zich te gedragen een beetje raar, 42 00:02:04,100 --> 00:02:06,370 U kunt een lijn typen nummer daar ook. 43 00:02:06,370 --> 00:02:09,660 Wat b, of breken, doet is het mogelijk het programma 44 00:02:09,660 --> 00:02:13,270 te lopen tot een bepaald punt, namelijk de naam van de functie 45 00:02:13,270 --> 00:02:15,880 die u opgeeft of de lijn nummer dat u opgeeft. 46 00:02:15,880 --> 00:02:18,590 >> En op dat punt, zal de uitvoering te bevriezen. 47 00:02:18,590 --> 00:02:21,670 Dit is echt een goede zaak, want zodra uitvoering is bevroren, 48 00:02:21,670 --> 00:02:25,214 kun je heel langzaam beginnen te stap door het programma. 49 00:02:25,214 --> 00:02:28,130 Typisch, als je bent geweest running uw programma's, ze zijn vrij kort. 50 00:02:28,130 --> 00:02:31,250 Meestal u dot slash typt wat de naam van het programma wordt, druk op Enter, 51 00:02:31,250 --> 00:02:33,470 en voordat u kunt knipperen, uw programma is al klaar. 52 00:02:33,470 --> 00:02:36,620 Het is niet echt veel tijd om te proberen en erachter te komen wat er mis gaat. 53 00:02:36,620 --> 00:02:40,920 Dus het echt in staat zijn om dingen te vertragen door het instellen van een break point met b, 54 00:02:40,920 --> 00:02:43,040 en dan stapt in. 55 00:02:43,040 --> 00:02:46,169 >> Dan zodra u uw vakantie hebt ingesteld punt, kunt u het programma uitvoert. 56 00:02:46,169 --> 00:02:47,960 En als u hebt command line argumenten, 57 00:02:47,960 --> 00:02:51,610 je ze hier opgeven, niet wanneer je typt GDB programma naam. 58 00:02:51,610 --> 00:02:55,980 U specificeert de opdrachtregel argumenten door het nemen van r, of lopen, 59 00:02:55,980 --> 00:03:00,270 en dan argumenten wat command line je nodig hebt binnenkant van uw programma. 60 00:03:00,270 --> 00:03:03,510 Er zijn een aantal andere echt belangrijke en nuttige commando 61 00:03:03,510 --> 00:03:04,970 binnenkant van het BBP milieu. 62 00:03:04,970 --> 00:03:07,540 Dus laat me gewoon snel gaan over een aantal van hen. 63 00:03:07,540 --> 00:03:11,320 >> De eerste is n, die kort voor de volgende, en je kunt typen naast in plaats van n, 64 00:03:11,320 --> 00:03:12,304 beide zou werken. 65 00:03:12,304 --> 00:03:13,470 En het is gewoon de afkorting. 66 00:03:13,470 --> 00:03:17,540 En zoals je hebt waarschijnlijk al gekregen gebruikt, in staat om dingen te typen 67 00:03:17,540 --> 00:03:20,520 korter is algemeen beter. 68 00:03:20,520 --> 00:03:24,100 En wat het zal doen, is het zal stap voor een blok van code. 69 00:03:24,100 --> 00:03:26,170 Dus het zal vooruit totdat er een functie aan te roepen. 70 00:03:26,170 --> 00:03:28,350 En dan in plaats van duiken in die functie 71 00:03:28,350 --> 00:03:33,130 en gaan door al die functies code, zal het alleen maar hebben de functie. 72 00:03:33,130 --> 00:03:34,400 >> De functie zal worden genoemd. 73 00:03:34,400 --> 00:03:35,733 Het zal doen wat haar werk is. 74 00:03:35,733 --> 00:03:38,870 Het zal een waarde terugkeren de functie die het genoemd. 75 00:03:38,870 --> 00:03:42,490 En dan zul je op het bewegen volgende regel van die roeping functie. 76 00:03:42,490 --> 00:03:44,555 Als u wilt stap binnenzijde van de functie, 77 00:03:44,555 --> 00:03:46,430 in plaats van alleen het hebben het uit te voeren, met name 78 00:03:46,430 --> 00:03:50,004 als je denkt dat het probleem kunnen binnen van die functie liggen, 79 00:03:50,004 --> 00:03:52,670 je kan natuurlijk, set een break punt binnenzijde van die functie. 80 00:03:52,670 --> 00:03:57,820 Of als u al gebruik maakt, kunt u s gebruiken om naar een regel code stap. 81 00:03:57,820 --> 00:04:01,170 >> Zo zal deze stap in en duik in functies, 82 00:04:01,170 --> 00:04:04,750 in plaats van alleen maar de uit te voeren en verder op de functie 83 00:04:04,750 --> 00:04:07,380 dat je in voor het debuggen. 84 00:04:07,380 --> 00:04:09,870 Als je ooit wilt weten de waarde van een variabele, 85 00:04:09,870 --> 00:04:12,507 u kunt typen p, of Afdrukken, en dan de naam van de variabele. 86 00:04:12,507 --> 00:04:15,090 En dat zal uitprinten voor u, binnenzijde van de GDB milieu, 87 00:04:15,090 --> 00:04:19,110 de naam van de variabele, die je-- excuus mij-- de waarde van de variabele 88 00:04:19,110 --> 00:04:20,064 die je hebt genoemd. 89 00:04:20,064 --> 00:04:23,230 Als u wilt dat de waarden van elke weten lokale variabele bereikbaar vanwaar 90 00:04:23,230 --> 00:04:25,970 u op dit moment in programma, typt u info locals. 91 00:04:25,970 --> 00:04:28,332 Het is een stuk sneller dan typen p en dan wat dan ook, 92 00:04:28,332 --> 00:04:30,540 listing alle van de variabelen die u weet bestaan. 93 00:04:30,540 --> 00:04:34,370 U kunt typen info locals, en het zal er alles uit te printen voor u. 94 00:04:34,370 --> 00:04:37,770 Next up is BT, dat is kort voor Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nu algemeen met name in het begin van CS50, 96 00:04:41,680 --> 00:04:44,450 je zult niet echt gelegenheid BT, of Back Trace gebruiken, 97 00:04:44,450 --> 00:04:47,860 omdat je niet met functies dat noemen andere functies. 98 00:04:47,860 --> 00:04:50,450 >> Je zou een belangrijke oproep hebben functie, maar dat is waarschijnlijk het. 99 00:04:50,450 --> 00:04:53,199 Je hoeft niet dat andere functie een andere functie, roepen die 100 00:04:53,199 --> 00:04:54,880 roept andere functie, enzovoorts. 101 00:04:54,880 --> 00:04:57,550 Maar als uw programma's krijgen meer complex, met name 102 00:04:57,550 --> 00:05:00,290 wanneer je begint te werken met recursie, rug spoor 103 00:05:00,290 --> 00:05:05,150 kan een heel nuttige manier om u te laten zijn soort nog wat context want waar 104 00:05:05,150 --> 00:05:06,460 Ik ben in mijn programma. 105 00:05:06,460 --> 00:05:10,590 Dus zeggen dat je hebt je code geschreven, en je weet dat de belangrijkste noemt een functie 106 00:05:10,590 --> 00:05:14,720 f, waarbij een functieaanroepen G, die een functie h noemt. 107 00:05:14,720 --> 00:05:17,650 Dus we hebben meerdere lagen nestelende hier aan de hand. 108 00:05:17,650 --> 00:05:19,440 >> Als je binnen bent van GDB uw omgeving, 109 00:05:19,440 --> 00:05:21,640 en je weet dat je van binnen van h, maar je vergeet 110 00:05:21,640 --> 00:05:27,210 over wat je moet waar u zijn-- u kunt typen bt of rug spoor, 111 00:05:27,210 --> 00:05:32,370 en het zal uitprinten h, g, f belangrijkste, naast enkele andere informatie, die 112 00:05:32,370 --> 00:05:35,984 geeft u een aanwijzing dat, OK belangrijkste genaamd f, f genoemd g, g zogenaamde h, 113 00:05:35,984 --> 00:05:37,900 en dat is waar ik momenteel ben in mijn programma. 114 00:05:37,900 --> 00:05:41,380 Dus het kan echt nuttig, vooral omdat de cryptische-heid van GDB 115 00:05:41,380 --> 00:05:45,667 wordt een beetje overweldigend, om precies te weten waar dingen zijn. 116 00:05:45,667 --> 00:05:48,500 Tot slot, wanneer het programma wordt gedaan, of als je klaar bent debuggen 117 00:05:48,500 --> 00:05:50,125 en je wilt om weg te stappen de GDB milieu 118 00:05:50,125 --> 00:05:51,940 het helpt om te weten hoe om uit te halen. 119 00:05:51,940 --> 00:05:55,500 U kunt typen q, of Stoppen, om eruit te komen. 120 00:05:55,500 --> 00:05:59,220 Nu, voordat video van vandaag Ik een buggy programma voorbereid 121 00:05:59,220 --> 00:06:03,900 genaamd buggy1, die ik samengesteld uit een bestand bekend als buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Zoals je zou verwachten, dit programma in feite buggy. 123 00:06:06,500 --> 00:06:08,990 Er iets mis gaat wanneer ik probeer en voer het uit. 124 00:06:08,990 --> 00:06:13,014 Nu, helaas, ik per ongeluk verwijderde mijn buggy1.c bestand, 125 00:06:13,014 --> 00:06:15,930 dus om voor mij om erachter te komen Wat is er mis gaat met dit programma, 126 00:06:15,930 --> 00:06:18,770 Ik ga moeten gebruiken GDB soort blind, proberen 127 00:06:18,770 --> 00:06:22,372 om te navigeren door middel van dit programma erachter te komen wat er mis gaat. 128 00:06:22,372 --> 00:06:24,580 Maar met alleen de gereedschappen we hebben al geleerd over, 129 00:06:24,580 --> 00:06:27,700 kunnen we vrij veel figuur precies wat het is. 130 00:06:27,700 --> 00:06:30,740 Dus laten we het hoofd naar CS50 IDE en een kijkje nemen. 131 00:06:30,740 --> 00:06:33,155 OK, dus we zijn hier in mijn CS50 IDE milieu, 132 00:06:33,155 --> 00:06:35,697 en ik zal in een klein beetje te zoomen dus je kan een beetje meer te zien. 133 00:06:35,697 --> 00:06:38,530 In mijn terminal venster, als ik de lijst de inhoud van mijn huidige directeur 134 00:06:38,530 --> 00:06:41,250 met ls, zullen we zien dat ik hebben een paar van de bronbestanden 135 00:06:41,250 --> 00:06:44,982 Hier, inclusief eerder besproken buggy1. 136 00:06:44,982 --> 00:06:46,940 Wat er precies gaat aan wanneer Ik probeer en lopen buggy1. 137 00:06:46,940 --> 00:06:47,773 Nou laten we eens kijken. 138 00:06:47,773 --> 00:06:52,510 Ik typ dot slash, buggy, en ik druk op Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentatie fouten. 140 00:06:53,670 --> 00:06:55,000 Dat is niet goed. 141 00:06:55,000 --> 00:06:57,180 Misschien herinner je je, een segmentation fault doorgaans 142 00:06:57,180 --> 00:07:01,540 ontstaat wanneer we toegang tot het geheugen dat we hem niet mogen aanraken. 143 00:07:01,540 --> 00:07:03,820 We hebben een of andere manier bereikt buiten de grenzen 144 00:07:03,820 --> 00:07:05,995 van wat het programma, de compiler, heeft ons. 145 00:07:05,995 --> 00:07:08,310 En zo al dat is een aanwijzing in de toolbox te houden 146 00:07:08,310 --> 00:07:10,660 als we beginnen het debugging proces. 147 00:07:10,660 --> 00:07:13,620 Iets is gegaan hier een beetje verkeerd. 148 00:07:13,620 --> 00:07:15,935 >> Oké, dus laten we beginnen de GDB milieu 149 00:07:15,935 --> 00:07:19,030 en kijken of we kunnen achterhalen wat precies het probleem is. 150 00:07:19,030 --> 00:07:21,674 Ik ga mijn scherm te wissen, en ik ga om te typen GDB 151 00:07:21,674 --> 00:07:24,340 nogmaals, om het GDB milieu terechtkomen, en de naam van het programma 152 00:07:24,340 --> 00:07:27,450 dat ik wil debuggen, buggy1. 153 00:07:27,450 --> 00:07:30,182 We krijgen een klein bericht, lezen symbolen uit buggy1, gedaan. 154 00:07:30,182 --> 00:07:32,390 Alle dat betekent is dat getrokken samen alle van de code, 155 00:07:32,390 --> 00:07:35,570 en nu is het al in geladen GDB, en het is klaar om te gaan. 156 00:07:35,570 --> 00:07:37,140 >> Nu, wat wil ik doen? 157 00:07:37,140 --> 00:07:39,130 Herinnert u zich wat de eerste stap typisch 158 00:07:39,130 --> 00:07:42,540 nadat ik ben binnenkant van deze omgeving? 159 00:07:42,540 --> 00:07:44,540 Hopelijk zei dat je instellen een breekpunt, want 160 00:07:44,540 --> 00:07:46,240 in feite dat is wat ik wil doen. 161 00:07:46,240 --> 00:07:47,990 Nu, ik heb niet de broncode voor deze 162 00:07:47,990 --> 00:07:50,948 voor me, dat is waarschijnlijk niet de typische use case, door de manier waarop. 163 00:07:50,948 --> 00:07:52,055 Je hebt waarschijnlijk wel. 164 00:07:52,055 --> 00:07:52,680 Dus dat is goed. 165 00:07:52,680 --> 00:07:55,790 Maar ervan uitgaande dat je dat niet doet, wat is de ene functie die u weet 166 00:07:55,790 --> 00:07:58,880 bestaat in ieder C-programma? 167 00:07:58,880 --> 00:08:04,420 Het maakt niet uit hoe groot of hoe ingewikkeld is deze functie zeker bestaat. 168 00:08:04,420 --> 00:08:05,440 Belangrijkste, toch? 169 00:08:05,440 --> 00:08:08,870 >> Zo niet alles, we kunnen set een breekpunt in de belangrijkste. 170 00:08:08,870 --> 00:08:12,200 En nogmaals, kon ik typ breken belangrijkste, in plaats van b. 171 00:08:12,200 --> 00:08:14,650 En als je nieuwsgierig bent, als je ooit uittypen een lange opdracht 172 00:08:14,650 --> 00:08:16,800 en dan beseffen dat je getypt de verkeerde dingen, 173 00:08:16,800 --> 00:08:18,770 en u wilt zich te ontdoen alle zoals ik net deed, 174 00:08:18,770 --> 00:08:22,029 U kunt controle nemen, dat zal verwijder alles en brengen u terug 175 00:08:22,029 --> 00:08:23,570 aan het begin van de cursorlijnen. 176 00:08:23,570 --> 00:08:26,569 Een stuk sneller dan alleen houdt u de verwijderen, of slaan het een stelletje keer 177 00:08:26,569 --> 00:08:27,080 voorbij. 178 00:08:27,080 --> 00:08:28,740 >> Dus we een break point ingesteld op hoofd. 179 00:08:28,740 --> 00:08:32,970 En zoals je kunt zien, het zegt we hebben set een breekpunt in file buggy1.c, 180 00:08:32,970 --> 00:08:36,330 en blijkbaar de eerste lijn van de code van de belangrijkste lijn is zeven. 181 00:08:36,330 --> 00:08:38,080 Nogmaals, we hebben niet het bronbestand hier 182 00:08:38,080 --> 00:08:40,429 maar ik ga ervan uit dat het vertel me de waarheid. 183 00:08:40,429 --> 00:08:44,510 En dan, ik probeer gewoon en start het programma, r. 184 00:08:44,510 --> 00:08:45,360 Beginnend programma. 185 00:08:45,360 --> 00:08:48,160 Oké, dus dit bericht is een beetje cryptisch. 186 00:08:48,160 --> 00:08:50,160 Maar eigenlijk wat is hier gebeurt is het is gewoon 187 00:08:50,160 --> 00:08:53,350 me te vertellen Ik heb mijn pauze hit punt, breekpunt nummer 1. 188 00:08:53,350 --> 00:08:55,877 >> En dan, dat regel code, Bestand of map bestaat niet. 189 00:08:55,877 --> 00:08:57,710 De enige reden dat Ik zie dat bericht 190 00:08:57,710 --> 00:09:00,800 is omdat ik per ongeluk verwijderde mijn buggy.c bestand. 191 00:09:00,800 --> 00:09:04,050 Als mijn buggy1.c dossier bestond in de huidige directory, 192 00:09:04,050 --> 00:09:06,920 die lijn daar zou eigenlijk mij vertellen wat de regel code 193 00:09:06,920 --> 00:09:08,214 letterlijk leest. 194 00:09:08,214 --> 00:09:09,380 Helaas, ik verwijderde het. 195 00:09:09,380 --> 00:09:14,790 We zullen moeten soort navigeren door deze een beetje meer blind. 196 00:09:14,790 --> 00:09:17,330 >> OK, dus laten we eens kijken, wat wil ik hier te doen? 197 00:09:17,330 --> 00:09:21,770 Nou, ik zou graag willen weten wat de lokale variabelen misschien zijn beschikbaar voor mij. 198 00:09:21,770 --> 00:09:23,570 Ik heb mijn programma begon. 199 00:09:23,570 --> 00:09:28,515 Laten we eens kijken wat er zou kunnen zijn al geïnitialiseerd voor ons. 200 00:09:28,515 --> 00:09:31,430 Ik typ Info lokale bevolking, geen locals. 201 00:09:31,430 --> 00:09:33,960 Oké, zodat niet geef me een heleboel informatie. 202 00:09:33,960 --> 00:09:37,600 Ik zou kunnen proberen en afdrukken van een variabele, maar ik ken geen namen van variabelen. 203 00:09:37,600 --> 00:09:39,930 Ik kon een spoor terug te proberen, maar ik ben binnenkant van de belangrijkste, 204 00:09:39,930 --> 00:09:43,710 dus ik weet dat ik niet gemaakt een andere functie oproep nu. 205 00:09:43,710 --> 00:09:47,710 >> Zo ziet eruit als mijn enige opties zijn te gebruiken n of zo en beginnen om te duiken in. 206 00:09:47,710 --> 00:09:49,630 Ik ga gebruiken n. 207 00:09:49,630 --> 00:09:51,180 Dus ik typ n. 208 00:09:51,180 --> 00:09:53,060 Oh mijn god, wat is hier aan de hand. 209 00:09:53,060 --> 00:09:56,260 Programma ontvangen signalen, SIGSEGV segmentation fault, 210 00:09:56,260 --> 00:09:57,880 en dan een hele hoop dingen. 211 00:09:57,880 --> 00:09:58,880 Ik ben al overweldigd. 212 00:09:58,880 --> 00:10:00,980 Nou, er is eigenlijk een hier veel te leren. 213 00:10:00,980 --> 00:10:02,520 Dus wat heeft dit ons vertellen? 214 00:10:02,520 --> 00:10:09,180 Wat het ons vertelt is, is dit programma gaat, maar heeft nog niet, seg fout. 215 00:10:09,180 --> 00:10:12,550 En in het bijzonder, ik ga in nog verder hier om in te zoomen, 216 00:10:12,550 --> 00:10:18,980 het is op het punt om de schuld SEG over iets genaamd strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nu kunnen we niet hebben besproken Deze functie uitgebreid. 218 00:10:22,705 --> 00:10:25,580 Maar het is-- want we gaan niet om te praten over elke functie 219 00:10:25,580 --> 00:10:28,610 bestaat in de C standaard library-- maar ze zijn allemaal voor u beschikbaar, 220 00:10:28,610 --> 00:10:32,110 vooral als je een te nemen kijk naar reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 En strcmp is een echt krachtig functie die binnenin bestaat 222 00:10:35,000 --> 00:10:38,070 van de string.h header file, die een header 223 00:10:38,070 --> 00:10:41,970 bestand dat is gewijd aan functies die werken met en manipuleren van strings. 224 00:10:41,970 --> 00:10:49,830 >> En in het bijzonder, wat doet is strcmp vergelijkt de waarden van twee snaren. 225 00:10:49,830 --> 00:10:54,160 Dus ik ben op het punt om de schuld segmentatie op een oproep tot strcmp het lijkt. 226 00:10:54,160 --> 00:10:58,530 Ik raakte n, en in feite krijg ik het bericht, programma beëindigd met signaal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentatie fout. Dus nu Ik heb eigenlijk seg verweten, 228 00:11:01,370 --> 00:11:06,479 en mijn programma heeft vrij veel effectiever opgegeven. 229 00:11:06,479 --> 00:11:07,770 Dit is het einde van het programma. 230 00:11:07,770 --> 00:11:10,370 Het brak, het neerstortte. 231 00:11:10,370 --> 00:11:14,740 Dus was niet veel, maar ik eigenlijk deed leren nogal een beetje 232 00:11:14,740 --> 00:11:16,747 van deze weinig ervaring. 233 00:11:16,747 --> 00:11:17,580 Wat heb ik geleerd? 234 00:11:17,580 --> 00:11:22,020 Nou, mijn programma crasht vrijwel onmiddellijk. 235 00:11:22,020 --> 00:11:26,300 Mijn programma crasht op Een oproep aan strcmp, maar ik 236 00:11:26,300 --> 00:11:30,560 geen enkele lokale variabelen niet in mijn programma op het moment dat het crasht. 237 00:11:30,560 --> 00:11:37,320 Dus wat string of strings, zou ik misschien te vergelijken. 238 00:11:37,320 --> 00:11:42,140 Als ik geen lokale hebben variabelen, zou je 239 00:11:42,140 --> 00:11:45,520 vermoeden dat ik daar have-- misschien is een globale variabele, die waar kan zijn. 240 00:11:45,520 --> 00:11:47,670 >> Maar over het algemeen lijkt alsof ik het vergelijken 241 00:11:47,670 --> 00:11:52,070 iets dat niet bestaat. 242 00:11:52,070 --> 00:11:54,130 Dus laten we onderzoeken die een beetje verder. 243 00:11:54,130 --> 00:11:55,120 Dus ik ga mijn scherm te wissen. 244 00:11:55,120 --> 00:11:57,536 Ik ga om te stoppen uit de GDB omgeving voor een tweede. 245 00:11:57,536 --> 00:12:01,300 En ik ben denken, OK, dus er is geen lokale variabelen in mijn programma. 246 00:12:01,300 --> 00:12:06,444 Ik vraag me af of misschien ben ik verondersteld om te passeren in een string als een command line argument. 247 00:12:06,444 --> 00:12:07,610 Dus laten we dit uit te testen. 248 00:12:07,610 --> 00:12:09,020 Ik heb dit niet eerder gedaan. 249 00:12:09,020 --> 00:12:14,244 >> Eens kijken of misschien als ik dit programma uit te voeren met een command line argument het werkt. 250 00:12:14,244 --> 00:12:16,140 Huh, geen segmentation fault daar. 251 00:12:16,140 --> 00:12:17,870 Het zei me alleen dat ik dacht dat het uit. 252 00:12:17,870 --> 00:12:19,170 Dus misschien is dat hier de oplossing. 253 00:12:19,170 --> 00:12:27,560 En inderdaad, als ik ga terug en kijk naar de werkelijke broncode voor buggy1.c, 254 00:12:27,560 --> 00:12:31,180 het lijkt alsof wat ik doe is Ik ben het maken van een oproep aan strcmp zonder 255 00:12:31,180 --> 00:12:34,010 nagaan of inderdaad argv [1] bestaat. 256 00:12:34,010 --> 00:12:36,730 Dit is eigenlijk de broncode voor buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Dus wat ik echt nodig om doe hier mijn programma vast te stellen, 258 00:12:38,855 --> 00:12:40,835 veronderstelling dat ik de file voor me, is 259 00:12:40,835 --> 00:12:44,740 om voeg een cheque te maken zorgen dat argc gelijk is aan 2. 260 00:12:44,740 --> 00:12:47,780 Dus dit voorbeeld, opnieuw, zoals ik al zei, is een beetje gekunsteld, toch? 261 00:12:47,780 --> 00:12:49,840 Je over het algemeen niet van plan om per ongeluk uw broncode verwijderen 262 00:12:49,840 --> 00:12:51,820 en dan te proberen en debuggen van het programma. 263 00:12:51,820 --> 00:12:53,120 Maar hopelijk, het gaf u een illustratie 264 00:12:53,120 --> 00:12:55,120 van de dingen die je zou kunnen denken over 265 00:12:55,120 --> 00:12:56,610 als je het debuggen van uw programma. 266 00:12:56,610 --> 00:12:58,760 >> Wat is de stand van zaken hier? 267 00:12:58,760 --> 00:13:00,510 Welke variabelen kan ik moeten toegankelijk zijn voor me? 268 00:13:00,510 --> 00:13:03,600 Waar precies is mijn programma crashen, wat lijn, 269 00:13:03,600 --> 00:13:05,240 over wat oproep om welke functie? 270 00:13:05,240 --> 00:13:06,952 Wat voor aanwijzingen heeft dat mij? 271 00:13:06,952 --> 00:13:08,910 En dat is precies de soort mentaliteit dat je 272 00:13:08,910 --> 00:13:12,820 moet krijgen in als je na te denken over het debuggen van uw programma's. 273 00:13:12,820 --> 00:13:13,820 >> Ik ben Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Dit is CS50. 275 00:13:16,140 --> 00:15:08,642