DOUG LLOYD: Rendben GDB. Mi is ez pontosan? Szóval GDB, amely áll a GNU debugger, egy igazán félelmetes eszköz, hogy tudjuk használja, hogy segítsen nekünk a hibakeresés programjainkat, vagy megtudja, hol a dolgok rosszul megy a programjainkon. GDB hihetetlenül erős, de A teljesítmény és az interakció is lehet egy kicsit rejtélyes. Ez általában egy parancssori eszköz, és ez lehet dobni egy csomó üzenetek rád. És ez elég nehéz elemezni, hogy pontosan mi folyik itt. Szerencsére, most már tett lépéseket a probléma megoldásához az Ön számára ahogy dolgozik a CS50. Ha nem használja a grafikus debugger, amely kollégám Dan Armandarse beszélt meglehetősen Egy kicsit olyan videót, amely kell ide Most, szükség lehet hogy ezeket a parancssori szerszámok dolgozni GDB. Ha dolgozik a CS50 IDE, akkor nem kell ezt tenni. De ha nem dolgozik a CS50 IDE, Talán verziót használ A CS50 Appliance, vagy más Linux operációs rendszer GDB telepítve, akkor szükség lehet használni E parancssori eszközöket. És mivel lehet, kell tennie, hogy ez Hasznos csak azért, hogy megértsük, hogyan GDB működik a parancssorból. De ismétlem, ha az CS50 IDE, akkor Használhatja a grafikus hibakereső amely be van építve az IDE. Tehát, hogy mennek a dolgok a GDB, hogy indítsa el a hibakeresés folyamat egy adott programot, mindössze annyit kell tennie Az a fajta GDB követ A program neve. Így például, ha egy program hello, akkor írja GDB helló. Ha ezt teszed, akkor lesz húzza fel a GDB környezetben. A gyors változni fog, és ahelyett, hogy amit általában van, amikor beírja a dolgokat A parancs line-- ls, cd-- összes tipikus Linux parancsokat, a gyors változni fog, valószínűleg valami mint zárójelben GDB zárójelben. Ez az új GDB prompt, mert bent a GDB környezetben. Miután elindult az, hogy a környezet, van két nagy parancsok hogy akkor valószínűleg használni a következő sorrendben. Az első a B, amely rövid a szünet. És miután beírta b, akkor általában írja be a függvény nevét, vagy ha tudod véletlenül, hogy körül, amit sorszám A program megkezdése viselkedjünk egy kicsit furcsa, megadhat egy sorban száma ott is. Mi b, vagy törés, nem ez lehetővé teszi, hogy a programot futtatni, amíg egy bizonyos ponton, Nevezetesen, a függvény neve hogy meg kell adni, vagy a vonal Ön által megadott számra. És ezen a ponton, hogy megfagy végrehajtását. Ez egy nagyon jó dolog, mert Egyszer végrehajtása megfagyott, kezdhetjük nagyon lassan lépkedni a program. Általában ha már fut A programok, ők elég rövid. Általában, ha DOT perjel bármi a neve a program, az Enter leütése, és mielőtt villognak, a program már befejeződött. Ez nem igazán sok időt, hogy megpróbálja és kitalálni, mi baj. Szóval tényleg, hogy képes lassítani a dolgokat le beállításával egy töréspontot a b, majd belépjenek. Aztán egyszer megadta a szünetben pont, akkor a program futtatásához. És ha bármilyen parancssori megadja nekik itt, nem akkor, amikor beírás GDB a program nevét. Meg kell adni az összes parancssori érveket figyelembe r, vagy futni, és akkor bármi parancssori paramétereket meg kell belsejét a programot. Van számos más igazán fontos és hasznos parancsok belsejében a GDP környezetben. Szóval hadd gyorsan megy át néhányat. Az első az, n, ami rövid következő, beírhatja következő helyett n, Mindkét működne. És ez még csak a gyorsírás. És ahogy már valószínűleg ütött használt, hogy képes írja a dolgokat rövidebb általában jobb. És mit fog tenni ez lesz előrelépdelni kódtömb. Szóval ez lesz előrelépni amíg függvényhívás. Aztán ahelyett, búvárkodás, hogy a funkció és megy végig, hogy a funkciók kódot, akkor csak azt a funkciót. A függvény kerül meghívásra. Ez mindent megtenni annak munkája. Vissza fog térni egy értéket A funkció, amely nevezte. És akkor majd lépni a következő sor, hogy hívó függvényben. Ha azt szeretnénk, hogy lemond belsejében a funkció, ahelyett, hogy csak úgy, ez végre, különösen Ha úgy gondolja, hogy a probléma Lehet hazudni belsejét, hogy a funkció, akkor természetesen, meg egy kis szünetet pont belsejét, hogy a funkció. Vagy ha már fut, akkor Használja s előre lépés egy sor kód. Tehát ez fokozza a és belevetik magukat funkciók, ahelyett, hogy csak azt az execute és továbbra is az a funkciója hogy te vagy a hibakeresés. Ha valaha szeretné tudni, Az egy változó értékét, beírhatja p, vagy nyomtatás, majd a változó nevét. És, hogy kiírja neked, belsejében a GDB környezet, A változó nevét, hogy you-- elnézést me-- a változó értékét hogy már elemzi. Ha szeretné tudni, hogy az értékek minden helyi változó megközelíthető, ahol Ön jelenleg van a programot, akkor írja info helyiek. Ez sokkal gyorsabb, mint a gépelés p és akkor bármi, felsorolja ki az összes változók, hogy tudod létezik. Akkor írja info helyiek, és ez kiírja mindent neked. Következik a bt, amely rövid Vissza Trace. Most, általában, különösen korán CS50, akkor nem igazán lesz alkalmunk használni bt, vagy a Vissza Trace, mert nem rendelkező függvények hogy hívja egyéb funkciók. Lehet, hogy főbb hívást a funkciót, de ez valószínűleg azt. Nem kell, hogy más funkciót hív egy másik funkció, amely kéri egy másik funkció, és így tovább. De mivel a programok minél több összetett, és különösen ha elkezd dolgozni A rekurzió, vissza nyoma lehet egy nagyon jó módja, hogy segítségével fajta egy kis kontextust, ahol Én vagyok az én programom. Tehát mondjuk, megírtad a kódot, és Tudja, hogy a fő meghív egy függvényt f, amely felhívja a funkciót g, amely felhívja a funkciót h. Tehát van több réteg A fészkelő folyik itt. Ha belseje A GDB környezet, és tudod, hogy a belső A h, de elfelejtette mit kaptam, hogy hol are-- beírhatja bt, vagy vissza nyoma, és kiírja h, g, f fő, mellett néhány egyéb információt, amely ad egy támpontot, hogy OK fő nevezett, f, f nevezett g g úgynevezett H, és ez az, ahol én Jelenleg vagyok az én programban. Így lehet igazán hasznos, különösen mivel a rejtélyes-ségét GDB lesz egy kicsit nyomasztó, hogy megtudja, pontosan hol van. Végül, amikor a program véget ért, vagy ha végeztél a hibajavítással és azt szeretné, hogy lépjen el A GDB környezetben, jó, ha tudjuk, hogyan kell kijutni belőle. Akkor írja q, vagy kilép, kijutni. Most, mielőtt a mai videó Elkészítettem a hibás programot nevű buggy1, amit össze fájlból néven buggy1.c. Amint az várható, ez a program valójában hibás. Valami elromlik amikor megpróbálom és futtatni. Most, sajnos, én véletlenül töröltem a buggy1.c fájlt, így annak érdekében számomra, hogy kitaláljuk, mi baj ezzel a programmal, Megyek kell használni GDB fajta vakon próbál eligazodni e program kitalálni, hogy pontosan mi baj. De használ csak eszközök mi már értesült, viszonylag jól lehet figura hogy pontosan mi ez. Tehát legyen a feje fölött, hogy CS50 IDE és egy pillantást. OK, így itt vagyunk én CS50 IDE környezetben, és én nagyítás egy kicsit így láthatja, egy kicsit több. Az én terminál ablakban, ha listához tartalmát a jelenlegi igazgató ls, majd meglátjuk, hogy én Van egy-két forrás fájlok itt, beleértve a korábban tárgyalt buggy1. Pontosan mi megy, ha Megpróbálom, és fuss buggy1. Nos nézzük meg. Azt írja dot perjel, buggy, és megütöttem az Enter billentyűt. Szegmentációs hiba. Ez nem jó. Ha felidézzük, egy szegmentációs hiba jellemzően fordul elő, amikor elérheti memória hogy mi nem szabad hozzányúlni. Már valahogy elérte határain kívülre amit a program, a fordító, adott nekünk. És így már ez a nyom, hogy az eszköztár kezdjük a hibakeresési folyamat. Valami ment egy kicsit rossz itt. Rendben, akkor kezdjük akár a GDB környezet és hátha tudunk kitalálni pontosan mi a probléma. Megyek, hogy törölje a képernyő, és megyek írja GDB újra, hogy belépjen a GDB környezetben, és a program nevét hogy szeretnék, hogy debug, buggy1. Kapunk egy kis üzenetet, olvasás szimbólumok buggy1, kész. Mindez azt jelenti, ez húzta együttesen az összes kódot, és most ez már betöltött GDB, és ez kész. Nos, mit akarok csinálni? Emlékszik, amit a első lépés tipikusan után én vagyok benne ebben a környezetben? Remélhetőleg, ha a készlet egy töréspontot, mert Valójában ez az, amit csinálni akarok. Nos, én nem rendelkeznek a forráskód erre előttem, ami valószínűleg nem az a tipikus felhasználása esetén, az úton. Valószínűleg. Szóval ez jó. De feltételezve, hogy nem, mi Az egyik funkciója, hogy tudod, létezik minden egyes C program? Nem számít, milyen nagy vagy milyen bonyolult ez, ez a funkció biztosan létezik. Fő, ugye? Tehát mivel nem minden mást, akkor Állítson be egy töréspontot a fő. És megint, én is csak írja megtörni fő helyett b. És ha kíváncsi, ha valaha írja ki a hosszú parancs majd rájönnek, hogy Ön gépelt a rossz dolog, és szeretne megszabadulni Az összes, mint én csináltam, tudod irányítani U, amely törölni mindent és hozza vissza hogy az elején a kurzort vonalak. Egy sokkal gyorsabb, mint csak lenyomva a törölni, vagy üti meg egy csomó alkalommal vége. Szóval megbeszélünk egy töréspontot a fő. És amint látod, azt mondja, mi már Állítson be egy töréspontot a fájl buggy1.c, és látszólag az első sorban A kódex fő van vonalon hét. Ismét nincs A forrás fájl van, de feltételezem, hogy ez mondja el az igazat. És akkor, csak próbálom és futtassa a programot, r. Kezdve programot. Rendben, tehát ezt az üzenetet egy kicsit rejtélyes. De alapvetően mi itt történik, ez csak mondja nekem, amit hit a szünetben pont, töréspontot száma 1. És akkor, hogy kódsort, Nincs ilyen fájl vagy könyvtár. Az egyetlen ok, hogy Látok, hogy az üzenet azért van, mert én véletlenül töröltem a buggy.c fájlt. Ha a fájl már létezett buggy1.c Az aktuális könyvtárban, ezt a vonalat ott ténylegesen mondja meg, mi a kódsort Szó szerint így szól. Sajnos, én törölte azt. Mi lesz, hogy milyen navigálni ezen keresztül egy kicsit vakon. OK, lássuk, mit akarok itt csinálni? Nos, szeretném tudni, hogy mi a helyi változók talán állnak hozzám. Elkezdtem a programot. Lássuk, mit lehet már el van indítva a számunkra. Azt írja Info helyiek, sem a helyiek. Rendben, úgy, hogy nem adj egy csomó információt. Tudtam kipróbálni, és nyomtassa ki a változó, de nem tudom, minden változó nevét. Tudtam próbálni egy hátsó nyoma, de biztos vagyok benne a fő, így tudom, hogy én még nem Egy másik függvényhívás most. Tehát úgy néz ki, mint az én egyetlen lehetőség használatához n, vagy úgy, és elkezd merülni. Én fogom használni n. Szóval írja n. Oh, istenem, mi folyik itt. Program vett jelek, SIGSEGV szegmentációs hibát, majd egy csomó cuccot. Én már amúgy is túlterhelt. Nos, van valójában egy sokat lehet tanulni itt. Szóval mit is jelent ez nekünk? Mi azt mondja, van, ez a program hamarosan, de még nem, seg hiba. És különösen, megyek Nagyításhoz még tovább itt, ez arról szól, hogy seg hiba kb úgynevezett strcmp. Most lehet, hogy nem tárgyalt Ezt a funkciót széles körben. De is-- mert nem megyünk beszélni minden funkciója, hogy létezik, szabványos C library-- de ők mind áll az Ön rendelkezésére, különösen akkor, ha veszel egy nézd meg reference.cs50.net. És strcmp egy nagyon erős funkciót, amely belül létezik A string.h fejléc fájl, amely egy fejléc fájl, amely elkötelezett a funkciók hogy működjenek együtt, és manipulálni húrok. És különösen, hogy mit csinál, strcmp összehasonlítja a két szálakat. Így vagyok, hogy szegmentációs hiba Egy hívás, hogy strcmp látszik. Elütöttem n, és valójában az üzenetet kapom, programot lezárni jel SIGSEGV felosztási hiba. Akkor most Igazából seg hibázott, és én elég program sokkal hatékonyabban feladta. Ez az a program végén. Elromlott, amikor összeomlott. Szóval nem volt sok, de én valójában nem tanulni egy kicsit ebből a kevés tapasztalattal. Mit tanultam? Nos, én program lefagy nagyjából azonnal. Saját programot összeomlik A hívás a strcmp, de én nincs lokális változók az én programot idején, hogy összeomlik. Tehát mi húr, vagy húrok, is tudnék lenni összehasonlításával. Ha nem rendelkezik lokális változók, lehet, Feltételezem, hogy én have-- ott talán egy globális változó, ami lehet igaz. De általában, úgy tűnik, mint én vagyok összehasonlítása valamire, ami nem létezik. Úgyhogy vizsgálja hogy egy kicsit tovább. Így fogok, hogy törölje a képernyő. Megyek kilépsz a GDB környezetben egy pillanatra. És azt gondolom, OK, így van rá nincs helyi változókat a programom. Kíváncsi vagyok, ha esetleg kéne át egy szövegben, mint egy parancssori argumentum. Úgyhogy csak kipróbálni ezt ki. Én nem csináltam ilyet. Lássuk, talán ha a program futtatásához egy parancssori argumentum működik. Huh, nem szegmentációs hiba van. Ez csak azt mondta nekem, hogy én rájöttem. Szóval lehet, hogy ez a javítás itt. És valóban, ha megyek vissza, és nézd meg Az aktuális forráskódját buggy1.c, Úgy tűnik, mintha mit csinálok a Csinálok egy hívás strcmp nélkül annak ellenőrzése, hogy valóban argv [1] létezik. Ez tulajdonképpen a forráskódját buggy1.c. Tehát amit igazán kell itt csinálni, hogy leviszi program feltételezve azt, hogy a fájl előttem, van hogy csak adj egy csekket, hogy arról, hogy argc egyenlő 2. Így ez a példa, megint, mint már mondtam, egy kicsit kiagyalt, nem igaz? Te általában nem fog véletlenül törli a forráskódot majd meg kell próbálni és hibakeresés a programot. De remélhetőleg, ez adta Ön egy illusztráció A dolgokat, hogy akkor lehet gondolkodni mint te hibakeresés a program. Mi a helyzet itt? Milyen változók tudom Van elérhető velem? Hol van pontosan a programom összeomlik, milyen vonalon, milyen hívást milyen funkciót? Milyen nyomokat nem adnak nekem? És pontosan ez az fajta gondolkodásmód, hogy kell bekerülni, ha éppen gondolkodik hibakeresést a programokat. Én Doug Lloyd. Ez CS50.