1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Alle reg GDB. 3 00:00:06,830 --> 00:00:08,480 Wat is dit presies? 4 00:00:08,480 --> 00:00:11,310 So GDB, wat staan vir die GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 is 'n ongelooflike hulpmiddel wat regtig ons kan gebruik om ons te help ontfout ons programme, 6 00:00:15,040 --> 00:00:18,210 of uit te vind waar dinge verkeerd gaan in ons programme. 7 00:00:18,210 --> 00:00:22,590 GDB is ongelooflik kragtig, maar die uitset en interaksie met dit 8 00:00:22,590 --> 00:00:23,830 kan 'n bietjie kripties. 9 00:00:23,830 --> 00:00:28,210 Dit is gewoonlik 'n command line instrument, en dit kan 'n baie van die boodskappe te gooi by jou. 10 00:00:28,210 --> 00:00:31,144 En dit kan soort van moeilik om ontleed presies wat aangaan. 11 00:00:31,144 --> 00:00:33,560 Gelukkig het ons stappe geneem om hierdie probleem op te los vir jou 12 00:00:33,560 --> 00:00:36,281 as jy deur CS50. 13 00:00:36,281 --> 00:00:39,030 As jy nie die gebruik van die grafiese debugger, wat my kollega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse het nogal gepraat 'n bietjie oor 'n video wat 15 00:00:41,570 --> 00:00:44,740 moet hier wees nou, kan jy nodig het 16 00:00:44,740 --> 00:00:48,270 om hierdie opdrag lyn gebruik gereedskap om te werk met GDB. 17 00:00:48,270 --> 00:00:51,250 As jy werk in die CS50 IDE, het jy nie nodig om dit te doen. 18 00:00:51,250 --> 00:00:53,550 Maar as jy nie werk in die CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 dalk met 'n weergawe van CS50 toestel, 20 00:00:55,750 --> 00:00:58,860 of 'n ander Linux bedryfstelsel stelsel met GDB geïnstalleer op dit, 21 00:00:58,860 --> 00:01:00,980 jy mag nodig wees om te gebruik hierdie command line gereedskap. 22 00:01:00,980 --> 00:01:02,860 >> En omdat jy dalk het om dit te doen, is dit 23 00:01:02,860 --> 00:01:06,280 nuttige net om te verstaan ​​hoe GDB werk uit die opdrag lyn. 24 00:01:06,280 --> 00:01:09,650 Maar weereens, as jy die gebruik van die CS50 IDE, jy 25 00:01:09,650 --> 00:01:15,400 kan die grafiese debugger gebruik wat gebou in die IDE. 26 00:01:15,400 --> 00:01:18,750 So dinge gaan met te kry GDB, die ontfouting begin 27 00:01:18,750 --> 00:01:21,220 proses van 'n spesifieke program moet alles wat jy doen 28 00:01:21,220 --> 00:01:23,810 is tik GDB gevolg deur die program naam. 29 00:01:23,810 --> 00:01:28,620 So byvoorbeeld, as jou program is hello, jy sal GDB hallo tik. 30 00:01:28,620 --> 00:01:31,210 >> Wanneer jy dit doen, jy gaan om te trek die GDB omgewing. 31 00:01:31,210 --> 00:01:33,800 Jou vinnige sal verander, en in plaas van om dit gewoonlik wat 32 00:01:33,800 --> 00:01:35,841 is wanneer jy dinge tik volgens die bevel line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- al jou tipiese Linux instruksies, jou vinnige 34 00:01:38,115 --> 00:01:42,200 sal verander, waarskynlik, iets soos hakies GDB hakies. 35 00:01:42,200 --> 00:01:46,630 Dit is jou nuwe GDB vinnige, want jy binne die GDB omgewing. 36 00:01:46,630 --> 00:01:49,830 Sodra binnekant van die omgewing, daar is twee groot gebooie 37 00:01:49,830 --> 00:01:52,290 dat jy waarskynlik sal gebruik in die volgende volgorde. 38 00:01:52,290 --> 00:01:55,200 >> Die eerste is b, wat is kort vir pouse. 39 00:01:55,200 --> 00:01:58,690 En na jou, jy tipies tipe B Tik die naam van 'n funksie, 40 00:01:58,690 --> 00:02:01,040 of as jy gebeur om te weet rondom wat lyn nommer 41 00:02:01,040 --> 00:02:04,100 jou program begin om op te tree 'n bietjie vreemd, 42 00:02:04,100 --> 00:02:06,370 kan jy 'n lyn te tik getal daar ook. 43 00:02:06,370 --> 00:02:09,660 Wat b, of breek, doen is dit laat jou program 44 00:02:09,660 --> 00:02:13,270 om te hardloop totdat 'n sekere punt, naamlik die naam van die funksie 45 00:02:13,270 --> 00:02:15,880 wat jy spesifiseer of die lyn nommer wat jy spesifiseer. 46 00:02:15,880 --> 00:02:18,590 >> En op daardie punt, is dit sal uitvoering vries. 47 00:02:18,590 --> 00:02:21,670 Dit is 'n baie goeie ding, want keer uitvoering is gevries, 48 00:02:21,670 --> 00:02:25,214 kan jy baie stadig begin stap vir stap deur jou program. 49 00:02:25,214 --> 00:02:28,130 Tipies, as jy nie hardloop jou programme, hulle is redelik kort. 50 00:02:28,130 --> 00:02:31,250 Gewoonlik, jy dot streep tik alles die naam van jou program is, druk Enter, 51 00:02:31,250 --> 00:02:33,470 en voor jy kan knip, jou program is al klaar. 52 00:02:33,470 --> 00:02:36,620 Dit is nie regtig 'n baie tyd om te probeer en uit te vind wat verkeerd gaan. 53 00:02:36,620 --> 00:02:40,920 So dit regtig in staat wees om dinge stadiger af deur die oprigting van 'n breek punt met b, 54 00:02:40,920 --> 00:02:43,040 en dan trap in. 55 00:02:43,040 --> 00:02:46,169 >> Dan wanneer jy jou breek gestel het punt, kan jy die program uitvoer. 56 00:02:46,169 --> 00:02:47,960 En as jy enige het command line argumente, 57 00:02:47,960 --> 00:02:51,610 jy hulle hier spesifiseer, nie wanneer jy tik GDB jou program naam. 58 00:02:51,610 --> 00:02:55,980 Jy spesifiseer al die command line argumente deur r, of hardloop, 59 00:02:55,980 --> 00:03:00,270 en dan argumente ookal command line wat jy nodig het binnekant van jou program. 60 00:03:00,270 --> 00:03:03,510 Daar is 'n aantal ander regtig belangrike en nuttige opdragte 61 00:03:03,510 --> 00:03:04,970 binnekant van die BBP omgewing. 62 00:03:04,970 --> 00:03:07,540 So laat my net vinnig gaan oor 'n paar van hulle. 63 00:03:07,540 --> 00:03:11,320 >> Die eerste is N, wat is kort vir die volgende, en jy kan tik volgende plaas van N, 64 00:03:11,320 --> 00:03:12,304 beide sal werk. 65 00:03:12,304 --> 00:03:13,470 En dit is net die snelskrif. 66 00:03:13,470 --> 00:03:17,540 En as jy het waarskynlik reeds gekry gebruik om, in staat is om dinge te tik 67 00:03:17,540 --> 00:03:20,520 korter is oor die algemeen beter. 68 00:03:20,520 --> 00:03:24,100 En wat dit sal doen, is dit sal stap vorentoe een blok van die kode. 69 00:03:24,100 --> 00:03:26,170 So dit sal vorentoe te beweeg totdat 'n funksie oproep. 70 00:03:26,170 --> 00:03:28,350 En dan in plaas van duik in daardie funksie 71 00:03:28,350 --> 00:03:33,130 en gaan deur al wat funksioneer kode, sal dit net die funksie. 72 00:03:33,130 --> 00:03:34,400 >> Die funksie sal genoem word. 73 00:03:34,400 --> 00:03:35,733 Dit sal alles doen wat sy werk is. 74 00:03:35,733 --> 00:03:38,870 Dit sal 'n waarde om terug te keer die funksie dat dit genoem. 75 00:03:38,870 --> 00:03:42,490 En dan sal jy op die beweeg volgende reël van daardie roeping funksie. 76 00:03:42,490 --> 00:03:44,555 As jy wil om te stap binnekant van die funksie, 77 00:03:44,555 --> 00:03:46,430 in plaas van net ' dit uit te voer, veral 78 00:03:46,430 --> 00:03:50,004 as jy dink dat die probleem dalk binnekant van daardie funksie lê, 79 00:03:50,004 --> 00:03:52,670 jy kan, natuurlik, stel 'n breek wys binnekant van daardie funksie. 80 00:03:52,670 --> 00:03:57,820 Of as jy reeds hardloop, jy kan gebruik s om vorentoe een lyn van kode stap. 81 00:03:57,820 --> 00:04:01,170 >> So sal dit stap in en duik in funksies, 82 00:04:01,170 --> 00:04:04,750 in plaas van net die voer en die voortsetting van die funksie 83 00:04:04,750 --> 00:04:07,380 dat jy is in vir ontfouting. 84 00:04:07,380 --> 00:04:09,870 As jy al ooit wil weet die waarde van 'n veranderlike, 85 00:04:09,870 --> 00:04:12,507 jy kan tik p, of Print, en dan die veranderlike naam. 86 00:04:12,507 --> 00:04:15,090 En dit sal druk vir jou, binnekant van die GDB omgewing, 87 00:04:15,090 --> 00:04:19,110 die naam van die veranderlike wat you-- verskoon me-- die waarde van die veranderlike 88 00:04:19,110 --> 00:04:20,064 wat jy genoem het. 89 00:04:20,064 --> 00:04:23,230 As jy wil om die waardes van elke leer ken plaaslike veranderlike toeganklik vanaf waar 90 00:04:23,230 --> 00:04:25,970 jy tans in jou program, kan jy tik info locals. 91 00:04:25,970 --> 00:04:28,332 Dit is 'n baie vinniger as tik p en dan ook al, 92 00:04:28,332 --> 00:04:30,540 notering uit al die veranderlikes wat jy ken bestaan ​​nie. 93 00:04:30,540 --> 00:04:34,370 Jy kan tik info locals, en dit sal alles uit te druk vir jou. 94 00:04:34,370 --> 00:04:37,770 Volgende is bt, wat kort vir terug te spoor. 95 00:04:37,770 --> 00:04:41,680 Nou, in die algemeen, veral vroeg in CS50, 96 00:04:41,680 --> 00:04:44,450 sal jy nie regtig 'n geleentheid om BT, of terug te spoor gebruik, 97 00:04:44,450 --> 00:04:47,860 omdat jy nie met funksies wat noem ander funksies. 98 00:04:47,860 --> 00:04:50,450 >> Jy kan belangrikste oproep van 'n het funksie, maar dit is waarskynlik nie. 99 00:04:50,450 --> 00:04:53,199 Jy hoef nie die ander funksie 'n ander funksie, bel wat 100 00:04:53,199 --> 00:04:54,880 roep 'n ander funksie, en so aan. 101 00:04:54,880 --> 00:04:57,550 Maar as jou programme meer kompleks, en veral 102 00:04:57,550 --> 00:05:00,290 wanneer jy begin werk met rekursie, terug te spoor 103 00:05:00,290 --> 00:05:05,150 kan 'n baie nuttige manier om jou te laat wees soort kry 'n paar konteks vir waar 104 00:05:05,150 --> 00:05:06,460 Ek is in my program. 105 00:05:06,460 --> 00:05:10,590 So sê jy het jou kode geskryf, en jy weet dat 'n funksie belangrikste oproepe 106 00:05:10,590 --> 00:05:14,720 f, wat 'n funksie roep g, wat 'n funksie h noem. 107 00:05:14,720 --> 00:05:17,650 So ons het 'n paar lae nes hier aangaan nie. 108 00:05:17,650 --> 00:05:19,440 >> As jy binne jou GDB omgewing, 109 00:05:19,440 --> 00:05:21,640 en jy weet jou binnekant van h, maar jy vergeet 110 00:05:21,640 --> 00:05:27,210 oor wat jy het om te waar jy are-- jy kan tik BT, of terug te spoor, 111 00:05:27,210 --> 00:05:32,370 en dit sal druk h, g, f belangrikste, saam met sommige ander inligting wat 112 00:05:32,370 --> 00:05:35,984 gee jou 'n idee dat OK belangrikste genoem f, f genoem g, g genoem h, 113 00:05:35,984 --> 00:05:37,900 en dit is waar ek tans is in my program. 114 00:05:37,900 --> 00:05:41,380 So dit kan regtig nuttig, veral as die kriptiese-heid van GDB 115 00:05:41,380 --> 00:05:45,667 'n bietjie oorweldigend, om uit te vind presies waar dinge. 116 00:05:45,667 --> 00:05:48,500 Ten slotte, wanneer jou program gedoen word, of wanneer jy klaar is ontfout 117 00:05:48,500 --> 00:05:50,125 en jy wil om te stap weg uit die GDB omgewing, 118 00:05:50,125 --> 00:05:51,940 dit help om te weet hoe om te kry uit dit uit. 119 00:05:51,940 --> 00:05:55,500 Jy kan tik q, of afsluit, uit te kry. 120 00:05:55,500 --> 00:05:59,220 Nou, voordat video vandag se Ek het 'n karretjie program voorberei 121 00:05:59,220 --> 00:06:03,900 genoem buggy1, wat ek saamgestel uit 'n lêer bekend as buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Soos jy kan verwag, is hierdie program is in werklikheid karretjie. 123 00:06:06,500 --> 00:06:08,990 Iets verkeerd gaan wanneer ek probeer hardloop nie. 124 00:06:08,990 --> 00:06:13,014 Nou, helaas, ek per ongeluk geskrap my buggy1.c lêer, 125 00:06:13,014 --> 00:06:15,930 so ten einde vir my om uit te vind wat verkeerd gaan met hierdie program, 126 00:06:15,930 --> 00:06:18,770 Ek gaan om te gebruik GDB soort blindelings probeer 127 00:06:18,770 --> 00:06:22,372 opgevolg deur hierdie program uit te vind presies wat verkeerd gaan. 128 00:06:22,372 --> 00:06:24,580 Maar met net die gereedskap ons het reeds geleer het oor, 129 00:06:24,580 --> 00:06:27,700 ons kan pretty much figuur presies wat dit is. 130 00:06:27,700 --> 00:06:30,740 So laat kop bo aan CS50 IDE en het 'n blik. 131 00:06:30,740 --> 00:06:33,155 OK, so ons is hier in my CS50 IDE omgewing, 132 00:06:33,155 --> 00:06:35,697 en ek sal in 'n bietjie zoom sodat jy kan 'n bietjie meer te sien. 133 00:06:35,697 --> 00:06:38,530 In my terminale venster, as ek 'n lys van die inhoud van my huidige direkteur 134 00:06:38,530 --> 00:06:41,250 met ls, sal ons sien dat ek het 'n paar van die bron lêers 135 00:06:41,250 --> 00:06:44,982 hier, insluitend die voorheen bespreek buggy1. 136 00:06:44,982 --> 00:06:46,940 Wat presies gaan oor wanneer Ek probeer en hardloop buggy1. 137 00:06:46,940 --> 00:06:47,773 Wel, laat ons uit te vind. 138 00:06:47,773 --> 00:06:52,510 Ek tik dot streep karretjie, en ek druk Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentering foute. 140 00:06:53,670 --> 00:06:55,000 Dit is nie goed nie. 141 00:06:55,000 --> 00:06:57,180 As jy onthou, 'n segmentering skuld tipies 142 00:06:57,180 --> 00:07:01,540 vind plaas wanneer ons toegang geheue dat ons nie toegelaat om aan te raak. 143 00:07:01,540 --> 00:07:03,820 Ons het een of ander manier bereik buite die grense 144 00:07:03,820 --> 00:07:05,995 van wat die program, die samesteller, het ons gegee het. 145 00:07:05,995 --> 00:07:08,310 En so al is dit 'n leidraad in die toolbox hou 146 00:07:08,310 --> 00:07:10,660 as ons begin die ontfouting proses. 147 00:07:10,660 --> 00:07:13,620 Iets het gegaan hier 'n bietjie verkeerd. 148 00:07:13,620 --> 00:07:15,935 >> Alle reg, so laat ons begin die GDB omgewing 149 00:07:15,935 --> 00:07:19,030 en kyk of ons kan uitvind wat presies die probleem is. 150 00:07:19,030 --> 00:07:21,674 Ek gaan my skerm skoon te maak, en ek gaan om te tik GDB 151 00:07:21,674 --> 00:07:24,340 weer na die GDB omgewing betree, en die naam van die program 152 00:07:24,340 --> 00:07:27,450 wat ek wil ontfout, buggy1. 153 00:07:27,450 --> 00:07:30,182 Ons kry 'n bietjie boodskap lees simbole van buggy1, gedoen. 154 00:07:30,182 --> 00:07:32,390 Al wat beteken dit getrek saam al van die kode, 155 00:07:32,390 --> 00:07:35,570 en nou is dit is in gelaai GDB, en dit is gereed om te gaan. 156 00:07:35,570 --> 00:07:37,140 >> Nou, wat wil ek doen? 157 00:07:37,140 --> 00:07:39,130 Het jy onthou wat die eerste stap is tipies 158 00:07:39,130 --> 00:07:42,540 nadat ek is binnekant van hierdie omgewing? 159 00:07:42,540 --> 00:07:44,540 Hopelik het gesê jy stel 'n breek punt, want 160 00:07:44,540 --> 00:07:46,240 in die feit dat dit is wat ek wil doen. 161 00:07:46,240 --> 00:07:47,990 Nou, ek het nie die bronkode vir hierdie 162 00:07:47,990 --> 00:07:50,948 in die voorkant van my, wat is waarskynlik nie die tipiese gebruik geval, deur die manier. 163 00:07:50,948 --> 00:07:52,055 Jy sal waarskynlik. 164 00:07:52,055 --> 00:07:52,680 So dit is goed. 165 00:07:52,680 --> 00:07:55,790 Maar die veronderstelling dat jy dit nie doen nie, wat is die een funksie dat jy weet 166 00:07:55,790 --> 00:07:58,880 bestaan ​​in elke enkele C-program? 167 00:07:58,880 --> 00:08:04,420 Maak nie saak hoe groot of hoe ingewikkeld dit is, is hierdie funksie beslis bestaan. 168 00:08:04,420 --> 00:08:05,440 Main, reg? 169 00:08:05,440 --> 00:08:08,870 >> So versuim alles, ons kan stel 'n breek punt belangrikste. 170 00:08:08,870 --> 00:08:12,200 En weer, ek kon net tik breek belangrikste, in plaas van b. 171 00:08:12,200 --> 00:08:14,650 En as jy nuuskierig is, as jy ooit tik 'n lang opdrag 172 00:08:14,650 --> 00:08:16,800 en dan besef dat jy getik die verkeerde ding, 173 00:08:16,800 --> 00:08:18,770 en jy wil ontslae te raak van alle ek nou net gedoen het, 174 00:08:18,770 --> 00:08:22,029 jy kan beheer neem U, wat sal verwyder alles en bring jou terug 175 00:08:22,029 --> 00:08:23,570 na die begin van die wyser lyne. 176 00:08:23,570 --> 00:08:26,569 'N baie vinniger as net hou die verwyder, of slaan dit 'n klomp keer 177 00:08:26,569 --> 00:08:27,080 oor. 178 00:08:27,080 --> 00:08:28,740 >> So sal ons 'n breek punt stel by die hoof. 179 00:08:28,740 --> 00:08:32,970 En soos jy kan sien, dit sê ons het stel 'n breek punt lêer buggy1.c, 180 00:08:32,970 --> 00:08:36,330 en blykbaar die eerste reël van die kode van die belangrikste is lyn sewe. 181 00:08:36,330 --> 00:08:38,080 Weereens, ons het nie die bron lêer hier, 182 00:08:38,080 --> 00:08:40,429 maar ek sal aanvaar dat dit vertel my die waarheid. 183 00:08:40,429 --> 00:08:44,510 En dan, ek is net probeer en hardloop die program, r. 184 00:08:44,510 --> 00:08:45,360 Begin program. 185 00:08:45,360 --> 00:08:48,160 Alle reg, sodat hierdie boodskap is 'n bietjie kripties. 186 00:08:48,160 --> 00:08:50,160 Maar basies wat is hier gebeur, is dit net 187 00:08:50,160 --> 00:08:53,350 vertel my ek het my break getref punt, breek punt nommer 1. 188 00:08:53,350 --> 00:08:55,877 >> En dan, dat die lyn van die kode, geen sodanige lêer of gids. 189 00:08:55,877 --> 00:08:57,710 Die enigste rede dat Ek sien dat die boodskap 190 00:08:57,710 --> 00:09:00,800 is omdat ek per ongeluk geskrap my buggy.c lêer. 191 00:09:00,800 --> 00:09:04,050 As my buggy1.c lêer bestaan in die huidige gids, 192 00:09:04,050 --> 00:09:06,920 dat die lyn reg daar eintlik my vertel wat die reël van die kode 193 00:09:06,920 --> 00:09:08,214 letterlik lees. 194 00:09:08,214 --> 00:09:09,380 Ongelukkig het ek dit verwyder. 195 00:09:09,380 --> 00:09:14,790 Ons gaan hê om soort navigeer deur middel van hierdie 'n bietjie meer blindelings. 196 00:09:14,790 --> 00:09:17,330 >> OK, so laat ons sien, wat wil ek hier doen? 197 00:09:17,330 --> 00:09:21,770 Wel, ek sou graag wou weet wat die plaaslike veranderlikes miskien is beskikbaar vir my. 198 00:09:21,770 --> 00:09:23,570 Ek het my program begin. 199 00:09:23,570 --> 00:09:28,515 Kom ons kyk wat kan wees reeds geïnisialiseer vir ons. 200 00:09:28,515 --> 00:09:31,430 Ek tik Info locals, geen plaaslike bevolking. 201 00:09:31,430 --> 00:09:33,960 Alle reg, sodat nie gee my 'n ton van inligting. 202 00:09:33,960 --> 00:09:37,600 Ek kan probeer en druk 'n veranderlike, maar ek weet nie enige veranderlike name. 203 00:09:37,600 --> 00:09:39,930 Ek kon 'n spoor terug te probeer, maar ek is binnekant van hoof, 204 00:09:39,930 --> 00:09:43,710 so ek weet ek het nie gemaak ander funksie oproep nou. 205 00:09:43,710 --> 00:09:47,710 >> So lyk my enigste opsies is gebruik N of so en begin om te duik in. 206 00:09:47,710 --> 00:09:49,630 Ek gaan om te gebruik n. 207 00:09:49,630 --> 00:09:51,180 So ek tik n. 208 00:09:51,180 --> 00:09:53,060 Oh my gosh, wat gaan hier aan. 209 00:09:53,060 --> 00:09:56,260 Program ontvang seine, SIGSEGV segmentering skuld, 210 00:09:56,260 --> 00:09:57,880 en dan 'n hele klomp van die dinge. 211 00:09:57,880 --> 00:09:58,880 Ek is reeds oorweldig. 212 00:09:58,880 --> 00:10:00,980 Wel, daar is eintlik 'n baie hier geleer word. 213 00:10:00,980 --> 00:10:02,520 So wat beteken dit vir ons? 214 00:10:02,520 --> 00:10:09,180 Wat dit vir ons sê is, is hierdie program is oor, maar het nog nie, seg skuld. 215 00:10:09,180 --> 00:10:12,550 En in die besonder, ek gaan in selfs verder hier om te vergroot, 216 00:10:12,550 --> 00:10:18,980 dit gaan oor om fout seg oor iets genoem strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nou, kan ons nie bespreek hierdie funksie omvattend. 218 00:10:22,705 --> 00:10:25,580 Maar dit is-- omdat ons nie gaan om te praat oor elke funksie wat 219 00:10:25,580 --> 00:10:28,610 bestaan ​​in die C standaard library-- maar hulle is almal beskikbaar vir jou, 220 00:10:28,610 --> 00:10:32,110 veral as jy 'n te neem kyk na reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 En strcmp is 'n baie kragtige funksie wat binnekant bestaan 222 00:10:35,000 --> 00:10:38,070 van die string.h kop lêer, wat is 'n kop- 223 00:10:38,070 --> 00:10:41,970 lêer wat word gewy aan funksies dat die werk met en manipuleer snare. 224 00:10:41,970 --> 00:10:49,830 >> En in die besonder, wat strcmp doen, is Dit vergelyk die waardes van twee stringe. 225 00:10:49,830 --> 00:10:54,160 So ek is op die punt om skuld segmentering op 'n oproep om strcmp dit lyk. 226 00:10:54,160 --> 00:10:58,530 Ek getref N, en in werklikheid Ek kry die boodskap, program beëindig met sein SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentering skuld. So nou Ek het eintlik seg myn, 228 00:11:01,370 --> 00:11:06,479 en my program het redelik veel effektief opgegee. 229 00:11:06,479 --> 00:11:07,770 Dit is die einde van die program. 230 00:11:07,770 --> 00:11:10,370 Dit gebreek het, dit neergestort het. 231 00:11:10,370 --> 00:11:14,740 So was nie 'n baie, maar ek eintlik het nogal 'n bietjie te leer 232 00:11:14,740 --> 00:11:16,747 Van hierdie min ondervinding. 233 00:11:16,747 --> 00:11:17,580 Wat het ek geleer? 234 00:11:17,580 --> 00:11:22,020 Wel, my program ineenstortings pretty much onmiddellik. 235 00:11:22,020 --> 00:11:26,300 My program ineenstortings op 'n oproep tot strcmp, maar ek 236 00:11:26,300 --> 00:11:30,560 moenie enige plaaslike veranderlikes nie in my program teen die tyd dat dit omval. 237 00:11:30,560 --> 00:11:37,320 So, wat string, of snare, Ek kon moontlik wees vergelyk. 238 00:11:37,320 --> 00:11:42,140 As ek nie 'n plaaslike het veranderlikes, kan jy 239 00:11:42,140 --> 00:11:45,520 vermoed dat ek daar is 'n have-- miskien globale veranderlike, wat ware kan wees. 240 00:11:45,520 --> 00:11:47,670 >> Maar oor die algemeen, blyk dit asof ek vergelyk 241 00:11:47,670 --> 00:11:52,070 iets wat nie bestaan ​​nie. 242 00:11:52,070 --> 00:11:54,130 So laat ondersoek dat 'n bietjie verder. 243 00:11:54,130 --> 00:11:55,120 So ek gaan my skerm skoon te maak. 244 00:11:55,120 --> 00:11:57,536 Ek gaan om op te hou uit die GDB omgewing vir 'n tweede. 245 00:11:57,536 --> 00:12:01,300 En ek dink, OK, so daar is geen plaaslike veranderlikes in my program. 246 00:12:01,300 --> 00:12:06,444 Ek wonder of miskien is ek veronderstel om te slaag in 'n string as 'n command line argument. 247 00:12:06,444 --> 00:12:07,610 So laat ons net toets dit uit. 248 00:12:07,610 --> 00:12:09,020 Ek het nie hierdie voorheen gedoen. 249 00:12:09,020 --> 00:12:14,244 >> Kom ons kyk of miskien as ek hierdie program met 'n command line argument dit werk. 250 00:12:14,244 --> 00:12:16,140 Huh, geen segmentering skuld daar. 251 00:12:16,140 --> 00:12:17,870 Dit het vir my gesê dat ek net gedink dit uit. 252 00:12:17,870 --> 00:12:19,170 So miskien is dit hier die fix. 253 00:12:19,170 --> 00:12:27,560 En inderdaad, as ek gaan terug en kyk na die werklike bron-kode vir buggy1.c, 254 00:12:27,560 --> 00:12:31,180 dit lyk asof dit wat ek doen is Ek maak 'n oproep na strcmp sonder 255 00:12:31,180 --> 00:12:34,010 kontroleer of in werklikheid argv [1] bestaan. 256 00:12:34,010 --> 00:12:36,730 Dit is eintlik die bron-kode vir buggy1.c. 257 00:12:36,730 --> 00:12:38,855 So, wat ek het regtig nodig om doen hier om my program op te los, 258 00:12:38,855 --> 00:12:40,835 veronderstelling Ek het die lêer in die voorkant van my, is 259 00:12:40,835 --> 00:12:44,740 net voeg 'n tjek te maak seker dat argc is gelyk aan 2. 260 00:12:44,740 --> 00:12:47,780 So hierdie voorbeeld, weer, soos ek gesê het, is 'n bietjie slinks, reg? 261 00:12:47,780 --> 00:12:49,840 Jy oor die algemeen gaan nie per ongeluk jou bronkode te verwyder 262 00:12:49,840 --> 00:12:51,820 en dan te probeer en ontfout die program. 263 00:12:51,820 --> 00:12:53,120 Maar hopelik, dit het jy 'n illustrasie 264 00:12:53,120 --> 00:12:55,120 van die soort van dinge wat jy kan dink oor 265 00:12:55,120 --> 00:12:56,610 as jy ontfouting jou program. 266 00:12:56,610 --> 00:12:58,760 >> Wat is die stand van sake hier? 267 00:12:58,760 --> 00:13:00,510 Wat veranderlikes ek het toeganklik vir my? 268 00:13:00,510 --> 00:13:03,600 Waar presies is my program gekraak, op watter lyn, 269 00:13:03,600 --> 00:13:05,240 oor wat oproep tot watter funksie? 270 00:13:05,240 --> 00:13:06,952 Watter soort leidrade nie wat my te gee? 271 00:13:06,952 --> 00:13:08,910 En dit is presies die soort ingesteldheid wat jy 272 00:13:08,910 --> 00:13:12,820 moet wees om in wanneer jy dink oor die opsporing van jou programme. 273 00:13:12,820 --> 00:13:13,820 >> Ek is Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Dit is CS50. 275 00:13:16,140 --> 00:15:08,642