1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Hi, Én vagyok [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Ma megyünk vizsgálni hibakeresés. 4 00:00:04,410 --> 00:00:06,697 Nem csak megyünk beszélni néhány technikát, 5 00:00:06,697 --> 00:00:09,280 hanem fogunk nézni néhány jellemzőjét, 6 00:00:09,280 --> 00:00:14,170 a CS50 IDE, amelyek lehetővé teszik könnyedén debug programot. 7 00:00:14,170 --> 00:00:16,272 >> Csak egy példa valami, ami elromolhat 8 00:00:16,272 --> 00:00:18,730 és ez valóban valami hogy mi már látott. 9 00:00:18,730 --> 00:00:23,200 Ebben az esetben, ez egy C program amely elfogadja egy egész szám a felhasználó, 10 00:00:23,200 --> 00:00:27,580 osztja azt a két, és biztosítja a kimenet vissza a felhasználónak. 11 00:00:27,580 --> 00:00:30,610 Most attól, amit láttunk korábban előadások, 12 00:00:30,610 --> 00:00:34,370 tudjuk, hogy ez valóban okozhat bizonyos típusú megosztottság problémák 13 00:00:34,370 --> 00:00:35,860 amikor már a páratlan számok. 14 00:00:35,860 --> 00:00:40,330 >> Pontosabban azt fogjuk csak kidobni semmit a tizedesvessző után. 15 00:00:40,330 --> 00:00:43,170 Most már tudjuk, hogy ez előfordul, hogy a helyzet. 16 00:00:43,170 --> 00:00:47,430 És ha futtatni, meg tudjuk erősíteni, a gyanú, első, összeállítása. 17 00:00:47,430 --> 00:00:50,460 És akkor, a futás és belépő egy páratlan szám. 18 00:00:50,460 --> 00:00:51,720 >> Ez nem újdonság. 19 00:00:51,720 --> 00:00:54,490 De ez valójában egy Például egy hiba, ami 20 00:00:54,490 --> 00:00:58,810 létezhet egy nagyobb program hogy egyre nehezebb a nyomára bukkanni. 21 00:00:58,810 --> 00:01:02,640 Annak ellenére, hogy tudjuk, mi a probléma van, az igazi dolog bökkenője 22 00:01:02,640 --> 00:01:06,250 Lehet, hogy próbálják azonosítani ahol kifejezetten a hiba, 23 00:01:06,250 --> 00:01:09,750 meghatározzuk, hogy mit, hogy probléma van, majd rögzítése. 24 00:01:09,750 --> 00:01:14,400 Tehát ezt az példáján hogy mi lehet valami 25 00:01:14,400 --> 00:01:19,030 hogy már tudjuk, de lehet eltemetve belüli egyéb elemeinek a kódot. 26 00:01:19,030 --> 00:01:23,090 >> Tehát nyitó ezt más forrásból kód fájlt példaként, 27 00:01:23,090 --> 00:01:27,165 Ez a megosztottság probléma most része egy nagyobb program. 28 00:01:27,165 --> 00:01:29,040 Mégis talán egy kicsit kicsit kiagyalt, és mi 29 00:01:29,040 --> 00:01:31,076 képes lehet könnyen azonosítani, főleg 30 00:01:31,076 --> 00:01:32,450 hiszen mi csak megvitatni ezt. 31 00:01:32,450 --> 00:01:38,250 De tudjuk kitalálni, hogy ez a probléma létezik a nagyobb léptékben. 32 00:01:38,250 --> 00:01:45,450 >> Ha tudom lefordítani ezt, és most futtatni, adja meg páratlan szám, 33 00:01:45,450 --> 00:01:49,816 azt látjuk, hogy nem kapunk pontos A kimeneti, hogy mi is várható. 34 00:01:49,816 --> 00:01:51,690 Ebben a konkrét esetben, azt mondhatjuk, hogy mi 35 00:01:51,690 --> 00:01:56,060 akarja számolni az összes számot egytől néhány konkrét számot. 36 00:01:56,060 --> 00:01:58,130 És azt látjuk, hogy mi hogy a különböző kérdések 37 00:01:58,130 --> 00:02:03,880 itt, ha mi vagyunk kimenetre, egyszerűen, 0 és 1, ha adunk egy bemeneti 5. 38 00:02:03,880 --> 00:02:07,380 >> Szóval már tudjuk, hogy van itt egy kis probléma. 39 00:02:07,380 --> 00:02:11,662 De mi nem tudjuk pontosan Ez a kérdés valóban létezik. 40 00:02:11,662 --> 00:02:13,620 Most az egyik módja, hogy próbáljuk kijavítani ezt 41 00:02:13,620 --> 00:02:15,745 van valami, hogy már már bevettek. 42 00:02:15,745 --> 00:02:18,880 Mi csak használni, nagyobb léptékben. 43 00:02:18,880 --> 00:02:21,680 >> On line 14, van ez a printf függvény, 44 00:02:21,680 --> 00:02:25,620 amely lehetővé teszi számunkra, hogy nyomtassa ki az állam A különböző információk. 45 00:02:25,620 --> 00:02:28,880 És ez a valami, amit generáljon a programon belül 46 00:02:28,880 --> 00:02:33,100 hogy megpróbálja kitalálni, hogy pontosan mi történik különböző sornyi kódot. 47 00:02:33,100 --> 00:02:36,350 Tehát akkor is, ha ez nem a végeredményt, hogy mi valójában 48 00:02:36,350 --> 00:02:39,830 szeretnénk termelni ki ez a program, még mindig 49 00:02:39,830 --> 00:02:42,300 Lehet, hogy néhány hibakeresés nyilatkozatok, ahol 50 00:02:42,300 --> 00:02:46,970 próbálja meg kitalálni, hogy pontosan történik belül a kódunkat. 51 00:02:46,970 --> 00:02:51,210 >> Tehát ebben az esetben, úgy lesz printf a hibakeresés tag. 52 00:02:51,210 --> 00:02:53,540 Ebben az esetben, ez az Csak egy hibakereső húr 53 00:02:53,540 --> 00:02:56,840 hogy én fel-üzembe, így válik nagyon világos a kimeneti kódomat 54 00:02:56,840 --> 00:02:59,200 mi az, hogy meg akarok mutatni. 55 00:02:59,200 --> 00:03:04,410 És kimeneti ide száma általunk számított. 56 00:03:04,410 --> 00:03:06,800 >> Ebben az esetben talán szeretném tudni, pontosan 57 00:03:06,800 --> 00:03:11,380 mi történik előtt és miután néhány konkrét számításokat. 58 00:03:11,380 --> 00:03:16,224 Szóval lehet, hogy használja a printf előtt és ezt követően sor kódot. 59 00:03:16,224 --> 00:03:18,640 Ebben az esetben is tudtam hogy ez egy kicsit világosabb 60 00:03:18,640 --> 00:03:21,960 kimondásával hibakeresés előtt és a hibakeresés után így 61 00:03:21,960 --> 00:03:26,540 hogy ne keverjük össze magam Több vonal, hogy nézd azonos. 62 00:03:26,540 --> 00:03:32,290 >> Most, ha újrafordítani ezt, és fuss ez adja meg a számot, mint öt újra, 63 00:03:32,290 --> 00:03:35,090 azt látjuk, hogy van most kimenet előtt és után 64 00:03:35,090 --> 00:03:40,670 és kiderül, hogy nem tettünk egyértelmű szétválás vagy egyértelmű, amelynek a számát 65 00:03:40,670 --> 00:03:43,680 hogy igazából szeretnék csinálni. 66 00:03:43,680 --> 00:03:48,660 Most ebben az esetben, ez az Nem igazán világos kimenet. 67 00:03:48,660 --> 00:03:52,440 Ez nem igazán egyértelmű eredményre jutni akarunk E sajátos programot. 68 00:03:52,440 --> 00:03:54,427 >> És ez, ismét egy kicsit kiagyalt. 69 00:03:54,427 --> 00:03:57,510 De talán, az egyik dolog, hogy tudnánk tenni, ha a specifikáció mondta 70 00:03:57,510 --> 00:04:01,900 hogy szeretnénk osztani ezt 2, és adjunk hozzá 1-- így más szóval, 71 00:04:01,900 --> 00:04:04,550 akarjuk, hogy kerek up-- majd megismerjük, hogy mi lehet 72 00:04:04,550 --> 00:04:08,060 Ehhez bizonyos dolgot, ebben az esetben. 73 00:04:08,060 --> 00:04:14,010 Most itt tudjuk, hogy mi lesz képes felvenni 1 mi felére csökkent száma. 74 00:04:14,010 --> 00:04:16,490 >> Nézzük újrafordítani ezt és megerősíti, hogy ez a 75 00:04:16,490 --> 00:04:18,860 viselkedik az úton, amit szeretnénk. 76 00:04:18,860 --> 00:04:21,980 Láthatjuk, hogy most, mielőtt amelynek megvan a száma 5. 77 00:04:21,980 --> 00:04:26,620 Miután megvan a 3-as szám, amely szerint a specifikáció, 78 00:04:26,620 --> 00:04:29,292 az, amit szerettünk volna csinálni. 79 00:04:29,292 --> 00:04:31,000 De ha megnézzük a kimenet van, amit lehet 80 00:04:31,000 --> 00:04:33,760 látom, hogy talán van egy másik bug összesen, ami 81 00:04:33,760 --> 00:04:36,940 hogy kezdjük a száma 0. 82 00:04:36,940 --> 00:04:39,390 >> Most megint ez valami hogy láttuk az elmúlt 83 00:04:39,390 --> 00:04:42,500 és ki tudjuk javítani nagyon könnyen. 84 00:04:42,500 --> 00:04:44,790 De ebben az esetben, mi is volt az előny 85 00:04:44,790 --> 00:04:48,940 használata a printf kifejezést közvetlenül belül a for ciklus 86 00:04:48,940 --> 00:04:52,930 tudni, hogy pontosan honnan hogy a hiba esemény történt. 87 00:04:52,930 --> 00:04:55,150 Tehát printf nyilatkozatok nagyon hasznos a 88 00:04:55,150 --> 00:04:57,940 meghatározhatja, hová, Pontosan a forráskódban, 89 00:04:57,940 --> 00:05:00,620 adott hiba történt. 90 00:05:00,620 --> 00:05:03,650 >> És az is fontos, hogy észre hogy amint írunk kódot, 91 00:05:03,650 --> 00:05:06,052 talán van feltételezések az állam a program. 92 00:05:06,052 --> 00:05:08,510 Vagy talán van feltételezések arról, hogy mi része a programnak 93 00:05:08,510 --> 00:05:13,020 valójában helyes vagy helytelen, ha későbbiekben építünk, hogy a program 94 00:05:13,020 --> 00:05:15,950 és hogy ez része egy összetett és nagyobb program 95 00:05:15,950 --> 00:05:19,700 hogy rájövünk, hogy bizonyos szempontból Az, hogy valójában hibás. 96 00:05:19,700 --> 00:05:22,680 >> Printf nem igazán segít leszűkítheti és azonosítani 97 00:05:22,680 --> 00:05:26,430 A régiók egy program, amely nem kell viselkedik pontosan úgy, hogy 98 00:05:26,430 --> 00:05:29,500 várni, mi alapján feltételezéseket. 99 00:05:29,500 --> 00:05:31,460 De van más szerszámok rendelkezésre, valamint, 100 00:05:31,460 --> 00:05:34,860 amelyek lehetővé teszik számunkra, hogy megpróbálja kitalálni hogy ha egy hiba történt, 101 00:05:34,860 --> 00:05:39,930 és azt is, konkrétan, milyen dolgokat történnek belül a program. 102 00:05:39,930 --> 00:05:41,990 >> Tehát használ printf nagyon hasznos, ha azt akarjuk, 103 00:05:41,990 --> 00:05:45,900 azonosítani konkrét területeken olyan program, amely valamilyen hiba. 104 00:05:45,900 --> 00:05:47,730 De ez is lesz unalmas egy idő után. 105 00:05:47,730 --> 00:05:50,500 Ebben az esetben, ez egy viszonylag egyszerű program 106 00:05:50,500 --> 00:05:52,750 csak egy-két változó. 107 00:05:52,750 --> 00:05:57,260 És nagyon egyszerűvé válik számunkra, hogy nyomtassa ki az értéke azokat a változókat 108 00:05:57,260 --> 00:05:59,670 keretében a nagyobb program. 109 00:05:59,670 --> 00:06:02,670 >> De lehet, hogy egy másik program, amely sok változó. 110 00:06:02,670 --> 00:06:06,530 És lehet, hogy nem elég így könnyen használható printf 111 00:06:06,530 --> 00:06:10,120 hogy próbálja értékelni, hogy mi történik hogy minden egyes ilyen változók 112 00:06:10,120 --> 00:06:13,590 mivel a program végrehajtása. 113 00:06:13,590 --> 00:06:16,960 Van egy program, ami létezik úgynevezett debugger programot. 114 00:06:16,960 --> 00:06:20,320 Ebben az esetben, az egyik, hogy mi lesz használatát a GNU debugger, vagy GDB, 115 00:06:20,320 --> 00:06:24,260 amely lehetővé teszi számunkra, hogy vizsgálja meg a belső működését a program sokkal 116 00:06:24,260 --> 00:06:25,700 részletesen. 117 00:06:25,700 --> 00:06:28,810 >> Mi lehet ténylegesen végre GDB parancssorból 118 00:06:28,810 --> 00:06:35,370 Itt egyszerűen írja GDB és a parancsot, hogy azt akarjuk, hogy debug. 119 00:06:35,370 --> 00:06:37,550 Ebben az esetben, számítanak. 120 00:06:37,550 --> 00:06:41,650 Most ebben az esetben azt látjuk, hogy ez elérkeztünk ahhoz a prompt, amely azt mondja GDB. 121 00:06:41,650 --> 00:06:44,020 És mi is valójában parancsok végrehajtására a GDB 122 00:06:44,020 --> 00:06:48,260 indulhatott végrehajtása programot, hagyd abba bizonyos pontokon, 123 00:06:48,260 --> 00:06:51,060 értékeli a változók és vizsgáljuk meg a változók 124 00:06:51,060 --> 00:06:54,152 létezik a programban állam abban a pillanatban, 125 00:06:54,152 --> 00:06:55,110 és így tovább, és így tovább. 126 00:06:55,110 --> 00:06:57,240 Ez egy csomó energiát számunkra. 127 00:06:57,240 --> 00:06:59,960 >> De ez csak azért történik hogy a CS50 IDE is 128 00:06:59,960 --> 00:07:05,870 egy GUI vagy a felhasználó Akadálymentes GDB, hogy 129 00:07:05,870 --> 00:07:11,120 lehetővé teszi számunkra, hogy ezt anélkül, A parancssori felület egyáltalán 130 00:07:11,120 --> 00:07:13,560 vagy egyáltalán még. 131 00:07:13,560 --> 00:07:16,930 Úgy, ahogy én is elérheti, hogy ez a debug gombot 132 00:07:16,930 --> 00:07:20,120 legtetején a CS50 IDE. 133 00:07:20,120 --> 00:07:24,280 Most a múltban, mi van láttam, hogy mi használja a parancsot 134 00:07:24,280 --> 00:07:27,660 vonal összeállításához majd futtatni a programot. 135 00:07:27,660 --> 00:07:29,790 >> A debug gomb működik mind a két lépést. 136 00:07:29,790 --> 00:07:34,380 De ez is felhozza a debugger fület a szélsőjobb 137 00:07:34,380 --> 00:07:38,280 amely lehetővé teszi számunkra, hogy vizsgálja meg a különböző tulajdonságok a program 138 00:07:38,280 --> 00:07:40,500 mivel fut. 139 00:07:40,500 --> 00:07:44,280 Ha rákattintok hibakeresés, ebben a esetében, ez hozza létre 140 00:07:44,280 --> 00:07:48,230 Új lap a konzol ablak legalján. 141 00:07:48,230 --> 00:07:51,160 >> És akkor láthatjuk, hogy ez a lap van Egyes információk legtetején. 142 00:07:51,160 --> 00:07:52,670 És mi is nagyrészt figyelmen kívül hagyják ezt. 143 00:07:52,670 --> 00:07:54,800 De az egyik dolog, hogy szeretnénk észre 144 00:07:54,800 --> 00:07:57,170 az, hogy kiadja ugyanaz a dolog, hogy mi 145 00:07:57,170 --> 00:08:03,000 kapnánk, ha megpróbált elfutni, hogy a A C program a terminál ablakban. 146 00:08:03,000 --> 00:08:06,230 >> Itt látjuk, hogy fut csengés, és ez már számos zászlók, 147 00:08:06,230 --> 00:08:12,660 és ez összeállítása a count.c fájlt, amely a kijelölt lap idején 148 00:08:12,660 --> 00:08:15,100 hogy megütöttem a debug. 149 00:08:15,100 --> 00:08:18,010 Tehát ez nagyon hasznos, mert Most ezzel a hibakeresés gombot, 150 00:08:18,010 --> 00:08:23,280 tudunk egyszerre lefordítani, majd A program futtatásához, hogy valójában 151 00:08:23,280 --> 00:08:24,460 szeretné futtatni. 152 00:08:24,460 --> 00:08:27,880 >> Az egyik a zászlókat, hogy fontos, ebben az esetben, 153 00:08:27,880 --> 00:08:30,190 mi már valóban használ a leghosszabb ideig 154 00:08:30,190 --> 00:08:32,450 hanem csak volt néhány kéz hullámzó [hallható], amely 155 00:08:32,450 --> 00:08:33,820 ez az egyik itt. 156 00:08:33,820 --> 00:08:35,790 Ebben csengés, azt mondja -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 Ebben az esetben, mi vagyunk mondja csengés, a fordító, 159 00:08:41,250 --> 00:08:43,820 az, hogy akarjuk lefordítani a programot. 160 00:08:43,820 --> 00:08:46,810 Hanem biztosítja mik nevezett szimbólum információk 161 00:08:46,810 --> 00:08:50,940 úgy, hogy a fordítóprogram valójában hozzáférés hogy sok a mögöttes információk 162 00:08:50,940 --> 00:08:52,610 tartalmazta a programon belül. 163 00:08:52,610 --> 00:08:55,260 >> Pontosabban, a szám A funkciók, hogy én, 164 00:08:55,260 --> 00:08:58,000 a nevét, e funkciók, A változók típusai 165 00:08:58,000 --> 00:09:01,730 hogy az említett változók, és a különféle Más dolog, hogy segítse a debugger 166 00:09:01,730 --> 00:09:04,350 végre annak működését. 167 00:09:04,350 --> 00:09:06,600 Most van itt még valami ez fontos megemlíteni 168 00:09:06,600 --> 00:09:10,280 amikor mi beszélünk működési egy programot ezen a módon. 169 00:09:10,280 --> 00:09:13,660 >> Figyeljük meg, hogy az valóban hozta létre egy új lapot a mi konzol 170 00:09:13,660 --> 00:09:14,780 alján. 171 00:09:14,780 --> 00:09:18,600 Már nem kell, hogy befolyásolja közvetlenül a terminál ablakot. 172 00:09:18,600 --> 00:09:21,420 De ez az új lap valójában egy terminál ablakot. 173 00:09:21,420 --> 00:09:26,710 Csak kifejezetten a működési programot hoztunk létre. 174 00:09:26,710 --> 00:09:29,270 >> Figyeljük meg, hogy az alján, a kombinálva valamilyen kimenetet 175 00:09:29,270 --> 00:09:33,500 által csenget a fordító és a GDB, amit nagyrészt figyelmen kívül hagyni, 176 00:09:33,500 --> 00:09:37,570 ez tulajdonképpen a kimenetét Programunk legalján. 177 00:09:37,570 --> 00:09:41,240 Most fontos, hogy észre hogy ez az egyik ablakot ténylegesen 178 00:09:41,240 --> 00:09:43,360 megmutatja a kimenet a programból 179 00:09:43,360 --> 00:09:47,190 hanem tudja fogadni input az adott programhoz is. 180 00:09:47,190 --> 00:09:49,260 >> Tehát közleményben, amely szerint Kérem adjon meg egy számot, 181 00:09:49,260 --> 00:09:53,050 amely ugyanaz kimenet, hogy mi volt volt a terminál ablakban előtt. 182 00:09:53,050 --> 00:09:55,510 De ez most bemutatott új lapon. 183 00:09:55,510 --> 00:09:56,550 Én számot adhat. 184 00:09:56,550 --> 00:10:00,900 És ez valóban funkciót, s reményeink szerint 185 00:10:00,900 --> 00:10:05,890 megmutatja nekünk a hibakeresés, teljesítmény, A kimeneti hogy lehet hibás, 186 00:10:05,890 --> 00:10:07,010 mint láttuk korábban. 187 00:10:07,010 --> 00:10:10,460 És legalul, hogy valóban van néhány további kimeneti 188 00:10:10,460 --> 00:10:14,550 a GDP-ből csak azt mondom, hogy ez a program befejeződött. 189 00:10:14,550 --> 00:10:16,655 >> Most, ahogy meglátta ebben a Különösen végigmenni, 190 00:10:16,655 --> 00:10:19,370 ez nem volt különösebben hasznos, mert még 191 00:10:19,370 --> 00:10:23,740 Bár mi volt a debugger menü jön fel, ez még mindig egy futó program. 192 00:10:23,740 --> 00:10:26,790 Egyszer sem volt, hogy valójában szünet végrehajtás nekünk 193 00:10:26,790 --> 00:10:30,767 hogy képes legyen Ellenőrizzük valamennyi A változók tartalmazott. 194 00:10:30,767 --> 00:10:32,850 Van még valami más hogy meg kell tennünk annak érdekében, 195 00:10:32,850 --> 00:10:36,910 hogy GDB felismerni, hogy szeretnénk szüneteltetheti a program végrehajtása 196 00:10:36,910 --> 00:10:42,820 és nem csak lehetővé teszi, hogy folytassa általában ahogy azt bármely más esetben. 197 00:10:42,820 --> 00:10:45,530 >> Annak érdekében, hogy szünet végrehajtását, néhány különleges vonal, 198 00:10:45,530 --> 00:10:47,830 létre kell hoznunk mi úgynevezett töréspontot. 199 00:10:47,830 --> 00:10:52,670 És egy töréspontot nagyon könnyen létre Ebben CS50 IDE azáltal, hogy az egér 200 00:10:52,670 --> 00:10:57,090 és rákattint közvetlenül balra Néhány egyedi sorszámot. 201 00:10:57,090 --> 00:10:59,920 Egyszer én, hogy egy piros pont jelenik meg, amely azt jelzi, 202 00:10:59,920 --> 00:11:02,300 hogy ez a vonal ma egy töréspontot. 203 00:11:02,300 --> 00:11:07,540 >> És a következő alkalommal, hogy futok GDB, hogy leáll végrehajtást hogy töréspontot 204 00:11:07,540 --> 00:11:10,280 amikor eléri, hogy a kódsort. 205 00:11:10,280 --> 00:11:12,230 Most ez egy fontos dolog, hogy észre 206 00:11:12,230 --> 00:11:16,140 hogy ez nem feltétlenül a Amennyiben minden kódsort 207 00:11:16,140 --> 00:11:17,880 valójában kérhető. 208 00:11:17,880 --> 00:11:23,780 Ha én is olyan függvényt akár itt, example-- void F-- 209 00:11:23,780 --> 00:11:31,230 és csak a nyomtatási sor here-- helló world-- ha soha többé nem hívja ezt a funkciót, 210 00:11:31,230 --> 00:11:34,770 ez lesz a helyzet, hogy, Ha én meg egy töréspontot itt, 211 00:11:34,770 --> 00:11:36,220 A funkció nem nevezhető. 212 00:11:36,220 --> 00:11:38,310 És ezért ez a Különösen töréspontot 213 00:11:38,310 --> 00:11:43,040 soha nem fog ténylegesen szünet a program végrehajtását. 214 00:11:43,040 --> 00:11:48,020 >> Mondjuk, hogy én helyesen létre töréspontot néhány kódsor 215 00:11:48,020 --> 00:11:50,340 hogy valóban végre kell hajtani. 216 00:11:50,340 --> 00:11:53,470 Most ebben az esetben, ez a első sorban a fő funkciója. 217 00:11:53,470 --> 00:11:56,630 Szóval akkor minden bizonnyal a helyzet hogy amint elkezdem végrehajtását, 218 00:11:56,630 --> 00:11:58,580 Az első sorban fognak elérni. 219 00:11:58,580 --> 00:12:00,230 GDB szünetelteti végrehajtását. 220 00:12:00,230 --> 00:12:04,100 És akkor én képes lesz kölcsönhatásba a debugger. 221 00:12:04,100 --> 00:12:08,480 >> Beállíthatjuk, több vonal, mint töréspontok, ha szeretné. 222 00:12:08,480 --> 00:12:11,365 Mi is létrehozhat egy sorban Itt ebben a szegmensben a kódot 223 00:12:11,365 --> 00:12:12,490 hogy soha nem fog elérni. 224 00:12:12,490 --> 00:12:14,744 És mi is meg egyet alább. 225 00:12:14,744 --> 00:12:16,660 Az ok, hogy mi lenne akarom ezt fogunk 226 00:12:16,660 --> 00:12:19,119 bemegy egy kicsit részletesen csak egy pillanatra. 227 00:12:19,119 --> 00:12:21,660 Tehát most, hadd tiltsa E további töréspontok 228 00:12:21,660 --> 00:12:24,940 hogy tudjuk meg, mi történik amikor már egyetlen szünet 229 00:12:24,940 --> 00:12:27,650 pont a programot. 230 00:12:27,650 --> 00:12:29,410 Tettem néhány változások ezt a programot. 231 00:12:29,410 --> 00:12:30,750 Szóval kell menteni. 232 00:12:30,750 --> 00:12:34,490 Én kattintson hibakeresés, így én is elkezdjük a fordítási majd 233 00:12:34,490 --> 00:12:36,880 végrehajtása a debugger. 234 00:12:36,880 --> 00:12:40,632 >> Látni fogjuk, hogy miután pillanatok, a vonal, amit választott, mint a szünet 235 00:12:40,632 --> 00:12:43,360 pont sárga színnel. 236 00:12:43,360 --> 00:12:47,440 Azt is észre, hogy a jobb felső a hibakeresés panel 237 00:12:47,440 --> 00:12:50,940 hogy a szünet ikonra vált egy kicsit játszani ikonra. 238 00:12:50,940 --> 00:12:54,710 Ez azt jelenti, hogy van szünet végrehajtás, ebben a konkrét esetben. 239 00:12:54,710 --> 00:12:57,840 És üti meg a Play gombot is lehetővé teszi számunkra, hogy folytatódik a végrehajtás 240 00:12:57,840 --> 00:13:00,000 ezen a bizonyos pontot. 241 00:13:00,000 --> 00:13:03,240 >> Figyeljük meg, hogy van egy pár más gombok áll rendelkezésre ebben a hibakeresés panel, 242 00:13:03,240 --> 00:13:04,220 is. 243 00:13:04,220 --> 00:13:09,470 Átlépni, amely lehetővé teszi számomra, hogy végre, hogy egy sor kód 244 00:13:09,470 --> 00:13:14,030 és átlépni a vonalat, hogy a következő, amely ebben az esetben, 245 00:13:14,030 --> 00:13:17,060 azt jelentené, hogy a printf utasítás végrehajtása. 246 00:13:17,060 --> 00:13:22,310 És akkor majd a szünet végrehajtás on-line 13, valahogy így. 247 00:13:22,310 --> 00:13:25,090 >> És van még egy lépéssel a funkció, amely 248 00:13:25,090 --> 00:13:28,950 akkor hasznos, ha azt korábban már létrehozott funkciók máshol a forráskódot. 249 00:13:28,950 --> 00:13:31,420 És azt akarom, hogy belépjünk azok a funkciók helyett 250 00:13:31,420 --> 00:13:33,050 végre, hogy a funkció egészére. 251 00:13:33,050 --> 00:13:37,279 De akkor nézd meg többet a lépést a funkció csak egy pillanatra. 252 00:13:37,279 --> 00:13:40,320 Most észre néhány más dolog, hogy valóban létezik ezen belül a debug panel. 253 00:13:40,320 --> 00:13:44,110 >> Van ez a testület az úgynevezett hívja verem, amely megmutatja nekünk 254 00:13:44,110 --> 00:13:45,300 hogy pontosan hol vagyunk. 255 00:13:45,300 --> 00:13:48,550 Ebben az esetben, mi belsejében a fő funkció. 256 00:13:48,550 --> 00:13:50,880 A szkript indul count.c. 257 00:13:50,880 --> 00:13:53,820 És mi történik, hogy a 13. sor, oszlop egy, ami 258 00:13:53,820 --> 00:13:58,950 Pontosan ez a kiemelt terület A forráskód jelzi is. 259 00:13:58,950 --> 00:14:02,435 >> Most észre, hogy ez is azt mutatja, alatt helyi változó szakasza 260 00:14:02,435 --> 00:14:06,710 az összes változók léteznek ezt a funkciót. 261 00:14:06,710 --> 00:14:08,930 Fontos megjegyezni, hogy az összes változók 262 00:14:08,930 --> 00:14:12,580 akkor jelenik meg a helyi változó szakaszban egy függvényen belül, 263 00:14:12,580 --> 00:14:14,380 még mielőtt azok meghatározása. 264 00:14:14,380 --> 00:14:19,160 Láthatjuk, hogy itt van egy változót nevű num, van egy alapértelmezett értéke 0, 265 00:14:19,160 --> 00:14:21,280 és ez a típus int. 266 00:14:21,280 --> 00:14:24,110 >> Most, mielőtt ténylegesen alaphelyzetbe az összes ilyen változó, 267 00:14:24,110 --> 00:14:26,685 nem vagyunk feltétlenül garantált, hogy a 0 érték. 268 00:14:26,685 --> 00:14:29,200 És attól függően, hogy a többi kivégzések hogy van végre 269 00:14:29,200 --> 00:14:32,020 és az állam a memóriát, ha ha valóban futtatni ezt a programot, 270 00:14:32,020 --> 00:14:34,605 lehet találni, hogy Nem látom értékek 0 271 00:14:34,605 --> 00:14:36,550 és ahelyett, néhány más őrült számokat. 272 00:14:36,550 --> 00:14:38,390 >> De ne aggódj. 273 00:14:38,390 --> 00:14:44,610 Ez nem lesz releváns, amíg hogy tényleg inicializálni az értéket. 274 00:14:44,610 --> 00:14:49,630 Most ebben az esetben azt látjuk, hogy Elvégeztem néhány kimenet. 275 00:14:49,630 --> 00:14:52,131 És én, most, megállt végrehajtását. 276 00:14:52,131 --> 00:14:53,880 De ebben az esetben, mi Nagyon szeretnék csinálni 277 00:14:53,880 --> 00:14:58,060 az, hogy most már átlépni ezen a vonalon kódot, így tudok ténylegesen 278 00:14:58,060 --> 00:15:04,390 lekérdezheti a felhasználó számára, hogy int, hogy akarjuk használni a programban. 279 00:15:04,390 --> 00:15:07,060 >> Most ebben az esetben, amikor Elütöttem átlépni, értesítés 280 00:15:07,060 --> 00:15:11,940 hogy a Szünet vagy inkább a Folytatás gombot változott ez a szünet gomb 281 00:15:11,940 --> 00:15:14,022 mivel ez a kód valójában a végrehajtó. 282 00:15:14,022 --> 00:15:15,730 Mi történik most az, hogy ez 283 00:15:15,730 --> 00:15:21,630 vár ránk, hogy be némi információt mint látjuk a mi kimeneti szöveges 284 00:15:21,630 --> 00:15:23,600 legalján. 285 00:15:23,600 --> 00:15:25,787 >> Tehát most, ez valójában nem szünetel, 286 00:15:25,787 --> 00:15:28,620 még akkor is, egyfajta, úgy tűnik, hogy azért, mert nem történik semmi. 287 00:15:28,620 --> 00:15:32,360 De ez csak azért történik, hogy a én különleges eset a 13. sor, 288 00:15:32,360 --> 00:15:34,210 Várom a felhasználótól. 289 00:15:34,210 --> 00:15:39,130 És így GDB nem tudunk ellenőrizni a program fut. 290 00:15:39,130 --> 00:15:43,370 >> Most a következő alkalommal, hogy én meg néhány input-- úgyhogy be, hogy az 5-ös, 291 00:15:43,370 --> 00:15:46,140 mint láttuk, a past-- Return, és mi 292 00:15:46,140 --> 00:15:51,430 észre, hogy azonnal, GDB szünetek és ismét rávilágít a következő sorban. 293 00:15:51,430 --> 00:15:55,320 De észre, hogy most, mint egy eredményeként a bevitele egy értéket, 294 00:15:55,320 --> 00:15:58,930 frissítettük, hogy értéket belülről A helyi változók, amelyek 295 00:15:58,930 --> 00:16:05,560 Nagyon hasznos, hogy pontosan tudja, mi ez a szám a memóriában. 296 00:16:05,560 --> 00:16:10,650 >> Most már tudom hogy ez a program, hogy továbbra is játszik végéig annak végrehajtását 297 00:16:10,650 --> 00:16:12,570 ütő Folytatás. 298 00:16:12,570 --> 00:16:16,410 Láthatjuk, hogy nagyon gyorsan működik a program célba végrehajtó 299 00:16:16,410 --> 00:16:19,790 ugyanekkora kapacitású hogy korábban, a debugger bezárja, 300 00:16:19,790 --> 00:16:23,170 és most ezt a programot teljesen leállt. 301 00:16:23,170 --> 00:16:25,320 >> Azt mutatják, hogy csak a alkalmazásában látta, milyen 302 00:16:25,320 --> 00:16:27,280 történik, amikor nekiütközött Folytatás. 303 00:16:27,280 --> 00:16:30,640 De mi valójában fognak vissza akarok menni ebbe a programba 304 00:16:30,640 --> 00:16:33,820 hogy mi lehet próbálni a hibakeresés Pontosan mi történik. 305 00:16:33,820 --> 00:16:37,980 Most, hogy én vagyok a hibakereső, én is Nem kell ezeket a hibakereső printf kifejezést. 306 00:16:37,980 --> 00:16:43,860 >> Így tudtam eltávolítani őket fogom csinálni Most csak azért, hogy visszatérjünk az egyszerűbb kódot 307 00:16:43,860 --> 00:16:45,950 hogy mi volt az imént. 308 00:16:45,950 --> 00:16:48,790 Most, amikor menteni a programot, és indítsa meg, 309 00:16:48,790 --> 00:16:53,700 Majd ismét, megy, hogy a kezdeti töréspontot, hogy volt a 11 sor. 310 00:16:53,700 --> 00:16:57,700 És én leszek képes ellenőrizni én változókat akarok csinálni. 311 00:16:57,700 --> 00:17:00,695 >> Ez csak azért történik, hogy ez a része nem túl érdekes, 312 00:17:00,695 --> 00:17:04,364 És tudom, hogy fogok kinyomtatni ezt a kijelentést. 313 00:17:04,364 --> 00:17:05,280 Kérem adjon meg egy számot. 314 00:17:05,280 --> 00:17:08,099 És akkor, tudom, hogy fogok megkéri a felhasználót, hogy az egész. 315 00:17:08,099 --> 00:17:13,329 Így talán, én valóban akarjuk mozgatni az én töréspontot egy kicsit lejjebb. 316 00:17:13,329 --> 00:17:16,710 >> Akkor távolítsa töréspontok kattintva, újra, közvetlenül 317 00:17:16,710 --> 00:17:18,460 balra, hogy a vonal számát. 318 00:17:18,460 --> 00:17:22,200 Hogy piros pont eltűnik, jelezve, hogy ez a töréspont most elment. 319 00:17:22,200 --> 00:17:24,780 Most ebben az esetben, végrehajtás lett állítva. 320 00:17:24,780 --> 00:17:27,770 És így nem ténylegesen fog folytathatja az adott esetben. 321 00:17:27,770 --> 00:17:30,210 De azt lehet állítani egy kis szünetet pont egy kicsit később. 322 00:17:30,210 --> 00:17:33,880 >> És ha most folytatom a kódot, akkor folytatódik, és mondd 323 00:17:33,880 --> 00:17:36,190 a lényeg az, hogy töréspontot. 324 00:17:36,190 --> 00:17:37,374 Ismét elütöttem Folytatás. 325 00:17:37,374 --> 00:17:39,040 Nem úgy tűnik, mint bármi történik. 326 00:17:39,040 --> 00:17:41,450 De ez, mert a kód bemenetre vár. 327 00:17:41,450 --> 00:17:47,900 Én meg egy 5-ös szám, az Enter leütése, és most a következő töréspontot fogja sújtani. 328 00:17:47,900 --> 00:17:50,570 >> Most ebben az esetben, ez a a kódsort 329 00:17:50,570 --> 00:17:53,820 hogy mielőtt tudtuk, történetesen hibás. 330 00:17:53,820 --> 00:17:57,590 Szóval értékelik, hogy mi történik különösen ebben az időpontban. 331 00:17:57,590 --> 00:18:02,620 Ha egy sor ki van jelölve, vonal még nem hajtották végre. 332 00:18:02,620 --> 00:18:06,490 Tehát ebben az esetben, azt látjuk, hogy van egy szám, amely 333 00:18:06,490 --> 00:18:11,610 Van egy egész úgynevezett num, aminek értéke 5. 334 00:18:11,610 --> 00:18:15,090 És fogok is fellép Egyes matek azt a számot. 335 00:18:15,090 --> 00:18:20,130 >> Ha én átlépni, hogy tudjuk észre, hogy az érték a num 336 00:18:20,130 --> 00:18:23,780 megváltozott összhangban aritmetikai, hogy mi már kész. 337 00:18:23,780 --> 00:18:26,810 És most, hogy mi vagyunk belsejében ez a hurok 338 00:18:26,810 --> 00:18:29,090 vagy most, hogy a for ciklus Maga ki van jelölve, 339 00:18:29,090 --> 00:18:32,450 azt látjuk, hogy van egy új nevű változó i, hogy 340 00:18:32,450 --> 00:18:35,370 lesz használni, hogy hurok. 341 00:18:35,370 --> 00:18:38,230 >> Most emlékszem előtt, hogy én Említette, hogy néha te 342 00:18:38,230 --> 00:18:43,470 fog látni valami őrült szám alapértelmezett előtt ez a szám 343 00:18:43,470 --> 00:18:45,530 vagy azt, hogy a változó ténylegesen inicializálni. 344 00:18:45,530 --> 00:18:49,040 Láthatjuk, hogy pontosan Itt az e változó 345 00:18:49,040 --> 00:18:51,345 úgynevezett I, amely nem Még inicializálták 346 00:18:51,345 --> 00:18:53,560 idején kiemelve. 347 00:18:53,560 --> 00:18:57,070 De látjuk, hogy vannak száma hogy valójában nem számítanak. 348 00:18:57,070 --> 00:18:57,620 >> Rendben. 349 00:18:57,620 --> 00:18:59,661 Ne aggódj emiatt mert van valójában nem 350 00:18:59,661 --> 00:19:04,970 inicializált azt a számot, amíg én átlépni ezt a sort, és az értéke 351 00:19:04,970 --> 00:19:08,560 Én már kezdeti értéke az 1-es érték. 352 00:19:08,560 --> 00:19:11,400 Tehát látni, hogy ez ténylegesen az ügy, nézzük átlépni. 353 00:19:11,400 --> 00:19:14,420 Most már látjuk, hogy ez a tétel került végrehajtásra. 354 00:19:14,420 --> 00:19:17,000 És most kiemelve ez a printf sor. 355 00:19:17,000 --> 00:19:22,230 >> És most már látom, hogy az értékeink az i és 3 változott az idők során. 356 00:19:22,230 --> 00:19:26,450 Ez nagyon hasznos, hogy nem, sőt, van átlépni vonalak többször. 357 00:19:26,450 --> 00:19:30,480 És megtalálja, amit ténylegesen belsejében történik a hurok 358 00:19:30,480 --> 00:19:33,660 és mi történik a változók belsejét, hogy a hurok 359 00:19:33,660 --> 00:19:39,200 mint hogy a program végrehajtása bekövetkezik egy lépéssel egy időben. 360 00:19:39,200 --> 00:19:41,110 >> Most ezen a ponton, azt átlépett éppen elég 361 00:19:41,110 --> 00:19:44,210 hogy én most vagyok a végén én programom. 362 00:19:44,210 --> 00:19:46,980 Ha én átlépni, hogy ez lesz ténylegesen megszűnik végrehajtása 363 00:19:46,980 --> 00:19:48,860 mint láttuk a múltban. 364 00:19:48,860 --> 00:19:52,110 Hadd újraindítani ezt, de újra, így hogy én is pont valami mást, 365 00:19:52,110 --> 00:19:53,320 is. 366 00:19:53,320 --> 00:19:55,350 >> Ebben az esetben, ez Most azt kérdezik tőlem, újra, 367 00:19:55,350 --> 00:19:57,100 egy szám, amely Én ismét be. 368 00:19:57,100 --> 00:20:00,300 De ezúttal fogok bemenni nagyobb számú, hogy a for ciklus 369 00:20:00,300 --> 00:20:02,540 majd hajtogat több alkalommal. 370 00:20:02,540 --> 00:20:06,090 Ebben az esetben, megyek hogy adjon meg egy értéket a 11. 371 00:20:06,090 --> 00:20:08,390 >> Most újra, mert azt állítva egy töréspontot a sorban 15, 372 00:20:08,390 --> 00:20:10,490 ez lesz kiemelni, hogy a vonal. 373 00:20:10,490 --> 00:20:12,980 Láthatjuk, hogy a 11-es szám helyesen 374 00:20:12,980 --> 00:20:15,560 képviselteti magát a helyi változókat. 375 00:20:15,560 --> 00:20:22,460 Odalépett, hogy most már nézd, mi történik a mi i értéke 376 00:20:22,460 --> 00:20:25,680 ahogy haladunk belül ez a for ciklus. 377 00:20:25,680 --> 00:20:31,960 Egyre növekszik minden alkalommal, amikor éri el a tetején, hogy a hurok. 378 00:20:31,960 --> 00:20:35,110 >> Most az egyik dolog, ami talán hasznos lehet csinálni a végrehajtás során 379 00:20:35,110 --> 00:20:40,490 Ennek a programnak az a számomra, hogy ténylegesen módosítsa a változók midstream látni 380 00:20:40,490 --> 00:20:42,450 mi történik az én programot. 381 00:20:42,450 --> 00:20:46,540 Ebben az esetben én valóban kattintson duplán az értéket. 382 00:20:46,540 --> 00:20:48,040 Figyeljük meg, hogy ez lesz a szövegmezőbe. 383 00:20:48,040 --> 00:20:50,280 >> Most már be különböző értékeljük összesen 384 00:20:50,280 --> 00:20:55,700 hogy milyen a program viselkedésére ha én változtam, hogy változó. 385 00:20:55,700 --> 00:20:59,560 Most, ebben az esetben a változó Én most már tartalmazza a 10-es értéket. 386 00:20:59,560 --> 00:21:02,810 De a program még mindig Megállt végrehajtását. 387 00:21:02,810 --> 00:21:07,610 Amikor átlépni, látom, hogy a értéke i, amelyek beléptem a 10, 388 00:21:07,610 --> 00:21:12,170 nem nagyobb, mint az érték a num, ami azonnal okoz a hurok 389 00:21:12,170 --> 00:21:14,240 megállítani végrehajtó. 390 00:21:14,240 --> 00:21:16,210 >> Most, hogy nem ez az egyetlen ok, hogy miért lenne 391 00:21:16,210 --> 00:21:19,450 módosítani akarja a változó helyére. 392 00:21:19,450 --> 00:21:22,210 Lehet, hogy tényleg akar hogy megpróbálja módosítani úgy, 393 00:21:22,210 --> 00:21:24,590 hogy tovább folytathassa végrehajtása a hurok 394 00:21:24,590 --> 00:21:27,370 vagy úgy, hogy lehet módosítani néhány érték, mielőtt 395 00:21:27,370 --> 00:21:32,630 elér valamilyen konkrét aritmetikai hogy hamarosan végezni. 396 00:21:32,630 --> 00:21:36,210 >> Tehát most, hogy valóban változtatni a i értéke, mint a program végrehajtása, 397 00:21:36,210 --> 00:21:39,540 ez okozta a for ciklus leszokni miatt idő előtt, hirtelen, i 398 00:21:39,540 --> 00:21:42,770 történt, hogy nagyobb, mint az értéke A szám, ami azt jelenti, hogy ez a hurok 399 00:21:42,770 --> 00:21:45,410 A már nem szükséges, hogy végre kell hajtani. 400 00:21:45,410 --> 00:21:48,780 Továbbá úgy történt, hogy a esetben, hogy mi változott az i értéke 401 00:21:48,780 --> 00:21:53,270 ha a 17. sorban is kiemelte, amely az időpontban 402 00:21:53,270 --> 00:21:56,280 hogy az a ciklus végrehajtása ténylegesen értékelni. 403 00:21:56,280 --> 00:22:00,210 >> Ha tudtam volna változtatni az értékét Én egy másik vonalon, mondjuk 19, 404 00:22:00,210 --> 00:22:03,360 láttuk volna más viselkedés, mert a 19 lenne 405 00:22:03,360 --> 00:22:08,310 végrehajtotta a ciklus előtt feltétel átértékelődött. 406 00:22:08,310 --> 00:22:11,900 Most ezen a ponton vagyok, megint, végén ezt a programot. 407 00:22:11,900 --> 00:22:15,707 És azt is lehetővé teszi, hogy folytassa ezt a lehetővé teszi a programot, hogy kilép a természetben. 408 00:22:15,707 --> 00:22:18,290 De van egy pár dolog amelyek fontosak, hogy elvegye 409 00:22:18,290 --> 00:22:19,960 ez alól vitát. 410 00:22:19,960 --> 00:22:22,490 Be kell, hogy értékelje a saját feltételezések 411 00:22:22,490 --> 00:22:24,710 arról, hogy a kódot kell viselkedik. 412 00:22:24,710 --> 00:22:28,220 Minden alkalommal, amikor úgy gondolja, hogy néhány darab A kódot tudod történik dolgozni, 413 00:22:28,220 --> 00:22:30,940 hogy lehet egy piros zászló menni vissza, és értékelje, és győződjön meg róla, 414 00:22:30,940 --> 00:22:33,470 hogy a feltételezése hogyan kód működik 415 00:22:33,470 --> 00:22:38,290 valóban igaz, hogy így van kifejezve a forráskódot. 416 00:22:38,290 --> 00:22:41,300 >> De még a pont az volt, amikor mi használ a debugger, 417 00:22:41,300 --> 00:22:43,920 akkor tegye meg töréspontok különböző sornyi kódot, 418 00:22:43,920 --> 00:22:48,110 aminek hatására a hibakereső szüneteltetheti végrehajtás minden ilyen vonal 419 00:22:48,110 --> 00:22:52,210 így értékeli a memória vagy meg is változtatja a helyére. 420 00:22:52,210 --> 00:22:55,630 És ismét, ne feledje, hogy tudsz hozzon létre több töréspont, így 421 00:22:55,630 --> 00:23:00,390 is folytatódik a végrehajtás, hagyja mint nagy része kódot, 422 00:23:00,390 --> 00:23:04,790 és akkor automatikusan szünet A következő töréspontot. 423 00:23:04,790 --> 00:23:07,760 >> Itt tulajdonképpen fejlettebb jellemzői a debugger is. 424 00:23:07,760 --> 00:23:10,170 De mi lesz, hogy utalja be Egyes utólagos videók 425 00:23:10,170 --> 00:23:14,090 annak érdekében, hogy valóban ugratni egymástól, hogyan hogy az említett bizonyos funkciók. 426 00:23:14,090 --> 00:23:15,990 Most, köszönöm Nagyon sokat nézi. 427 00:23:15,990 --> 00:23:18,080 És sok szerencsét a hibakeresés.