1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Bone GDB. 3 00:00:06,830 --> 00:00:08,480 Kio estas ĝuste? 4 00:00:08,480 --> 00:00:11,310 Do GDB, kiu staras por la GNUa erarserĉilo, 5 00:00:11,310 --> 00:00:15,040 Estas vere nekredebla ilo ke ni povas uzi helpi nin elpurigi niaj programoj, 6 00:00:15,040 --> 00:00:18,210 aŭ trovi kie ajn estas iranta malĝustan en niaj programoj. 7 00:00:18,210 --> 00:00:22,590 GDB estas mirinde potenca, sed la eligo kaj interagado kun ĝi 8 00:00:22,590 --> 00:00:23,830 povas esti iomete kripta. 9 00:00:23,830 --> 00:00:28,210 Ĝi estas kutime komandlinio ilo, kaj ĝi povas ĵeti multajn mesaĝojn ĉe vi. 10 00:00:28,210 --> 00:00:31,144 Kaj ĝi povas ia malfacile analizi akurate kio okazas. 11 00:00:31,144 --> 00:00:33,560 Feliĉe, ni prenis paŝoj ripari tiun problemon por vi 12 00:00:33,560 --> 00:00:36,281 kiel vi laboras tra CS50. 13 00:00:36,281 --> 00:00:39,030 Se vi ne uzas la grafikan erarserĉilo, kiun mia kolego Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse parolis tute iom pri en video ke 15 00:00:41,570 --> 00:00:44,740 devus esti super tie ĝuste nun, vi eble bezonas 16 00:00:44,740 --> 00:00:48,270 uzi tiujn komandlinio iloj por labori kun GDB. 17 00:00:48,270 --> 00:00:51,250 Se vi laboras en la CS50 IDE, vi ne bezonas fari tion. 18 00:00:51,250 --> 00:00:53,550 Sed se vi ne laborante en la CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 eble uzante versio de CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 aŭ alia Linukso sistemo kun GDB instalita sur ĝi, 21 00:00:58,860 --> 00:01:00,980 vi eble bezonos uzi tiujn komandlinio iloj. 22 00:01:00,980 --> 00:01:02,860 >> Kaj ĉar vi eble devas fari tion, ĝi estas 23 00:01:02,860 --> 00:01:06,280 utilaj nur por kompreni kiel GDB laboras de la komandlinio. 24 00:01:06,280 --> 00:01:09,650 Sed denove, se vi estas uzante la CS50 IDE, vi 25 00:01:09,650 --> 00:01:15,400 povas uzi la grafikan erarserĉilo kiu estas konstruita en la IDE. 26 00:01:15,400 --> 00:01:18,750 Do por akiri aferojn iranta kun GDB, komenci la elpuriganta 27 00:01:18,750 --> 00:01:21,220 procezo de aparta programo, ĉiuj vi devas fari 28 00:01:21,220 --> 00:01:23,810 Estas tajpas GDB sekvis per la programo nomo. 29 00:01:23,810 --> 00:01:28,620 Do ekzemple, se via programaro estas saluton, vi tajpas GDB saluton. 30 00:01:28,620 --> 00:01:31,210 >> Kiam vi faros tion, vi tuj tiri supren la GDB medio. 31 00:01:31,210 --> 00:01:33,800 Via prompto ŝanĝos, kaj anstataŭ esti kio kutime 32 00:01:33,800 --> 00:01:35,841 Estas kiam vi tajpas aferoj ĉe la komando line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- ĉiuj viajn tipa Linukso komandoj, via prompt 34 00:01:38,115 --> 00:01:42,200 ŝanĝos, probable, io kiel krampoj GDB krampoj. 35 00:01:42,200 --> 00:01:46,630 Tio estas via nova GDB prompto, ĉar vi estas ene la GDB medio. 36 00:01:46,630 --> 00:01:49,830 Fojo ene de tiu medio, Tie estas du gravaj komandoj 37 00:01:49,830 --> 00:01:52,290 ke vi probable uzos en la jena ordo. 38 00:01:52,290 --> 00:01:55,200 >> La unua estas b, kiu estas mallonga por paŭzo. 39 00:01:55,200 --> 00:01:58,690 Kaj post vi entajpas b, vi tipe tajpi la nomon de funkcio, 40 00:01:58,690 --> 00:02:01,040 aŭ se vi hazarde scias ĉirkaŭ kio lininumeron 41 00:02:01,040 --> 00:02:04,100 via programo estas komencanta konduti iom stranga, 42 00:02:04,100 --> 00:02:06,370 vi povas tajpi linion numeron tie ankaŭ. 43 00:02:06,370 --> 00:02:09,660 Kio b, aŭ paŭzo, faras estas tio permesas via programo 44 00:02:09,660 --> 00:02:13,270 kuri supren ĝis certa punkto, nome, la nomo de la funkcio 45 00:02:13,270 --> 00:02:15,880 ke vi specifas aŭ la linio numeron kiun vi specifas. 46 00:02:15,880 --> 00:02:18,590 >> Kaj je tiu punkto, ĝi glaciiĝas ekzekuto. 47 00:02:18,590 --> 00:02:21,670 Jen vere bona afero, ĉar iam ekzekuto estis frostigita, 48 00:02:21,670 --> 00:02:25,214 vi povas komenci tre malrapide paŝi tra via programo. 49 00:02:25,214 --> 00:02:28,130 Tipe, se vi jam estis kuranta viaj programoj, ili estas sufiĉe mallonga. 50 00:02:28,130 --> 00:02:31,250 Kutime, vi tajpas dot oblikvo ajn la nomo de via programo, batis Enter, 51 00:02:31,250 --> 00:02:33,470 kaj antaŭ ol vi povos blink, via programo estas jam finita. 52 00:02:33,470 --> 00:02:36,620 Ĝi ne estas vere multan tempon provi kaj eltrovi kio okazas erara. 53 00:02:36,620 --> 00:02:40,920 Do ĝi vere povos malrapidigi aferoj malsupren per opcio ripozon punkto kun b, 54 00:02:40,920 --> 00:02:43,040 kaj tiam intervenanta. 55 00:02:43,040 --> 00:02:46,169 >> Tiam iam vi metis vian ripozon punkto, vi povas kuri la programon. 56 00:02:46,169 --> 00:02:47,960 Kaj se vi havas neniun komandlinio argumentoj, 57 00:02:47,960 --> 00:02:51,610 vi specifas ilin tie, ne kiam vi tajpas GDB via programo nomo. 58 00:02:51,610 --> 00:02:55,980 Vi specifas ĉiuj komandlinio argumentojn per prenante r, aŭ kuro, 59 00:02:55,980 --> 00:03:00,270 kaj tiam ajn komandliniajn argumentojn vi bezonas ene de via programo. 60 00:03:00,270 --> 00:03:03,510 Estas nombro de aliaj vere gravaj kaj utilaj komandoj 61 00:03:03,510 --> 00:03:04,970 ene de la MEP medio. 62 00:03:04,970 --> 00:03:07,540 Do mi nur rapide transiru kelkajn. 63 00:03:07,540 --> 00:03:11,320 >> La unua estas n, kiu estas mallonga por sekva, kaj vi povas tajpi sekva anstataŭ n, 64 00:03:11,320 --> 00:03:12,304 ambaŭ laborus. 65 00:03:12,304 --> 00:03:13,470 Kaj estas simple la stenografio. 66 00:03:13,470 --> 00:03:17,540 Kaj kiel vi probable jam akiris kutimis, povi tajpi aferoj 67 00:03:17,540 --> 00:03:20,520 mallonga estas ĝenerale bona. 68 00:03:20,520 --> 00:03:24,100 Kaj kio faros estas ĝi malebligos paŝi antaŭen unu bloko de kodo. 69 00:03:24,100 --> 00:03:26,170 Do ĝi movos antaŭen ĝis funkcio alvokon. 70 00:03:26,170 --> 00:03:28,350 Kaj tiam anstataŭ plonĝado en tiun funkcion 71 00:03:28,350 --> 00:03:33,130 kaj iranta tra ĉiuj tiu funkcioj kodon, ĝi nur havas la funkcion. 72 00:03:33,130 --> 00:03:34,400 >> La funkcio estos vokita. 73 00:03:34,400 --> 00:03:35,733 Ĝi faros kion ajn lia faro. 74 00:03:35,733 --> 00:03:38,870 Ĝi revenos valoron al la funkcio kiu nomis ĝin. 75 00:03:38,870 --> 00:03:42,490 Kaj tiam vi pluiru al la sekva linio de tiu voko funkcio. 76 00:03:42,490 --> 00:03:44,555 Se vi volas paŝi ene de la funkcio, 77 00:03:44,555 --> 00:03:46,430 anstataŭ nur havi ĝi ekzekutas, speciale 78 00:03:46,430 --> 00:03:50,004 se vi opinias, ke la problemo povus kuŝi ene de tiu funkcio, 79 00:03:50,004 --> 00:03:52,670 Vi povus, kompreneble, starigis ripozon atentigi interne de tiu funkcio. 80 00:03:52,670 --> 00:03:57,820 Aŭ se vi jam kurante, vi povas uzi s paŝi antaŭen unu linio de kodo. 81 00:03:57,820 --> 00:04:01,170 >> Do tiu estos paŝo en kaj plonĝo en funkcioj, 82 00:04:01,170 --> 00:04:04,750 anstataŭ ĝuste havas la ekzekuti kaj vi daŭrigas en la funkcio 83 00:04:04,750 --> 00:04:07,380 ke vi jam partoprenos elpuriganta. 84 00:04:07,380 --> 00:04:09,870 Se vi iam volis scii la valoro de variablo, 85 00:04:09,870 --> 00:04:12,507 vi povas tajpi p, aŭ Print, kaj tiam la variablo nomo. 86 00:04:12,507 --> 00:04:15,090 Kaj tio estos presi al vi, ene de la GDB medio, 87 00:04:15,090 --> 00:04:19,110 la nomo de la variablo, ke you-- Pardonu kunulinon la valoro de la variablo 88 00:04:19,110 --> 00:04:20,064 ke vi nomiĝis. 89 00:04:20,064 --> 00:04:23,230 Se vi volas scii la valoroj de ĉiu loka variablo atingebla de kie 90 00:04:23,230 --> 00:04:25,970 vi aktuale estas en via programo, vi povas tajpi info lokuloj. 91 00:04:25,970 --> 00:04:28,332 Ĝi estas multe pli rapida ol tajpado p kaj tiam cxio, 92 00:04:28,332 --> 00:04:30,540 on el ĉiuj variabloj ke vi scias ekzistis. 93 00:04:30,540 --> 00:04:34,370 Vi povas tajpi info lokuloj, kaj ĝi presos ĉion por vi. 94 00:04:34,370 --> 00:04:37,770 Poste supre estas bt, kiu estas mallongigo Reen Trace. 95 00:04:37,770 --> 00:04:41,680 Nun, ĝenerale, precipe frua en CS50, 96 00:04:41,680 --> 00:04:44,450 vi ne vere havas okazo uzi bt, aŭ Reen Trace, 97 00:04:44,450 --> 00:04:47,860 ĉar vi ne havas funkciojn ke nomas aliaj funkcioj. 98 00:04:47,860 --> 00:04:50,450 >> Vi povus havi ĉefan voki funkcion, sed tio estas probable. 99 00:04:50,450 --> 00:04:53,199 Vi ne havas tiun alian funkcion nomante alian funkcion, kiu 100 00:04:53,199 --> 00:04:54,880 vokas alian funkcion, kaj tiel plu. 101 00:04:54,880 --> 00:04:57,550 Sed kiel via programoj akiri pli kompleksa, kaj aparte 102 00:04:57,550 --> 00:05:00,290 kiam vi komencas labori kun rekursio, reen spuro 103 00:05:00,290 --> 00:05:05,150 povas esti vere utila maniero lasi vin speco de akiri iuj kunteksto sed kie 104 00:05:05,150 --> 00:05:06,460 Mi estas en mia programo. 105 00:05:06,460 --> 00:05:10,590 Do diru vi skribis vian kodon, kaj vi scias ke ĉefa nomas funkcio 106 00:05:10,590 --> 00:05:14,720 f, kiu nomas funkcio g, kiu nomas funkcio h. 107 00:05:14,720 --> 00:05:17,650 Do ni havas plurajn tavolojn de nestado okazas ĉi tie. 108 00:05:17,650 --> 00:05:19,440 >> Se vi estas interne de via GDB medio, 109 00:05:19,440 --> 00:05:21,640 kaj vi scias vian interne de h, sed vi forgesas 110 00:05:21,640 --> 00:05:27,210 pri kio akiris vin al kie vi are-- vi povas tajpi bt, aŭ reen spuro, 111 00:05:27,210 --> 00:05:32,370 kaj ĝi estos presi h, g, f ĉefa, apud iuj aliaj informoj, kiujn 112 00:05:32,370 --> 00:05:35,984 donas indikon ke, OK ĉefa nomis f, f nomas g, g nomata h, 113 00:05:35,984 --> 00:05:37,900 kaj tio estas kie mi nuntempe estas en mia programo. 114 00:05:37,900 --> 00:05:41,380 Do ĝi povas esti vere utila, precipe ĉar la kripta-Ness de GDB 115 00:05:41,380 --> 00:05:45,667 iĝas iom superfortanta, al eltrovi ĝuste kie ajn estas. 116 00:05:45,667 --> 00:05:48,500 Fine, kiam via programo estas farita, aŭ kiam vi faris elpurigi ĝi 117 00:05:48,500 --> 00:05:50,125 kaj vi volas paŝi for el la GDB medio, 118 00:05:50,125 --> 00:05:51,940 ĝi helpas scii kiel akiri el ĝi. 119 00:05:51,940 --> 00:05:55,500 Vi povas tajpi q, aŭ Quit, eliri. 120 00:05:55,500 --> 00:05:59,220 Nun, antaŭ la hodiaŭa video Mi preparis kalesxo programo 121 00:05:59,220 --> 00:06:03,900 nomata buggy1, kiun mi kompilis el dosiero nomata buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Kiel vi povus atendi, ĉi programo estas fakte kalesxon. 123 00:06:06,500 --> 00:06:08,990 Io fuŝiĝas kiam mi provas kaj ruli ĝin. 124 00:06:08,990 --> 00:06:13,014 Nun, bedaŭrinde, mi distrite forviŝita mia buggy1.c dosiero, 125 00:06:13,014 --> 00:06:15,930 tial en ordo por mi elkompreni kio okazas malĝusta kun tiu programo, 126 00:06:15,930 --> 00:06:18,770 Mi tuj devas uzi GDB ia blinde, klopodante 127 00:06:18,770 --> 00:06:22,372 navigi tra tiu programo elkompreni ĝuste kio okazas erara. 128 00:06:22,372 --> 00:06:24,580 Sed uzante nur la ilojn ni jam lernis pri, 129 00:06:24,580 --> 00:06:27,700 ni povas sufiĉe tre figuro eksteren ekzakte kio ĝi estas. 130 00:06:27,700 --> 00:06:30,740 Do ni estrus super al CS50 IDE kaj havi rigardon. 131 00:06:30,740 --> 00:06:33,155 OK, tial ni estas tie ĉi en mia CS50 IDE medio, 132 00:06:33,155 --> 00:06:35,697 kaj mi zomi iom Do vi povas vidi iom pli. 133 00:06:35,697 --> 00:06:38,530 En mia fina fenestro, se mi listo la enhavo de mia nuna direktoro 134 00:06:38,530 --> 00:06:41,250 kun LS, ni vidos, ke mi havas paron de fontodosierojn 135 00:06:41,250 --> 00:06:44,982 tie, inkluzive de la antaŭe diskutis buggy1. 136 00:06:44,982 --> 00:06:46,940 Kion ekzakte okazas kiam Mi provas kaj ruli buggy1. 137 00:06:46,940 --> 00:06:47,773 Bone ni trovu. 138 00:06:47,773 --> 00:06:52,510 Mi tajpas dot oblikvo, kalesxo, kaj mi batis Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentación faŭltoj. 140 00:06:53,670 --> 00:06:55,000 Tio ne bona. 141 00:06:55,000 --> 00:06:57,180 Se vi memoras, oni segmentación kulpo tipe 142 00:06:57,180 --> 00:07:01,540 okazas kiam ni aliri memoro ke ni ne rajtas tuŝi. 143 00:07:01,540 --> 00:07:03,820 Ni iel atingis ekster la saltegoj 144 00:07:03,820 --> 00:07:05,995 el kio la programo, la tradukilo, donis al ni. 145 00:07:05,995 --> 00:07:08,310 Kaj do jam tio estas postsigno teni en la ilkesto 146 00:07:08,310 --> 00:07:10,660 kiel ni komencas la elpuriganta procezo. 147 00:07:10,660 --> 00:07:13,620 Iu iris iom erara tie. 148 00:07:13,620 --> 00:07:15,935 >> Bone, do ni komencu ĝis la GDB medio 149 00:07:15,935 --> 00:07:19,030 kaj vidi se ni povas eltrovi kio ĝuste estas la problemo. 150 00:07:19,030 --> 00:07:21,674 Mi tuj purigi mian ekranon, kaj mi tuj tajpi GDB 151 00:07:21,674 --> 00:07:24,340 denove, por eniri la GDB medio, kaj la nomo de la programo 152 00:07:24,340 --> 00:07:27,450 ke mi volas elpurigi, buggy1. 153 00:07:27,450 --> 00:07:30,182 Ni ricevas iom mesaĝon vocxlegis simboloj de buggy1, farita. 154 00:07:30,182 --> 00:07:32,390 Ĉiuj tio signifas estas ĝi tiris kune ĉiujn la kodon, 155 00:07:32,390 --> 00:07:35,570 kaj nun ĝi estas ŝarĝita en GDB, kaj ĝi estas preta iri. 156 00:07:35,570 --> 00:07:37,140 >> Nu, kion mi volas fari? 157 00:07:37,140 --> 00:07:39,130 Ĉu vi memoras, kion la unua paŝo estas tipe 158 00:07:39,130 --> 00:07:42,540 post mi estas ene de ĉi tiu medio? 159 00:07:42,540 --> 00:07:44,540 Espereble, vi diris fiksita ripozon punkto, ĉar 160 00:07:44,540 --> 00:07:46,240 fakte tion mi volas fari. 161 00:07:46,240 --> 00:07:47,990 Nun, mi ne havas la fontkodon por tiu 162 00:07:47,990 --> 00:07:50,948 antaŭ mi, kiu estas probable ne la tipa uzo kazo, cetere. 163 00:07:50,948 --> 00:07:52,055 Vi probable volas. 164 00:07:52,055 --> 00:07:52,680 Do tio estas bona. 165 00:07:52,680 --> 00:07:55,790 Sed supozante vi ne, kio estas la funkcio ke vi scias 166 00:07:55,790 --> 00:07:58,880 ekzistas en ĉiu ununura C programon? 167 00:07:58,880 --> 00:08:04,420 Neniu afero kiom granda aŭ kiom komplikitaj ĝi estas, tiu funkcio sendube ekzistas. 168 00:08:04,420 --> 00:08:05,440 Ĉefa, dekstra? 169 00:08:05,440 --> 00:08:08,870 >> Do malsukcesanta ĉio alia, ni povas starigis ripozon punkto ĉe ĉefa. 170 00:08:08,870 --> 00:08:12,200 Kaj denove, mi povus simple tajpu rompi ĉefa, anstataŭ b. 171 00:08:12,200 --> 00:08:14,650 Kaj se vi estas scivola, se vi iam tajpas el longa komando 172 00:08:14,650 --> 00:08:16,800 kaj tiam rimarkas ke vi tajpita mistrafas, 173 00:08:16,800 --> 00:08:18,770 kaj vi volas forigi de ĉiuj kiel mi ĵus faris, 174 00:08:18,770 --> 00:08:22,029 vi povas preni Kontrolo U, kiuj volas forviŝi ĉion kaj revenigos vin 175 00:08:22,029 --> 00:08:23,570 al la komenco de la kursoro linioj. 176 00:08:23,570 --> 00:08:26,569 Multaj rapida ol nur tenu la forigi, aŭ bati ŝin faskon fojojn 177 00:08:26,569 --> 00:08:27,080 super. 178 00:08:27,080 --> 00:08:28,740 >> Do ni starigis ripozon punkto ĉe ĉefa. 179 00:08:28,740 --> 00:08:32,970 Kaj kiel vi povas vidi, ĝi diras nin havas starigis ripozon punkto ĉe dosieron buggy1.c, 180 00:08:32,970 --> 00:08:36,330 kaj ŝajne la unuan linion de kodo de ĉefa estas linio sep. 181 00:08:36,330 --> 00:08:38,080 Denove, ni ne havas la fontdosieron tie, 182 00:08:38,080 --> 00:08:40,429 sed mi supozas ke ĝi estas dirante al mi la veron. 183 00:08:40,429 --> 00:08:44,510 Kaj tiam, mi nur celas kaj ruli la programon, r. 184 00:08:44,510 --> 00:08:45,360 Komencante programo. 185 00:08:45,360 --> 00:08:48,160 Bone, do ĉi tiu mesaĝo estas iom enigmaj. 186 00:08:48,160 --> 00:08:50,160 Sed esence kio estas okazas ĉi tie estas ke estas nur 187 00:08:50,160 --> 00:08:53,350 rakontanta min Mi batis mian paŭzo punkto, ripozon punkto numero 1. 188 00:08:53,350 --> 00:08:55,877 >> Kaj tiam, tiu linio de kodo, ne tia dosiero aŭ dosierujo. 189 00:08:55,877 --> 00:08:57,710 La sola kialo, ke Mi vidas ke mesaĝo 190 00:08:57,710 --> 00:09:00,800 Estas ĉar mi distrite forviŝita mia buggy.c dosiero. 191 00:09:00,800 --> 00:09:04,050 Se mia buggy1.c dosiero ekzistis en la aktuala dosierujo, 192 00:09:04,050 --> 00:09:06,920 tiu linio rajtas ekzistus reale diru al mi kio la linio de kodo 193 00:09:06,920 --> 00:09:08,214 laŭvorte legas. 194 00:09:08,214 --> 00:09:09,380 Bedaŭrinde, mi forigis ĝin. 195 00:09:09,380 --> 00:09:14,790 Ni tuj devas speco de navigi tra ĉi iom pli blinde. 196 00:09:14,790 --> 00:09:17,330 >> Bone, do ni vidu, kia mi volas fari tie? 197 00:09:17,330 --> 00:09:21,770 Nu, mi ŝatus scii kion lokaj variabloj eble estas disponebla al mi. 198 00:09:21,770 --> 00:09:23,570 Mi komencis mian programon. 199 00:09:23,570 --> 00:09:28,515 Ni vidu kio povus esti Jam pravalorizitaj por ni. 200 00:09:28,515 --> 00:09:31,430 Mi tajpas Info lokuloj, neniu lokuloj. 201 00:09:31,430 --> 00:09:33,960 Bone, do ke ne donu al mi barelon da informo. 202 00:09:33,960 --> 00:09:37,600 Mi povus provi kaj elprinti variablo, sed mi ne scias variablo nomoj. 203 00:09:37,600 --> 00:09:39,930 Mi povus provi malantaŭa spuro, sed mi estas ene de ĉefaj, 204 00:09:39,930 --> 00:09:43,710 do mi scias ke mi ne faris alian funkcion alvoko nun. 205 00:09:43,710 --> 00:09:47,710 >> Do aspektas kiel mia nura ebloj estas uzi n aŭ tiel kaj komencas plonĝi en. 206 00:09:47,710 --> 00:09:49,630 Mi tuj uzas n. 207 00:09:49,630 --> 00:09:51,180 Do mi tajpas n. 208 00:09:51,180 --> 00:09:53,060 Ho mia Gosh, kio okazas tie. 209 00:09:53,060 --> 00:09:56,260 Programo signaloj ricevitaj, SIGSEGV segmentación kulpo, 210 00:09:56,260 --> 00:09:57,880 kaj tiam tuta amaso de aĵoj. 211 00:09:57,880 --> 00:09:58,880 Mi jam superŝutita. 212 00:09:58,880 --> 00:10:00,980 Nu, ekzistas reale multo por lerni tie. 213 00:10:00,980 --> 00:10:02,520 Do kion signifas ĉi diru al ni? 214 00:10:02,520 --> 00:10:09,180 Kio ĝi diras ni estas, tiu programo estas ronde, sed ankoraŭ ne, seg kulpo. 215 00:10:09,180 --> 00:10:12,550 Kaj precipe, mi tuj zomi eĉ plu ĉi tie, 216 00:10:12,550 --> 00:10:18,980 ĝi estas ronde seg kulpo pri iu nomita strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Nun, kiam ni ne diskutis tiu funkcio vaste. 218 00:10:22,705 --> 00:10:25,580 Sed is-- ĉar ni ne tuj paroli pri ĉiu funkcio kiu 219 00:10:25,580 --> 00:10:28,610 Ekzistas en la C norma biblioteko sed ili estas ĉiuj haveblaj al vi, 220 00:10:28,610 --> 00:10:32,110 precipe se vi prenas rigardas reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Kaj strcmp estas vere potenca funkcio kiu ekzistas interne 222 00:10:35,000 --> 00:10:38,070 de la string.h kaplinio dosiero, kiu estas kaplinio 223 00:10:38,070 --> 00:10:41,970 dosiero kiu estas dediĉita al funkcioj ke laboro kun kaj manipuli ĉenojn. 224 00:10:41,970 --> 00:10:49,830 >> Kaj precipe, kion strcmp faras estas komparas la valorojn de du ŝnuroj. 225 00:10:49,830 --> 00:10:54,160 Do mi estas ronde segmentación kulpo sur alvoko al strcmp similas. 226 00:10:54,160 --> 00:10:58,530 Mi trafis n, kaj fakte mi ricevas la mesaĝon, programo finiĝis kun signalo SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentación kulpo. Do nun Mi efektive seg riproĉis, 228 00:11:01,370 --> 00:11:06,479 kaj mia programo havas belajn multe efike forlasis. 229 00:11:06,479 --> 00:11:07,770 Jen la fino de la programo. 230 00:11:07,770 --> 00:11:10,370 Ĝi rompiĝis, ĝi kraŝis. 231 00:11:10,370 --> 00:11:14,740 Do ne multe, sed mi fakte lernis sufiĉe iomete 232 00:11:14,740 --> 00:11:16,747 de tiu malgranda sperto. 233 00:11:16,747 --> 00:11:17,580 Kion mi lernis? 234 00:11:17,580 --> 00:11:22,020 Nu, mia programo kraŝas preskaux tuj. 235 00:11:22,020 --> 00:11:26,300 Mia programo kraŝas sur alvokon al strcmp, sed mi 236 00:11:26,300 --> 00:11:30,560 ne havas lokajn variablojn en mia programo tiutempe ke ĝi kraŝas. 237 00:11:30,560 --> 00:11:37,320 Do kio ŝnuro, aŭ ĉenoj, mi povus eventuale esti komparante. 238 00:11:37,320 --> 00:11:42,140 Se mi ne havas lokan variabloj, vi eble 239 00:11:42,140 --> 00:11:45,520 diveni, ke ankaŭ mi havas tie eble estas malloka variablo, kiu povis esti vera. 240 00:11:45,520 --> 00:11:47,670 >> Sed ĝenerale, ĝi ŝajnas kiel mi komparante 241 00:11:47,670 --> 00:11:52,070 al iu kiu ne ekzistas. 242 00:11:52,070 --> 00:11:54,130 Do ni enketi ke iom plu. 243 00:11:54,130 --> 00:11:55,120 Do mi tuj purigi mian ekranon. 244 00:11:55,120 --> 00:11:57,536 Mi tuj forlasis el la GDB medio dum sekundo. 245 00:11:57,536 --> 00:12:01,300 Kaj mi pensas, OK, do ekzistas neniu lokaj variabloj en mia programo. 246 00:12:01,300 --> 00:12:06,444 Ĉu eble mi supozis pasi en cxeno kiel komandlinia argumento. 247 00:12:06,444 --> 00:12:07,610 Do ni nur testi ĉi ekstere. 248 00:12:07,610 --> 00:12:09,020 Mi ne faris tion antaŭe. 249 00:12:09,020 --> 00:12:14,244 >> Ni vidu se eble se mi kuros ĉi programo kun komandlinio argumento funkcias. 250 00:12:14,244 --> 00:12:16,140 Hm, neniu segmentación kulpo tie. 251 00:12:16,140 --> 00:12:17,870 Ĝi nur diris al mi ke mi kalkulis ĝin. 252 00:12:17,870 --> 00:12:19,170 Do eble tio estas la solvon tie. 253 00:12:19,170 --> 00:12:27,560 Kaj efektive, se mi reirus kaj rigardi la fakta fontkodon por buggy1.c, 254 00:12:27,560 --> 00:12:31,180 ŝajnas kvazaŭ kion mi faras estas Mi faras alvokon al strcmp sen 255 00:12:31,180 --> 00:12:34,010 kontrolanta ĉu fakte argv [1] ekzistas. 256 00:12:34,010 --> 00:12:36,730 Tiu estas fakte la fontkodon por buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Do kion mi vere bezonas fari tie ripari mian programon, 258 00:12:38,855 --> 00:12:40,835 supozante mi havas la file antaŭ mi, estas 259 00:12:40,835 --> 00:12:44,740 simple aldoni ĉekon por fari certas ke argc estas egala al 2. 260 00:12:44,740 --> 00:12:47,780 Do tiu ekzemplo, denove, kiel mi diris, Estas iomete elpensita, ĉu ne? 261 00:12:47,780 --> 00:12:49,840 Vi ĝenerale ne tuj hazarde forviŝi viajn fontkodo 262 00:12:49,840 --> 00:12:51,820 kaj tiam devi provi kaj elpurigi la programo. 263 00:12:51,820 --> 00:12:53,120 Sed espereble, ĝi donis vi ilustraĵo 264 00:12:53,120 --> 00:12:55,120 de la specoj de aĵoj kiuj vi povus pensi pri 265 00:12:55,120 --> 00:12:56,610 kiel vi elpurigi via programo. 266 00:12:56,610 --> 00:12:58,760 >> Kio estas la stato de aferoj tie? 267 00:12:58,760 --> 00:13:00,510 Kio variabloj mi havi atingebla al mi? 268 00:13:00,510 --> 00:13:03,600 Kie precize estas mia programo frakasante, sur kio linio, 269 00:13:03,600 --> 00:13:05,240 sur kio alvoko al kio funkcio? 270 00:13:05,240 --> 00:13:06,952 Kiajn postsignoj does kiuj donas al mi? 271 00:13:06,952 --> 00:13:08,910 Kaj tio estas ĝuste la speco de pensmaniero ke vi 272 00:13:08,910 --> 00:13:12,820 devus esti akiranta en kiam vi estas pensante pri elpurigi viajn programojn. 273 00:13:12,820 --> 00:13:13,820 >> Mi Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Jen CS50. 275 00:13:16,140 --> 00:15:08,642