1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Rendben GDB. 3 00:00:06,830 --> 00:00:08,480 Mi is ez pontosan? 4 00:00:08,480 --> 00:00:11,310 Szóval GDB, amely áll a GNU debugger, 5 00:00:11,310 --> 00:00:15,040 egy igazán félelmetes eszköz, hogy tudjuk használja, hogy segítsen nekünk a hibakeresés programjainkat, 6 00:00:15,040 --> 00:00:18,210 vagy megtudja, hol a dolgok rosszul megy a programjainkon. 7 00:00:18,210 --> 00:00:22,590 GDB hihetetlenül erős, de A teljesítmény és az interakció is 8 00:00:22,590 --> 00:00:23,830 lehet egy kicsit rejtélyes. 9 00:00:23,830 --> 00:00:28,210 Ez általában egy parancssori eszköz, és ez lehet dobni egy csomó üzenetek rád. 10 00:00:28,210 --> 00:00:31,144 És ez elég nehéz elemezni, hogy pontosan mi folyik itt. 11 00:00:31,144 --> 00:00:33,560 Szerencsére, most már tett lépéseket a probléma megoldásához az Ön számára 12 00:00:33,560 --> 00:00:36,281 ahogy dolgozik a CS50. 13 00:00:36,281 --> 00:00:39,030 Ha nem használja a grafikus debugger, amely kollégám Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse beszélt meglehetősen Egy kicsit olyan videót, amely 15 00:00:41,570 --> 00:00:44,740 kell ide Most, szükség lehet 16 00:00:44,740 --> 00:00:48,270 hogy ezeket a parancssori szerszámok dolgozni GDB. 17 00:00:48,270 --> 00:00:51,250 Ha dolgozik a CS50 IDE, akkor nem kell ezt tenni. 18 00:00:51,250 --> 00:00:53,550 De ha nem dolgozik a CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 Talán verziót használ A CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 vagy más Linux operációs rendszer GDB telepítve, 21 00:00:58,860 --> 00:01:00,980 akkor szükség lehet használni E parancssori eszközöket. 22 00:01:00,980 --> 00:01:02,860 >> És mivel lehet, kell tennie, hogy ez 23 00:01:02,860 --> 00:01:06,280 Hasznos csak azért, hogy megértsük, hogyan GDB működik a parancssorból. 24 00:01:06,280 --> 00:01:09,650 De ismétlem, ha az CS50 IDE, akkor 25 00:01:09,650 --> 00:01:15,400 Használhatja a grafikus hibakereső amely be van építve az IDE. 26 00:01:15,400 --> 00:01:18,750 Tehát, hogy mennek a dolgok a GDB, hogy indítsa el a hibakeresés 27 00:01:18,750 --> 00:01:21,220 folyamat egy adott programot, mindössze annyit kell tennie 28 00:01:21,220 --> 00:01:23,810 Az a fajta GDB követ A program neve. 29 00:01:23,810 --> 00:01:28,620 Így például, ha egy program hello, akkor írja GDB helló. 30 00:01:28,620 --> 00:01:31,210 >> Ha ezt teszed, akkor lesz húzza fel a GDB környezetben. 31 00:01:31,210 --> 00:01:33,800 A gyors változni fog, és ahelyett, hogy amit általában 32 00:01:33,800 --> 00:01:35,841 van, amikor beírja a dolgokat A parancs line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- összes tipikus Linux parancsokat, a gyors 34 00:01:38,115 --> 00:01:42,200 változni fog, valószínűleg valami mint zárójelben GDB zárójelben. 35 00:01:42,200 --> 00:01:46,630 Ez az új GDB prompt, mert bent a GDB környezetben. 36 00:01:46,630 --> 00:01:49,830 Miután elindult az, hogy a környezet, van két nagy parancsok 37 00:01:49,830 --> 00:01:52,290 hogy akkor valószínűleg használni a következő sorrendben. 38 00:01:52,290 --> 00:01:55,200 >> Az első a B, amely rövid a szünet. 39 00:01:55,200 --> 00:01:58,690 És miután beírta b, akkor általában írja be a függvény nevét, 40 00:01:58,690 --> 00:02:01,040 vagy ha tudod véletlenül, hogy körül, amit sorszám 41 00:02:01,040 --> 00:02:04,100 A program megkezdése viselkedjünk egy kicsit furcsa, 42 00:02:04,100 --> 00:02:06,370 megadhat egy sorban száma ott is. 43 00:02:06,370 --> 00:02:09,660 Mi b, vagy törés, nem ez lehetővé teszi, hogy a programot 44 00:02:09,660 --> 00:02:13,270 futtatni, amíg egy bizonyos ponton, Nevezetesen, a függvény neve 45 00:02:13,270 --> 00:02:15,880 hogy meg kell adni, vagy a vonal Ön által megadott számra. 46 00:02:15,880 --> 00:02:18,590 >> És ezen a ponton, hogy megfagy végrehajtását. 47 00:02:18,590 --> 00:02:21,670 Ez egy nagyon jó dolog, mert Egyszer végrehajtása megfagyott, 48 00:02:21,670 --> 00:02:25,214 kezdhetjük nagyon lassan lépkedni a program. 49 00:02:25,214 --> 00:02:28,130 Általában ha már fut A programok, ők elég rövid. 50 00:02:28,130 --> 00:02:31,250 Általában, ha DOT perjel bármi a neve a program, az Enter leütése, 51 00:02:31,250 --> 00:02:33,470 és mielőtt villognak, a program már befejeződött. 52 00:02:33,470 --> 00:02:36,620 Ez nem igazán sok időt, hogy megpróbálja és kitalálni, mi baj. 53 00:02:36,620 --> 00:02:40,920 Szóval tényleg, hogy képes lassítani a dolgokat le beállításával egy töréspontot a b, 54 00:02:40,920 --> 00:02:43,040 majd belépjenek. 55 00:02:43,040 --> 00:02:46,169 >> Aztán egyszer megadta a szünetben pont, akkor a program futtatásához. 56 00:02:46,169 --> 00:02:47,960 És ha bármilyen parancssori 57 00:02:47,960 --> 00:02:51,610 megadja nekik itt, nem akkor, amikor beírás GDB a program nevét. 58 00:02:51,610 --> 00:02:55,980 Meg kell adni az összes parancssori érveket figyelembe r, vagy futni, 59 00:02:55,980 --> 00:03:00,270 és akkor bármi parancssori paramétereket meg kell belsejét a programot. 60 00:03:00,270 --> 00:03:03,510 Van számos más igazán fontos és hasznos parancsok 61 00:03:03,510 --> 00:03:04,970 belsejében a GDP környezetben. 62 00:03:04,970 --> 00:03:07,540 Szóval hadd gyorsan megy át néhányat. 63 00:03:07,540 --> 00:03:11,320 >> Az első az, n, ami rövid következő, beírhatja következő helyett n, 64 00:03:11,320 --> 00:03:12,304 Mindkét működne. 65 00:03:12,304 --> 00:03:13,470 És ez még csak a gyorsírás. 66 00:03:13,470 --> 00:03:17,540 És ahogy már valószínűleg ütött használt, hogy képes írja a dolgokat 67 00:03:17,540 --> 00:03:20,520 rövidebb általában jobb. 68 00:03:20,520 --> 00:03:24,100 És mit fog tenni ez lesz előrelépdelni kódtömb. 69 00:03:24,100 --> 00:03:26,170 Szóval ez lesz előrelépni amíg függvényhívás. 70 00:03:26,170 --> 00:03:28,350 Aztán ahelyett, búvárkodás, hogy a funkció 71 00:03:28,350 --> 00:03:33,130 és megy végig, hogy a funkciók kódot, akkor csak azt a funkciót. 72 00:03:33,130 --> 00:03:34,400 >> A függvény kerül meghívásra. 73 00:03:34,400 --> 00:03:35,733 Ez mindent megtenni annak munkája. 74 00:03:35,733 --> 00:03:38,870 Vissza fog térni egy értéket A funkció, amely nevezte. 75 00:03:38,870 --> 00:03:42,490 És akkor majd lépni a következő sor, hogy hívó függvényben. 76 00:03:42,490 --> 00:03:44,555 Ha azt szeretnénk, hogy lemond belsejében a funkció, 77 00:03:44,555 --> 00:03:46,430 ahelyett, hogy csak úgy, ez végre, különösen 78 00:03:46,430 --> 00:03:50,004 Ha úgy gondolja, hogy a probléma Lehet hazudni belsejét, hogy a funkció, 79 00:03:50,004 --> 00:03:52,670 akkor természetesen, meg egy kis szünetet pont belsejét, hogy a funkció. 80 00:03:52,670 --> 00:03:57,820 Vagy ha már fut, akkor Használja s előre lépés egy sor kód. 81 00:03:57,820 --> 00:04:01,170 >> Tehát ez fokozza a és belevetik magukat funkciók, 82 00:04:01,170 --> 00:04:04,750 ahelyett, hogy csak azt az execute és továbbra is az a funkciója 83 00:04:04,750 --> 00:04:07,380 hogy te vagy a hibakeresés. 84 00:04:07,380 --> 00:04:09,870 Ha valaha szeretné tudni, Az egy változó értékét, 85 00:04:09,870 --> 00:04:12,507 beírhatja p, vagy nyomtatás, majd a változó nevét. 86 00:04:12,507 --> 00:04:15,090 És, hogy kiírja neked, belsejében a GDB környezet, 87 00:04:15,090 --> 00:04:19,110 A változó nevét, hogy you-- elnézést me-- a változó értékét 88 00:04:19,110 --> 00:04:20,064 hogy már elemzi. 89 00:04:20,064 --> 00:04:23,230 Ha szeretné tudni, hogy az értékek minden helyi változó megközelíthető, ahol 90 00:04:23,230 --> 00:04:25,970 Ön jelenleg van a programot, akkor írja info helyiek. 91 00:04:25,970 --> 00:04:28,332 Ez sokkal gyorsabb, mint a gépelés p és akkor bármi, 92 00:04:28,332 --> 00:04:30,540 felsorolja ki az összes változók, hogy tudod létezik. 93 00:04:30,540 --> 00:04:34,370 Akkor írja info helyiek, és ez kiírja mindent neked. 94 00:04:34,370 --> 00:04:37,770 Következik a bt, amely rövid Vissza Trace. 95 00:04:37,770 --> 00:04:41,680 Most, általában, különösen korán CS50, 96 00:04:41,680 --> 00:04:44,450 akkor nem igazán lesz alkalmunk használni bt, vagy a Vissza Trace, 97 00:04:44,450 --> 00:04:47,860 mert nem rendelkező függvények hogy hívja egyéb funkciók. 98 00:04:47,860 --> 00:04:50,450 >> Lehet, hogy főbb hívást a funkciót, de ez valószínűleg azt. 99 00:04:50,450 --> 00:04:53,199 Nem kell, hogy más funkciót hív egy másik funkció, amely 100 00:04:53,199 --> 00:04:54,880 kéri egy másik funkció, és így tovább. 101 00:04:54,880 --> 00:04:57,550 De mivel a programok minél több összetett, és különösen 102 00:04:57,550 --> 00:05:00,290 ha elkezd dolgozni A rekurzió, vissza nyoma 103 00:05:00,290 --> 00:05:05,150 lehet egy nagyon jó módja, hogy segítségével fajta egy kis kontextust, ahol 104 00:05:05,150 --> 00:05:06,460 Én vagyok az én programom. 105 00:05:06,460 --> 00:05:10,590 Tehát mondjuk, megírtad a kódot, és Tudja, hogy a fő meghív egy függvényt 106 00:05:10,590 --> 00:05:14,720 f, amely felhívja a funkciót g, amely felhívja a funkciót h. 107 00:05:14,720 --> 00:05:17,650 Tehát van több réteg A fészkelő folyik itt. 108 00:05:17,650 --> 00:05:19,440 >> Ha belseje A GDB környezet, 109 00:05:19,440 --> 00:05:21,640 és tudod, hogy a belső A h, de elfelejtette 110 00:05:21,640 --> 00:05:27,210 mit kaptam, hogy hol are-- beírhatja bt, vagy vissza nyoma, 111 00:05:27,210 --> 00:05:32,370 és kiírja h, g, f fő, mellett néhány egyéb információt, amely 112 00:05:32,370 --> 00:05:35,984 ad egy támpontot, hogy OK fő nevezett, f, f nevezett g g úgynevezett H, 113 00:05:35,984 --> 00:05:37,900 és ez az, ahol én Jelenleg vagyok az én programban. 114 00:05:37,900 --> 00:05:41,380 Így lehet igazán hasznos, különösen mivel a rejtélyes-ségét GDB 115 00:05:41,380 --> 00:05:45,667 lesz egy kicsit nyomasztó, hogy megtudja, pontosan hol van. 116 00:05:45,667 --> 00:05:48,500 Végül, amikor a program véget ért, vagy ha végeztél a hibajavítással 117 00:05:48,500 --> 00:05:50,125 és azt szeretné, hogy lépjen el A GDB környezetben, 118 00:05:50,125 --> 00:05:51,940 jó, ha tudjuk, hogyan kell kijutni belőle. 119 00:05:51,940 --> 00:05:55,500 Akkor írja q, vagy kilép, kijutni. 120 00:05:55,500 --> 00:05:59,220 Most, mielőtt a mai videó Elkészítettem a hibás programot 121 00:05:59,220 --> 00:06:03,900 nevű buggy1, amit össze fájlból néven buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Amint az várható, ez a program valójában hibás. 123 00:06:06,500 --> 00:06:08,990 Valami elromlik amikor megpróbálom és futtatni. 124 00:06:08,990 --> 00:06:13,014 Most, sajnos, én véletlenül töröltem a buggy1.c fájlt, 125 00:06:13,014 --> 00:06:15,930 így annak érdekében számomra, hogy kitaláljuk, mi baj ezzel a programmal, 126 00:06:15,930 --> 00:06:18,770 Megyek kell használni GDB fajta vakon próbál 127 00:06:18,770 --> 00:06:22,372 eligazodni e program kitalálni, hogy pontosan mi baj. 128 00:06:22,372 --> 00:06:24,580 De használ csak eszközök mi már értesült, 129 00:06:24,580 --> 00:06:27,700 viszonylag jól lehet figura hogy pontosan mi ez. 130 00:06:27,700 --> 00:06:30,740 Tehát legyen a feje fölött, hogy CS50 IDE és egy pillantást. 131 00:06:30,740 --> 00:06:33,155 OK, így itt vagyunk én CS50 IDE környezetben, 132 00:06:33,155 --> 00:06:35,697 és én nagyítás egy kicsit így láthatja, egy kicsit több. 133 00:06:35,697 --> 00:06:38,530 Az én terminál ablakban, ha listához tartalmát a jelenlegi igazgató 134 00:06:38,530 --> 00:06:41,250 ls, majd meglátjuk, hogy én Van egy-két forrás fájlok 135 00:06:41,250 --> 00:06:44,982 itt, beleértve a korábban tárgyalt buggy1. 136 00:06:44,982 --> 00:06:46,940 Pontosan mi megy, ha Megpróbálom, és fuss buggy1. 137 00:06:46,940 --> 00:06:47,773 Nos nézzük meg. 138 00:06:47,773 --> 00:06:52,510 Azt írja dot perjel, buggy, és megütöttem az Enter billentyűt. 139 00:06:52,510 --> 00:06:53,670 >> Szegmentációs hiba. 140 00:06:53,670 --> 00:06:55,000 Ez nem jó. 141 00:06:55,000 --> 00:06:57,180 Ha felidézzük, egy szegmentációs hiba jellemzően 142 00:06:57,180 --> 00:07:01,540 fordul elő, amikor elérheti memória hogy mi nem szabad hozzányúlni. 143 00:07:01,540 --> 00:07:03,820 Már valahogy elérte határain kívülre 144 00:07:03,820 --> 00:07:05,995 amit a program, a fordító, adott nekünk. 145 00:07:05,995 --> 00:07:08,310 És így már ez a nyom, hogy az eszköztár 146 00:07:08,310 --> 00:07:10,660 kezdjük a hibakeresési folyamat. 147 00:07:10,660 --> 00:07:13,620 Valami ment egy kicsit rossz itt. 148 00:07:13,620 --> 00:07:15,935 >> Rendben, akkor kezdjük akár a GDB környezet 149 00:07:15,935 --> 00:07:19,030 és hátha tudunk kitalálni pontosan mi a probléma. 150 00:07:19,030 --> 00:07:21,674 Megyek, hogy törölje a képernyő, és megyek írja GDB 151 00:07:21,674 --> 00:07:24,340 újra, hogy belépjen a GDB környezetben, és a program nevét 152 00:07:24,340 --> 00:07:27,450 hogy szeretnék, hogy debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Kapunk egy kis üzenetet, olvasás szimbólumok buggy1, kész. 154 00:07:30,182 --> 00:07:32,390 Mindez azt jelenti, ez húzta együttesen az összes kódot, 155 00:07:32,390 --> 00:07:35,570 és most ez már betöltött GDB, és ez kész. 156 00:07:35,570 --> 00:07:37,140 >> Nos, mit akarok csinálni? 157 00:07:37,140 --> 00:07:39,130 Emlékszik, amit a első lépés tipikusan 158 00:07:39,130 --> 00:07:42,540 után én vagyok benne ebben a környezetben? 159 00:07:42,540 --> 00:07:44,540 Remélhetőleg, ha a készlet egy töréspontot, mert 160 00:07:44,540 --> 00:07:46,240 Valójában ez az, amit csinálni akarok. 161 00:07:46,240 --> 00:07:47,990 Nos, én nem rendelkeznek a forráskód erre 162 00:07:47,990 --> 00:07:50,948 előttem, ami valószínűleg nem az a tipikus felhasználása esetén, az úton. 163 00:07:50,948 --> 00:07:52,055 Valószínűleg. 164 00:07:52,055 --> 00:07:52,680 Szóval ez jó. 165 00:07:52,680 --> 00:07:55,790 De feltételezve, hogy nem, mi Az egyik funkciója, hogy tudod, 166 00:07:55,790 --> 00:07:58,880 létezik minden egyes C program? 167 00:07:58,880 --> 00:08:04,420 Nem számít, milyen nagy vagy milyen bonyolult ez, ez a funkció biztosan létezik. 168 00:08:04,420 --> 00:08:05,440 Fő, ugye? 169 00:08:05,440 --> 00:08:08,870 >> Tehát mivel nem minden mást, akkor Állítson be egy töréspontot a fő. 170 00:08:08,870 --> 00:08:12,200 És megint, én is csak írja megtörni fő helyett b. 171 00:08:12,200 --> 00:08:14,650 És ha kíváncsi, ha valaha írja ki a hosszú parancs 172 00:08:14,650 --> 00:08:16,800 majd rájönnek, hogy Ön gépelt a rossz dolog, 173 00:08:16,800 --> 00:08:18,770 és szeretne megszabadulni Az összes, mint én csináltam, 174 00:08:18,770 --> 00:08:22,029 tudod irányítani U, amely törölni mindent és hozza vissza 175 00:08:22,029 --> 00:08:23,570 hogy az elején a kurzort vonalak. 176 00:08:23,570 --> 00:08:26,569 Egy sokkal gyorsabb, mint csak lenyomva a törölni, vagy üti meg egy csomó alkalommal 177 00:08:26,569 --> 00:08:27,080 vége. 178 00:08:27,080 --> 00:08:28,740 >> Szóval megbeszélünk egy töréspontot a fő. 179 00:08:28,740 --> 00:08:32,970 És amint látod, azt mondja, mi már Állítson be egy töréspontot a fájl buggy1.c, 180 00:08:32,970 --> 00:08:36,330 és látszólag az első sorban A kódex fő van vonalon hét. 181 00:08:36,330 --> 00:08:38,080 Ismét nincs A forrás fájl van, 182 00:08:38,080 --> 00:08:40,429 de feltételezem, hogy ez mondja el az igazat. 183 00:08:40,429 --> 00:08:44,510 És akkor, csak próbálom és futtassa a programot, r. 184 00:08:44,510 --> 00:08:45,360 Kezdve programot. 185 00:08:45,360 --> 00:08:48,160 Rendben, tehát ezt az üzenetet egy kicsit rejtélyes. 186 00:08:48,160 --> 00:08:50,160 De alapvetően mi itt történik, ez csak 187 00:08:50,160 --> 00:08:53,350 mondja nekem, amit hit a szünetben pont, töréspontot száma 1. 188 00:08:53,350 --> 00:08:55,877 >> És akkor, hogy kódsort, Nincs ilyen fájl vagy könyvtár. 189 00:08:55,877 --> 00:08:57,710 Az egyetlen ok, hogy Látok, hogy az üzenet 190 00:08:57,710 --> 00:09:00,800 azért van, mert én véletlenül töröltem a buggy.c fájlt. 191 00:09:00,800 --> 00:09:04,050 Ha a fájl már létezett buggy1.c Az aktuális könyvtárban, 192 00:09:04,050 --> 00:09:06,920 ezt a vonalat ott ténylegesen mondja meg, mi a kódsort 193 00:09:06,920 --> 00:09:08,214 Szó szerint így szól. 194 00:09:08,214 --> 00:09:09,380 Sajnos, én törölte azt. 195 00:09:09,380 --> 00:09:14,790 Mi lesz, hogy milyen navigálni ezen keresztül egy kicsit vakon. 196 00:09:14,790 --> 00:09:17,330 >> OK, lássuk, mit akarok itt csinálni? 197 00:09:17,330 --> 00:09:21,770 Nos, szeretném tudni, hogy mi a helyi változók talán állnak hozzám. 198 00:09:21,770 --> 00:09:23,570 Elkezdtem a programot. 199 00:09:23,570 --> 00:09:28,515 Lássuk, mit lehet már el van indítva a számunkra. 200 00:09:28,515 --> 00:09:31,430 Azt írja Info helyiek, sem a helyiek. 201 00:09:31,430 --> 00:09:33,960 Rendben, úgy, hogy nem adj egy csomó információt. 202 00:09:33,960 --> 00:09:37,600 Tudtam kipróbálni, és nyomtassa ki a változó, de nem tudom, minden változó nevét. 203 00:09:37,600 --> 00:09:39,930 Tudtam próbálni egy hátsó nyoma, de biztos vagyok benne a fő, 204 00:09:39,930 --> 00:09:43,710 így tudom, hogy én még nem Egy másik függvényhívás most. 205 00:09:43,710 --> 00:09:47,710 >> Tehát úgy néz ki, mint az én egyetlen lehetőség használatához n, vagy úgy, és elkezd merülni. 206 00:09:47,710 --> 00:09:49,630 Én fogom használni n. 207 00:09:49,630 --> 00:09:51,180 Szóval írja n. 208 00:09:51,180 --> 00:09:53,060 Oh, istenem, mi folyik itt. 209 00:09:53,060 --> 00:09:56,260 Program vett jelek, SIGSEGV szegmentációs hibát, 210 00:09:56,260 --> 00:09:57,880 majd egy csomó cuccot. 211 00:09:57,880 --> 00:09:58,880 Én már amúgy is túlterhelt. 212 00:09:58,880 --> 00:10:00,980 Nos, van valójában egy sokat lehet tanulni itt. 213 00:10:00,980 --> 00:10:02,520 Szóval mit is jelent ez nekünk? 214 00:10:02,520 --> 00:10:09,180 Mi azt mondja, van, ez a program hamarosan, de még nem, seg hiba. 215 00:10:09,180 --> 00:10:12,550 És különösen, megyek Nagyításhoz még tovább itt, 216 00:10:12,550 --> 00:10:18,980 ez arról szól, hogy seg hiba kb úgynevezett strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Most lehet, hogy nem tárgyalt Ezt a funkciót széles körben. 218 00:10:22,705 --> 00:10:25,580 De is-- mert nem megyünk beszélni minden funkciója, hogy 219 00:10:25,580 --> 00:10:28,610 létezik, szabványos C library-- de ők mind áll az Ön rendelkezésére, 220 00:10:28,610 --> 00:10:32,110 különösen akkor, ha veszel egy nézd meg reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 És strcmp egy nagyon erős funkciót, amely belül létezik 222 00:10:35,000 --> 00:10:38,070 A string.h fejléc fájl, amely egy fejléc 223 00:10:38,070 --> 00:10:41,970 fájl, amely elkötelezett a funkciók hogy működjenek együtt, és manipulálni húrok. 224 00:10:41,970 --> 00:10:49,830 >> És különösen, hogy mit csinál, strcmp összehasonlítja a két szálakat. 225 00:10:49,830 --> 00:10:54,160 Így vagyok, hogy szegmentációs hiba Egy hívás, hogy strcmp látszik. 226 00:10:54,160 --> 00:10:58,530 Elütöttem n, és valójában az üzenetet kapom, programot lezárni jel SIGSEGV 227 00:10:58,530 --> 00:11:01,370 felosztási hiba. Akkor most Igazából seg hibázott, 228 00:11:01,370 --> 00:11:06,479 és én elég program sokkal hatékonyabban feladta. 229 00:11:06,479 --> 00:11:07,770 Ez az a program végén. 230 00:11:07,770 --> 00:11:10,370 Elromlott, amikor összeomlott. 231 00:11:10,370 --> 00:11:14,740 Szóval nem volt sok, de én valójában nem tanulni egy kicsit 232 00:11:14,740 --> 00:11:16,747 ebből a kevés tapasztalattal. 233 00:11:16,747 --> 00:11:17,580 Mit tanultam? 234 00:11:17,580 --> 00:11:22,020 Nos, én program lefagy nagyjából azonnal. 235 00:11:22,020 --> 00:11:26,300 Saját programot összeomlik A hívás a strcmp, de én 236 00:11:26,300 --> 00:11:30,560 nincs lokális változók az én programot idején, hogy összeomlik. 237 00:11:30,560 --> 00:11:37,320 Tehát mi húr, vagy húrok, is tudnék lenni összehasonlításával. 238 00:11:37,320 --> 00:11:42,140 Ha nem rendelkezik lokális változók, lehet, 239 00:11:42,140 --> 00:11:45,520 Feltételezem, hogy én have-- ott talán egy globális változó, ami lehet igaz. 240 00:11:45,520 --> 00:11:47,670 >> De általában, úgy tűnik, mint én vagyok összehasonlítása 241 00:11:47,670 --> 00:11:52,070 valamire, ami nem létezik. 242 00:11:52,070 --> 00:11:54,130 Úgyhogy vizsgálja hogy egy kicsit tovább. 243 00:11:54,130 --> 00:11:55,120 Így fogok, hogy törölje a képernyő. 244 00:11:55,120 --> 00:11:57,536 Megyek kilépsz a GDB környezetben egy pillanatra. 245 00:11:57,536 --> 00:12:01,300 És azt gondolom, OK, így van rá nincs helyi változókat a programom. 246 00:12:01,300 --> 00:12:06,444 Kíváncsi vagyok, ha esetleg kéne át egy szövegben, mint egy parancssori argumentum. 247 00:12:06,444 --> 00:12:07,610 Úgyhogy csak kipróbálni ezt ki. 248 00:12:07,610 --> 00:12:09,020 Én nem csináltam ilyet. 249 00:12:09,020 --> 00:12:14,244 >> Lássuk, talán ha a program futtatásához egy parancssori argumentum működik. 250 00:12:14,244 --> 00:12:16,140 Huh, nem szegmentációs hiba van. 251 00:12:16,140 --> 00:12:17,870 Ez csak azt mondta nekem, hogy én rájöttem. 252 00:12:17,870 --> 00:12:19,170 Szóval lehet, hogy ez a javítás itt. 253 00:12:19,170 --> 00:12:27,560 És valóban, ha megyek vissza, és nézd meg Az aktuális forráskódját buggy1.c, 254 00:12:27,560 --> 00:12:31,180 Úgy tűnik, mintha mit csinálok a Csinálok egy hívás strcmp nélkül 255 00:12:31,180 --> 00:12:34,010 annak ellenőrzése, hogy valóban argv [1] létezik. 256 00:12:34,010 --> 00:12:36,730 Ez tulajdonképpen a forráskódját buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Tehát amit igazán kell itt csinálni, hogy leviszi program 258 00:12:38,855 --> 00:12:40,835 feltételezve azt, hogy a fájl előttem, van 259 00:12:40,835 --> 00:12:44,740 hogy csak adj egy csekket, hogy arról, hogy argc egyenlő 2. 260 00:12:44,740 --> 00:12:47,780 Így ez a példa, megint, mint már mondtam, egy kicsit kiagyalt, nem igaz? 261 00:12:47,780 --> 00:12:49,840 Te általában nem fog véletlenül törli a forráskódot 262 00:12:49,840 --> 00:12:51,820 majd meg kell próbálni és hibakeresés a programot. 263 00:12:51,820 --> 00:12:53,120 De remélhetőleg, ez adta Ön egy illusztráció 264 00:12:53,120 --> 00:12:55,120 A dolgokat, hogy akkor lehet gondolkodni 265 00:12:55,120 --> 00:12:56,610 mint te hibakeresés a program. 266 00:12:56,610 --> 00:12:58,760 >> Mi a helyzet itt? 267 00:12:58,760 --> 00:13:00,510 Milyen változók tudom Van elérhető velem? 268 00:13:00,510 --> 00:13:03,600 Hol van pontosan a programom összeomlik, milyen vonalon, 269 00:13:03,600 --> 00:13:05,240 milyen hívást milyen funkciót? 270 00:13:05,240 --> 00:13:06,952 Milyen nyomokat nem adnak nekem? 271 00:13:06,952 --> 00:13:08,910 És pontosan ez az fajta gondolkodásmód, hogy 272 00:13:08,910 --> 00:13:12,820 kell bekerülni, ha éppen gondolkodik hibakeresést a programokat. 273 00:13:12,820 --> 00:13:13,820 >> Én Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ez CS50. 275 00:13:16,140 --> 00:15:08,642