1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Greit GDB. 3 00:00:06,830 --> 00:00:08,480 Hva er det egentlig? 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 verktøy som vi kan bruke til å hjelpe oss feilsøke våre programmer, 6 00:00:15,040 --> 00:00:18,210 eller finne ut hvor ting er går galt i våre programmer. 7 00:00:18,210 --> 00:00:22,590 GDB er utrolig kraftig, men utgang og vekselvirkning med den 8 00:00:22,590 --> 00:00:23,830 kan være litt kryptisk. 9 00:00:23,830 --> 00:00:28,210 Det er vanligvis et kommandolinjeverktøy, og det kan kaste en masse meldinger på deg. 10 00:00:28,210 --> 00:00:31,144 Og det kan slags vanskelig å analysere nøyaktig hva som skjer. 11 00:00:31,144 --> 00:00:33,560 Heldigvis har vi tatt skritt å løse dette problemet for deg 12 00:00:33,560 --> 00:00:36,281 mens du arbeider gjennom CS50. 13 00:00:36,281 --> 00:00:39,030 Hvis du ikke bruker det grafiske debugger, som min kollega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse har snakket ganske litt om i en video som 15 00:00:41,570 --> 00:00:44,740 bør være over her akkurat nå, må du kanskje 16 00:00:44,740 --> 00:00:48,270 å bruke disse kommandolinje verktøy å jobbe med GDB. 17 00:00:48,270 --> 00:00:51,250 Hvis du jobber i CS50 IDE, trenger du ikke å gjøre dette. 18 00:00:51,250 --> 00:00:53,550 Men hvis du ikke er arbeider i CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 kanskje bruker en versjon av CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 eller en annen Linux operativsystem system med GDB installert på den, 21 00:00:58,860 --> 00:01:00,980 du må kanskje bruke disse kommandolinjeverktøy. 22 00:01:00,980 --> 00:01:02,860 >> Og siden du kanskje må gjøre det, det er 23 00:01:02,860 --> 00:01:06,280 nyttig bare å forstå hvordan GDB arbeider fra kommandolinjen. 24 00:01:06,280 --> 00:01:09,650 Men igjen, hvis du er bruke CS50 IDE, du 25 00:01:09,650 --> 00:01:15,400 kan bruke det grafiske debugger som er bygd inn i IDE. 26 00:01:15,400 --> 00:01:18,750 Så for å få ting i gang med GDB, for å starte feilsøking 27 00:01:18,750 --> 00:01:21,220 Prosessen med en spesiell program, trenger alt du gjør 28 00:01:21,220 --> 00:01:23,810 er å skrive GDB fulgt av programnavnet. 29 00:01:23,810 --> 00:01:28,620 Så for eksempel hvis programmet er hei, ville du skriver GDB hei. 30 00:01:28,620 --> 00:01:31,210 >> Når du gjør det, du kommer å trekke opp GDB miljøet. 31 00:01:31,210 --> 00:01:33,800 Ditt spørsmål ville endre, og stedet for å være hva det vanligvis 32 00:01:33,800 --> 00:01:35,841 er når du skriver ting Ved lede line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- alle dine typiske Linux-kommandoer, spør din 34 00:01:38,115 --> 00:01:42,200 vil endre til, sannsynligvis, noe som parentes GDB parentes. 35 00:01:42,200 --> 00:01:46,630 Det er din nye GDB teksten, fordi du er inne på GDB miljø. 36 00:01:46,630 --> 00:01:49,830 Når du er inne i et slikt miljø, det er to viktige kommandoer 37 00:01:49,830 --> 00:01:52,290 at du vil sannsynligvis bruke i følgende rekkefølge. 38 00:01:52,290 --> 00:01:55,200 >> Den første er b, der er en forkortelse for pause. 39 00:01:55,200 --> 00:01:58,690 Og når du skriver b, du vanligvis Skriv inn navnet på en funksjon, 40 00:01:58,690 --> 00:02:01,040 eller hvis du tilfeldigvis vite rundt hva linjenummer 41 00:02:01,040 --> 00:02:04,100 programmet starter å oppføre seg litt rart, 42 00:02:04,100 --> 00:02:06,370 du kan skrive en linje nummeret der også. 43 00:02:06,370 --> 00:02:09,660 Hva b, eller pause, gjør er det tillater programmet 44 00:02:09,660 --> 00:02:13,270 å kjøre frem til et visst punkt, nemlig navnet på funksjonen 45 00:02:13,270 --> 00:02:15,880 som du angir eller linjen nummeret du spesifiserer. 46 00:02:15,880 --> 00:02:18,590 >> Og på det punktet, det vil fryse utførelse. 47 00:02:18,590 --> 00:02:21,670 Dette er en veldig god ting, fordi når henrettelsen har vært frosset, 48 00:02:21,670 --> 00:02:25,214 du kan begynne å veldig sakte gå gjennom programmet. 49 00:02:25,214 --> 00:02:28,130 Vanligvis, hvis du har vært i gang programmene dine, de er ganske kort. 50 00:02:28,130 --> 00:02:31,250 Vanligvis skriver du dot slash uansett navnet på programmet, trykk Enter, 51 00:02:31,250 --> 00:02:33,470 og før du kan blinke, din Programmet er allerede ferdig. 52 00:02:33,470 --> 00:02:36,620 Det er egentlig ikke mye tid til å prøve og finne ut hva som går galt. 53 00:02:36,620 --> 00:02:40,920 Så det egentlig å være i stand til å bremse ting ned ved å sette en pause poeng med b, 54 00:02:40,920 --> 00:02:43,040 og deretter stepping. 55 00:02:43,040 --> 00:02:46,169 >> Så når du har satt inn pause punktet, kan du kjøre programmet. 56 00:02:46,169 --> 00:02:47,960 Og hvis du har noen kommandolinjeargumenter, 57 00:02:47,960 --> 00:02:51,610 du angir dem her, ikke når du skriver GDB programmet navn. 58 00:02:51,610 --> 00:02:55,980 Du angir alle kommandolinjen argumenter ved å ta r, eller løpe, 59 00:02:55,980 --> 00:03:00,270 og deretter hva kommandolinjeargumentene du trenger inne i programmet. 60 00:03:00,270 --> 00:03:03,510 Det er en rekke andre virkelig viktige og nyttige kommandoer 61 00:03:03,510 --> 00:03:04,970 Innsiden av BNP miljø. 62 00:03:04,970 --> 00:03:07,540 Så la meg bare raskt gå over noen av dem. 63 00:03:07,540 --> 00:03:11,320 >> Den første er n, som er en forkortelse for neste, og du kan skrive neste stedet for n, 64 00:03:11,320 --> 00:03:12,304 begge ville fungere. 65 00:03:12,304 --> 00:03:13,470 Og det er bare stenografi. 66 00:03:13,470 --> 00:03:17,540 Og som du sikkert har allerede fått vant til, å være i stand til å 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 hva det vil gjøre det vil gå frem en blokk med kode. 69 00:03:24,100 --> 00:03:26,170 Så det vil gå videre til en funksjon. 70 00:03:26,170 --> 00:03:28,350 Og så i stedet for dykke inn i den funksjonen 71 00:03:28,350 --> 00:03:33,130 og gå gjennom alle som fungerer kode, vil det bare ha funksjonen. 72 00:03:33,130 --> 00:03:34,400 >> Funksjonen vil bli kalt. 73 00:03:34,400 --> 00:03:35,733 Det vil gjøre alt arbeidet er. 74 00:03:35,733 --> 00:03:38,870 Den vil vende tilbake til en verdi den funksjon som kalte den inn. 75 00:03:38,870 --> 00:03:42,490 Og da vil du gå videre til neste linje som ringer funksjonen. 76 00:03:42,490 --> 00:03:44,555 Hvis du ønsker å gå Innsiden av funksjon, 77 00:03:44,555 --> 00:03:46,430 i stedet for bare å ha det utføre, spesielt 78 00:03:46,430 --> 00:03:50,004 hvis du tror at problemet kan ligge inne i den funksjonen, 79 00:03:50,004 --> 00:03:52,670 du kan selvfølgelig sette en pause peke på innsiden av den funksjonen. 80 00:03:52,670 --> 00:03:57,820 Eller hvis du allerede er i gang, kan du bruke s å gå frem en linje med kode. 81 00:03:57,820 --> 00:04:01,170 >> Så dette vil gå inn og dykke inn i funksjoner, 82 00:04:01,170 --> 00:04:04,750 i stedet for å bare ha henrette og fortsetter i funksjonen 83 00:04:04,750 --> 00:04:07,380 at du er i for debugging. 84 00:04:07,380 --> 00:04:09,870 Hvis du noen gang ønsker å vite verdien av en variabel, 85 00:04:09,870 --> 00:04:12,507 du kan skrive p, eller Print, og deretter variabelnavnet. 86 00:04:12,507 --> 00:04:15,090 Og som vil skrive ut til deg, innsiden av GDB miljø, 87 00:04:15,090 --> 00:04:19,110 navnet på den variable, som you-- unnskylde me-- verdien av variabelen 88 00:04:19,110 --> 00:04:20,064 at du har navngitt. 89 00:04:20,064 --> 00:04:23,230 Hvis du ønsker å vite verdiene av hvert lokal variabel tilgjengelig fra hvor 90 00:04:23,230 --> 00:04:25,970 du er nå i program, kan du skrive info lokalbefolkningen. 91 00:04:25,970 --> 00:04:28,332 Det er mye raskere enn skrive p og deretter hva, 92 00:04:28,332 --> 00:04:30,540 liste ut alle variabler som du vet finnes. 93 00:04:30,540 --> 00:04:34,370 Du kan skrive inn info lokalbefolkningen, og det vil skrive ut alt for deg. 94 00:04:34,370 --> 00:04:37,770 Neste opp er bt, som er kort for Back Trace. 95 00:04:37,770 --> 00:04:41,680 Nå, generelt, spesielt tidlig i CS50, 96 00:04:41,680 --> 00:04:44,450 du vil egentlig ikke ha anledning å bruke bt, eller Back Trace, 97 00:04:44,450 --> 00:04:47,860 fordi du ikke har det funksjoner som kaller andre funksjoner. 98 00:04:47,860 --> 00:04:50,450 >> Du har kanskje viktigste samtale en funksjon, men det er sannsynligvis det. 99 00:04:50,450 --> 00:04:53,199 Du har ikke den andre funksjonen ringer en annen funksjon, hvilken 100 00:04:53,199 --> 00:04:54,880 kaller en annen funksjon, og så videre. 101 00:04:54,880 --> 00:04:57,550 Men som programmene dine få mer kompleks, og særlig 102 00:04:57,550 --> 00:05:00,290 når du begynner å arbeide med rekursjon, tilbake spor 103 00:05:00,290 --> 00:05:05,150 kan være en veldig nyttig måte å fortelle deg slags få noen sammenheng for hvor 104 00:05:05,150 --> 00:05:06,460 Jeg er i mitt program. 105 00:05:06,460 --> 00:05:10,590 Så sier du har skrevet koden, og du vet at hoved kaller en funksjon 106 00:05:10,590 --> 00:05:14,720 f, som kaller en funksjon g, noe som krever en funksjon h. 107 00:05:14,720 --> 00:05:17,650 Så vi har flere lag av hekkende skjer her. 108 00:05:17,650 --> 00:05:19,440 >> Hvis du er inne i din GDB miljø, 109 00:05:19,440 --> 00:05:21,640 og du vet inni av h, men du glemmer 110 00:05:21,640 --> 00:05:27,210 om det som fikk deg til hvor du are-- du kan skrive bt, eller tilbake spor, 111 00:05:27,210 --> 00:05:32,370 og det vil skrive ut h, g, f viktigste, sammen med annen informasjon, som 112 00:05:32,370 --> 00:05:35,984 gir deg en anelse om at, OK hoved kalt f, f kalt g, g kalt h, 113 00:05:35,984 --> 00:05:37,900 og det er der jeg for tiden er i mitt program. 114 00:05:37,900 --> 00:05:41,380 Så det kan være veldig nyttig, særlig ettersom det kryptiske-ness of GDB 115 00:05:41,380 --> 00:05:45,667 blir litt overveldende, til finne ut nøyaktig hvor ting er. 116 00:05:45,667 --> 00:05:48,500 Til slutt, når programmet er ferdig, eller når du er ferdig feilsøkt 117 00:05:48,500 --> 00:05:50,125 og du ønsker å gå bort fra GDB miljø, 118 00:05:50,125 --> 00:05:51,940 det hjelper å vite hvordan man skal komme seg ut av det. 119 00:05:51,940 --> 00:05:55,500 Du kan skrive q, eller Avslutt for å komme seg ut. 120 00:05:55,500 --> 00:05:59,220 Nå, før dagens video Jeg utarbeidet en buggy program 121 00:05:59,220 --> 00:06:03,900 kalt buggy1, som jeg kompilert fra en fil kalt buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Som du kanskje forventer, dette Programmet er faktisk buggy. 123 00:06:06,500 --> 00:06:08,990 Noe går galt når jeg prøver og kjøre den. 124 00:06:08,990 --> 00:06:13,014 Nå, dessverre, jeg uforvarende slettet min buggy1.c fil, 125 00:06:13,014 --> 00:06:15,930 så i orden for meg å finne ut hva som går galt med dette programmet, 126 00:06:15,930 --> 00:06:18,770 Jeg er nødt til å bruke GDB slags blindt, prøver 127 00:06:18,770 --> 00:06:22,372 å navigere gjennom dette programmet til finne ut nøyaktig hva som går galt. 128 00:06:22,372 --> 00:06:24,580 Men ved hjelp av bare de verktøyene vi allerede har lært om, 129 00:06:24,580 --> 00:06:27,700 Vi kan ganske mye tall ut nøyaktig hva det er. 130 00:06:27,700 --> 00:06:30,740 Så la oss gå over til CS50 IDE og ta en titt. 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 skal zoome inn litt slik at du kan se litt mer. 133 00:06:35,697 --> 00:06:38,530 I min terminal-vinduet, hvis jeg liste innholdet i min nåvæ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, inkludert tidligere diskutert buggy1. 136 00:06:44,982 --> 00:06:46,940 Hva skjer når Jeg prøver og kjøre buggy1. 137 00:06:46,940 --> 00:06:47,773 Vel la oss finne det ut. 138 00:06:47,773 --> 00:06:52,510 Jeg skriver dot slash, buggy, og jeg trykker på Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentering feil. 140 00:06:53,670 --> 00:06:55,000 Det er ikke bra. 141 00:06:55,000 --> 00:06:57,180 Hvis du husker, en segmentering feil typisk 142 00:06:57,180 --> 00:07:01,540 oppstår når vi tilgang til minnet at vi ikke har lov til å røre. 143 00:07:01,540 --> 00:07:03,820 Vi har liksom nådd utenfor grensene 144 00:07:03,820 --> 00:07:05,995 av det programmet, kompilator, har gitt oss. 145 00:07:05,995 --> 00:07:08,310 Og så allerede at det er en holdepunkt for å holde i verktøykassen 146 00:07:08,310 --> 00:07:10,660 som vi begynner feilsøking prosessen. 147 00:07:10,660 --> 00:07:13,620 Noe har gått litt galt her. 148 00:07:13,620 --> 00:07:15,935 >> Greit, så la oss starte opp GDB miljø 149 00:07:15,935 --> 00:07:19,030 og se om vi kan finne ut hva problemet er. 150 00:07:19,030 --> 00:07:21,674 Jeg kommer til å tømme skjermen min, og jeg kommer til å skrive GDB 151 00:07:21,674 --> 00:07:24,340 igjen, for å gå inn i GDB miljø, og navnet på programmet 152 00:07:24,340 --> 00:07:27,450 som jeg ønsker å feilsøke, buggy1. 153 00:07:27,450 --> 00:07:30,182 Vi får en liten melding, lesing symboler fra buggy1, gjort. 154 00:07:30,182 --> 00:07:32,390 Alt det betyr er det trukket sammen hele koden, 155 00:07:32,390 --> 00:07:35,570 og nå er det blitt lastet inn GDB, og den er klar til å gå. 156 00:07:35,570 --> 00:07:37,140 >> Nå, hva jeg ønsker å gjøre? 157 00:07:37,140 --> 00:07:39,130 Husker du hva den Første skritt er typisk 158 00:07:39,130 --> 00:07:42,540 etter at jeg er inne i dette miljøet? 159 00:07:42,540 --> 00:07:44,540 Forhåpentligvis, sa du stille en pause punkt, fordi 160 00:07:44,540 --> 00:07:46,240 faktisk det er det jeg ønsker å gjøre. 161 00:07:46,240 --> 00:07:47,990 Nå, jeg har ikke det kildekoden for dette 162 00:07:47,990 --> 00:07:50,948 foran meg, som sannsynligvis ikke den typiske brukstilfellet, for øvrig. 163 00:07:50,948 --> 00:07:52,055 Du vil sannsynligvis. 164 00:07:52,055 --> 00:07:52,680 Så det er bra. 165 00:07:52,680 --> 00:07:55,790 Men forutsatt at du ikke gjør det, hva er den ene funksjonen som du vet 166 00:07:55,790 --> 00:07:58,880 eksisterer i hver enkelt C-program? 167 00:07:58,880 --> 00:08:04,420 Uansett hvor stort eller hvor komplisert det er, eksisterer denne funksjonen absolutt. 168 00:08:04,420 --> 00:08:05,440 Main, ikke sant? 169 00:08:05,440 --> 00:08:08,870 >> Så sviktende alt annet, kan vi satt en pause poeng på hoved. 170 00:08:08,870 --> 00:08:12,200 Og igjen, jeg kunne bare skrive bryte viktigste, i stedet for b. 171 00:08:12,200 --> 00:08:14,650 Og hvis du er nysgjerrig, hvis du stadig skriver ut en lang kommando 172 00:08:14,650 --> 00:08:16,800 og deretter innse at du skrev feil ting, 173 00:08:16,800 --> 00:08:18,770 og du ønsker å bli kvitt av alt som jeg nettopp gjorde, 174 00:08:18,770 --> 00:08:22,029 du kan ta kontroll U, som vil slette alt og bringe deg tilbake 175 00:08:22,029 --> 00:08:23,570 til begynnelsen av markørlinjer. 176 00:08:23,570 --> 00:08:26,569 Mye raskere enn bare hold nede slette eller treffer det en haug ganger 177 00:08:26,569 --> 00:08:27,080 over. 178 00:08:27,080 --> 00:08:28,740 >> Så vi får satt en pause poeng på hoved. 179 00:08:28,740 --> 00:08:32,970 Og som du kan se, sier det vi har satt en pause punkt på filen buggy1.c, 180 00:08:32,970 --> 00:08:36,330 og tilsynelatende den første linjen kode for hoved er linje sju. 181 00:08:36,330 --> 00:08:38,080 Igjen, har vi ikke kildefilen her, 182 00:08:38,080 --> 00:08:40,429 men jeg vil anta at det er fortelle meg sannheten. 183 00:08:40,429 --> 00:08:44,510 Og så, jeg prøver bare og kjøre programmet, r. 184 00:08:44,510 --> 00:08:45,360 Starte programmet. 185 00:08:45,360 --> 00:08:48,160 Greit, så denne meldingen er litt kryptisk. 186 00:08:48,160 --> 00:08:50,160 Men i utgangspunktet hva som er skjer her er det bare 187 00:08:50,160 --> 00:08:53,350 forteller meg at jeg har truffet min pause punkt, break punkt nummer en. 188 00:08:53,350 --> 00:08:55,877 >> Og da, at kodelinje, ingen slik fil eller katalog. 189 00:08:55,877 --> 00:08:57,710 Den eneste grunnen til at Jeg ser at meldingen 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 eksisterte i gjeldende katalog, 192 00:09:04,050 --> 00:09:06,920 den linjen der ville faktisk fortell meg hva linje med kode 193 00:09:06,920 --> 00:09:08,214 bokstavelig leser. 194 00:09:08,214 --> 00:09:09,380 Dessverre, slettet jeg det. 195 00:09:09,380 --> 00:09:14,790 Vi er nødt til å slags navigere gjennom denne litt mer blindt. 196 00:09:14,790 --> 00:09:17,330 >> OK, så la oss se, hva ønsker jeg å gjøre her? 197 00:09:17,330 --> 00:09:21,770 Vel, jeg vil gjerne vite hva lokal variabler kanskje er tilgjengelige for meg. 198 00:09:21,770 --> 00:09:23,570 Jeg har begynt mitt program. 199 00:09:23,570 --> 00:09:28,515 La oss se hva som kan være allerede initialisert for oss. 200 00:09:28,515 --> 00:09:31,430 Jeg skriver Info lokalbefolkningen, ingen lokalbefolkningen. 201 00:09:31,430 --> 00:09:33,960 All right, slik at ikke gi meg massevis av informasjon. 202 00:09:33,960 --> 00:09:37,600 Jeg kan prøve og skrive ut en variabel, men jeg vet ikke noen variabelnavn. 203 00:09:37,600 --> 00:09:39,930 Jeg kunne prøve en tilbake spor, men jeg er inne i hoved, 204 00:09:39,930 --> 00:09:43,710 så jeg vet jeg ikke har gjort en annen funksjon samtale akkurat nå. 205 00:09:43,710 --> 00:09:47,710 >> Så ser ut som min eneste alternativene er å bruke n eller så, og begynner å dykke i. 206 00:09:47,710 --> 00:09:49,630 Jeg kommer til å bruke n. 207 00:09:49,630 --> 00:09:51,180 Så jeg skriver n. 208 00:09:51,180 --> 00:09:53,060 Oh my gosh, hva som skjer her. 209 00:09:53,060 --> 00:09:56,260 Programmet fikk signaler, SIGFPE segmentering feil, 210 00:09:56,260 --> 00:09:57,880 og deretter en hel haug med ting. 211 00:09:57,880 --> 00:09:58,880 Jeg er allerede overveldet. 212 00:09:58,880 --> 00:10:00,980 Vel, det er faktisk en mye å lære her. 213 00:10:00,980 --> 00:10:02,520 Så hva forteller dette oss? 214 00:10:02,520 --> 00:10:09,180 Hva det forteller oss er at dette programmet er i ferd med å, men har ikke ennå, SEG feil. 215 00:10:09,180 --> 00:10:12,550 Og spesielt, jeg kommer for å zoome inn enda mer her, 216 00:10:12,550 --> 00:10:18,980 det handler om å SEG feil om noe som kalles strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nå kan vi ikke har diskutert denne funksjonen mye. 218 00:10:22,705 --> 00:10:25,580 Men det er-- fordi vi ikke kommer å snakke om hver funksjon som 219 00:10:25,580 --> 00:10:28,610 finnes i den C-standarden library-- men de er alle tilgjengelige for deg, 220 00:10:28,610 --> 00:10:32,110 spesielt hvis du tar en se på reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Og strcmp er en virkelig kraftig funksjon som eksisterer inne 222 00:10:35,000 --> 00:10:38,070 av string.h header fil, som er en header 223 00:10:38,070 --> 00:10:41,970 fil som er dedikert til funksjoner at arbeidet med og manipulere strenger. 224 00:10:41,970 --> 00:10:49,830 >> Og spesielt hva strcmp gjør er Det sammenligner verdiene av to strenger. 225 00:10:49,830 --> 00:10:54,160 Så jeg er i ferd med å segmentering feil på et kall til strcmp det virker. 226 00:10:54,160 --> 00:10:58,530 Jeg traff n, og faktisk får jeg meldingen, Programmet avsluttes med signal SIGFPE 227 00:10:58,530 --> 00:11:01,370 segmentering feil. Så nå Jeg har faktisk SEG ugyldig, 228 00:11:01,370 --> 00:11:06,479 og mitt program har ganske mye effektivt gitt opp. 229 00:11:06,479 --> 00:11:07,770 Dette er slutten av programmet. 230 00:11:07,770 --> 00:11:10,370 Det brøt sammen, det krasjet. 231 00:11:10,370 --> 00:11:14,740 Så var ikke mye, men jeg faktisk gjorde lære ganske mye 232 00:11:14,740 --> 00:11:16,747 fra denne lille opplevelsen. 233 00:11:16,747 --> 00:11:17,580 Hva har jeg lært? 234 00:11:17,580 --> 00:11:22,020 Vel, krasjer programmet mitt ganske mye umiddelbart. 235 00:11:22,020 --> 00:11:26,300 Mitt program krasjer på Et kall til strcmp, men jeg 236 00:11:26,300 --> 00:11:30,560 har ingen lokale variabler i mitt program på den tiden at det krasjer. 237 00:11:30,560 --> 00:11:37,320 Så hva streng eller strenger, kunne jeg muligens være å sammenligne. 238 00:11:37,320 --> 00:11:42,140 Hvis jeg ikke har noen lokal variabler, kanskje du 239 00:11:42,140 --> 00:11:45,520 anta at jeg have-- det kanskje er en global variabel, noe som kan være sant. 240 00:11:45,520 --> 00:11:47,670 >> Men generelt ser det ut til som jeg sammenlikne 241 00:11:47,670 --> 00:11:52,070 til noe som ikke eksisterer. 242 00:11:52,070 --> 00:11:54,130 Så la oss undersøke at litt lenger. 243 00:11:54,130 --> 00:11:55,120 Så jeg kommer til å tømme skjermen min. 244 00:11:55,120 --> 00:11:57,536 Jeg kommer til å slutte seg ut av GDB miljø for et sekund. 245 00:11:57,536 --> 00:12:01,300 Og jeg tenker, OK, så det er ingen lokale variabler i mitt program. 246 00:12:01,300 --> 00:12:06,444 Jeg lurer på om kanskje jeg skal passere i en streng som en kommandolinje argument. 247 00:12:06,444 --> 00:12:07,610 Så la oss bare teste ut dette. 248 00:12:07,610 --> 00:12:09,020 Jeg har ikke gjort dette før. 249 00:12:09,020 --> 00:12:14,244 >> La oss se om kanskje hvis jeg kjører dette programmet med en kommandolinje argument fungerer det. 250 00:12:14,244 --> 00:12:16,140 He, nei segmentering feil der. 251 00:12:16,140 --> 00:12:17,870 Det fortalte meg at jeg fant det ut. 252 00:12:17,870 --> 00:12:19,170 Så kanskje det er fix her. 253 00:12:19,170 --> 00:12:27,560 Og faktisk, hvis jeg går tilbake og ser på selve kildekoden for buggy1.c, 254 00:12:27,560 --> 00:12:31,180 det virker som om det jeg gjør er Jeg gjør et kall til strcmp uten 255 00:12:31,180 --> 00:12:34,010 å sjekke om faktisk argv [1] eksisterer. 256 00:12:34,010 --> 00:12:36,730 Dette er faktisk kildekoden for buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Så det jeg trenger virkelig å gjøre her for å fikse mitt program, 258 00:12:38,855 --> 00:12:40,835 forutsatt at jeg har fil foran meg, er 259 00:12:40,835 --> 00:12:44,740 å bare legge en sjekk for å gjøre sikker på at argc er lik 2. 260 00:12:44,740 --> 00:12:47,780 Så dette eksempelet, igjen, som jeg sa, er litt contrived, ikke sant? 261 00:12:47,780 --> 00:12:49,840 Du vanligvis ikke kommer til å uhell sletter kildekoden 262 00:12:49,840 --> 00:12:51,820 og deretter må prøve og feilsøke programmet. 263 00:12:51,820 --> 00:12:53,120 Men forhåpentligvis, det ga du en illustrasjon 264 00:12:53,120 --> 00:12:55,120 av den slags ting som du kan tenke på 265 00:12:55,120 --> 00:12:56,610 som du feilsøke programmet. 266 00:12:56,610 --> 00:12:58,760 >> Hva er tingenes tilstand her? 267 00:12:58,760 --> 00:13:00,510 Hva variabler gjør jeg har tilgjengelig for meg? 268 00:13:00,510 --> 00:13:03,600 Hvor nøyaktig er mitt program krasje, på hvilken linje, 269 00:13:03,600 --> 00:13:05,240 på hva kallet til hvilken funksjon? 270 00:13:05,240 --> 00:13:06,952 Hva slags spor gjør det gi meg? 271 00:13:06,952 --> 00:13:08,910 Og det er akkurat det slags tankesett som du 272 00:13:08,910 --> 00:13:12,820 skal komme inn når du er tenker debugging programmene dine. 273 00:13:12,820 --> 00:13:13,820 >> Jeg er Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Dette er CS50. 275 00:13:16,140 --> 00:15:08,642