DOUG Lloyd: Hyvä GDB. Mikä on se tarkalleen? Joten GDB, joka seisoo GNU Debugger, on todella mahtava työkalu, voimme joka auttaa meitä debug meidän ohjelmia, tai selville, missä asiat ovat vialla meidän ohjelmia. GDB on hämmästyttävän tehokas, mutta lähtö ja vuorovaikutus sen kanssa voi olla hieman arvoituksellinen. Se on yleensä komentorivityökalu, ja se voi heittää paljon viestejä sinua. Ja se voi eräänlainen vaikea jäsentää, mitä on tekeillä. Onneksi olemme ryhtyneet toimiin korjata tämän ongelman puolestasi kuten työn kautta CS50. Jos et käytä graafista debuggeri, joka kollegani Dan Armandarse on puhunut varsin hieman noin vuonna videon pitäisi olla täällä juuri nyt, saatat tarvita käyttää näitä komentoriviltä työkalut työskennellä GDB. Jos olet työskennellyt CS50 IDE, sinun ei tarvitse tehdä tätä. Mutta jos et ole työskentelevät CS50 IDE, ehkä käyttäen versio ja CS50 Appliance, tai toinen Linux järjestelmä GDB asennettu sille, saatat joutua käyttämään nämä komentorivityökaluja. Ja koska saatat on tehtävä se, se on hyödyllinen vain ymmärtää, miten GDB toimii komentoriviltä. Mutta jälleen kerran, jos olet käyttämällä CS50 IDE, sinua voidaan käyttää graafisia debuggeri joka on rakennettu IDE. Joten saada asiat menossa GDB, aloittaa debuggaus menetelmä tietyn ohjelma, sinun ei tarvitse tehdä on tyyppi GDB seuraa ohjelman nimen. Niinpä esimerkiksi, jos ohjelma on Hei, kirjoitetaan GDB hei. Kun teet näin, olet menossa vetää ylös GDB ympäristö. Nopeasta muuttuu, ja sen sijaan, että mitä se yleensä on kun kirjoitat asiat käskyn line-- ls, cd-- kaikki tyypillinen Linux komennot, nopeasta muuttuu, luultavasti, jotain kuten suluissa GDB suluissa. Se on uusi GDB nopea, koska olet sisällä GDB ympäristöön. Kun sisällä että ympäristön, siellä on kaksi suurta komentoja että olet luultavasti käyttää seuraavassa järjestyksessä. Ensimmäinen on b, joka on lyhyt tauko. Ja kun kirjoitat b, normaalisti kirjoita nimi toiminto, tai jos satut tietää noin mitä rivinumero ohjelma alkaa käyttäytyä hieman outo, voit kirjoittaa linja numero siellä. Mitä b, tai tauko, tekee on se mahdollistaa ohjelman ajaa asti tiettyyn pisteeseen, nimittäin, funktion nimi että olet määrittänyt tai linja määritettyyn numeroon. Ja siinä vaiheessa, se jäädyttää suoritus. Tämä on todella hyvä asia, koska kun suoritus on jäädytetty, voit alkaa hyvin hitaasti vaiheittain ohjelman. Yleensä, jos olet ollut käynnissä ohjelmat, ne ovat melko lyhyitä. Yleensä kirjoitat piste slash riippumatta nimi ohjelman, paina Enter, ja ennen kuin voit vilkkua, teidän ohjelma on jo päättynyt. Se ei oikeastaan ​​paljon aikaa kokeilla ja selvittää, mitä on vialla. Niin se todella pystyä hidastaa asioita alas asettamalla taitekohta b, ja sitten tehostamalla. Sitten kun olet määrittänyt tauko kohta, voit suorittaa ohjelman. Ja jos sinulla on komentoriviargumentteja, voit määrittää ne tänne, ei kun kirjoitat GDB ohjelman nimi. Voit määrittää kaikki komentoriviltä perustelut ottamalla r, tai ajaa, ja sitten mitä komentoriviargumentteja tarvitset sisällä oman ohjelman. On olemassa useita muita todella tärkeitä ja hyödyllisiä komentoja sisällä BKT ympäristön. Joten haluan vain nopeasti mennä yli joitakin niistä. Ensimmäinen on n, joka on lyhyt ensi, ja voit kirjoittaa seuraavan sijasta n, molemmat toimisi. Ja se on vain pika. Ja kun olet luultavasti jo saanut käytetään, että voimme kirjoittaa asioita lyhyempi on yleensä parempi. Ja mitä se tekee on se tulee siirtyä eteenpäin yhden korttelin koodia. Joten se tulee edetä kunnes funktiokutsu. Ja sitten sen sijaan, sukeltamalla että toiminto ja käy läpi kaikki kyseisen toiminnot koodi, se vain on toiminto. Toiminto kutsutaan. Se tekee mitä sen työ on. Se palaa arvon toiminto, joka kutsui sitä. Ja sitten sinun siirtyä seuraavan rivin että kutsuvan toiminto. Jos haluat astua sisällä funktion, eikä vain ottaa se toteuttaa, erityisesti jos luulet, että ongelma saattaa olla sisällä että toiminta, voit tietysti asettaa tauko kohta sisällä tätä toiminnallisuutta. Tai jos olet jo käynnissä, voit käyttää s siirtyä eteenpäin yhden rivin koodia. Joten tämä askel ja sukeltaa toiminnot, sijasta vain suorittaa ja jatketaan vuonna toiminto että olet virheenjäljitykseen. Jos joskus haluat tietää muuttujanarvoon, voit kirjoittaa p, tai Tulosta, ja sitten muuttujan nimi. Ja joka tulostaa sinulle, sisällä GDB ympäristön, muuttujan nimi, että sinä-- vapauta me-- muuttujan arvo että olet nimetty. Jos haluat tietää arvot jokaisen paikallinen muuttuja pääsee missä tällä hetkellä ovat sinun ohjelma, voit kirjoittaa tiedot paikallisia. Se on paljon nopeampi kuin kirjoittamalla p ja sitten mitä tahansa, luetellaan pois kaikki muuttujat, että tiedät olemassa. Voit kirjoittaa tiedot paikalliset, ja se tulostaa kaiken puolestasi. Seuraavaksi on BT, joka on lyhyt Back Trace. Nyt yleisesti, etenkin alussa CS50, sinun ei todellakaan ole tilaisuus käyttää bt, tai Back Trace, koska et ottaa toimintoja että soittaa muita toimintoja. Saatat olla tärkein puhelu toiminto, mutta se on luultavasti se. Sinulla ei ole, että muu toiminto kutsuvan toinen toiminto, joka kehottaa toisen toiminnon, ja niin edelleen. Mutta ohjelmia saada enemmän monimutkainen, ja erityisesti kun töiden aloittamista rekursiivisia, takaisin jäljittää voi olla todella hyödyllinen tapa antaa sinulle Tällainen saada kontekstin, jossa Olen minun ohjelma. Sano olet kirjoittanut koodin, ja te tiedätte, että tärkein kutsuu funktiota f, joka kutsuu funktiota g, joka kutsuu funktiota h. Joten meillä on useita kerroksia Pesivien täällä. Jos olet sisällä sinun GDB ympäristö, ja tiedät sisällä h, mutta unohdat mitä sai sinut minne are-- voit kirjoittaa bt, tai takaisin jäljittää, ja se tulostaa h, g, f tärkein, rinnalla joitakin muita tietoja, jotka antaa sinulle vihjeen, että OK tärkein kutsutaan f, f kutsutaan g, g nimeltään h, ja siitähän minä Tällä hetkellä olen minun ohjelma. Joten se voi olla todella hyödyllinen, varsinkin kun arvoituksellinen-toisuutta GDB on hieman ylivoimainen, jotta selvittää tarkasti, missä asiat ovat. Lopuksi, kun ohjelma on tehty, tai kun olet valmis debuggaamista ja haluat astua pois alkaen GDB ympäristö, se auttaa tietää, miten päästä pois siitä. Voit kirjoittaa q, tai Lopeta, ulos. Nyt, ennen tämänpäiväistä video Olen valmis buginen ohjelma nimeltään buggy1, joka kokosin tiedostosta tunnetaan buggy1.c. Kuten arvata saattaa, tämä ohjelma on itse asiassa buginen. Jotain menee pieleen kun yritän ja käyttää sitä. Nyt valitettavasti olen epähuomiossa Poistin buggy1.c tiedoston, joten jotta minun selvittää mikä on vialla tämän ohjelman, Aion on käytettävä GDB sellainen sokeasti, yrittää Voit selata ohjelman selvittää, mitä on vialla. Mutta käyttäen vain työkaluja olemme jo oppineet, voimme melko paljon kuva tarkalleen, mitä se on. Joten pään yli CS50 IDE ja katsoa. OK, joten olemme täällä minun CS50 IDE ympäristö, ja minä zoomata hieman joten voit nähdä hieman enemmän. Minun pääteikkuna, jos I luettelo sisältö minun nykyinen johtaja LS, näemme, että minä on pari lähdetiedostot tässä, mukaan lukien aiemmin keskusteltu buggy1. Mitä menee kun Yritän ja ajaa buggy1. No katsotaanpa selvittää. Kirjoitan piste slash, buginen, ja osuin Enter. Segmentointi viat. Tuo ei ole hyvä. Jos muistatte, segmentointi vika tyypillisesti tapahtuu, kun pääsemme muisti että emme saa koskea. Olemme jotenkin saavuttaneet ulkopuolella rajojen mitä ohjelman, kääntäjä, on antanut meille. Ja niin jo se vihje pitää työkalupakin kun aloitamme virheenkorjaus prosessi. Jotain on mennyt pieleen täällä. Selvä, joten aloitetaan ylös GDB ympäristö ja katso jos voimme selvittää mitä ongelma on. Aion tyhjentää näytön, ja aion kirjoittaa GDB uudelleen, syöttää GDB ympäristöön, ja ohjelman nimi että haluan vianjäljitykseen, buggy1. Saamme pienen viestin, lukeminen symboleja buggy1, tehty. Kaikki tämä tarkoittaa, on se veti yhteen kaikki koodi, ja nyt se on ladattu GDB, ja se on valmis menemään. Nyt, mitä haluan tehdä? Muistatteko mitä Ensimmäinen askel on tyypillisesti kun olen sisällä tässä ympäristössä? Toivottavasti mainittu joukko taitekohta, koska itse asiassa, että on mitä haluan tehdä. Nyt minulla ei ole lähdekoodi tästä edessäni, joka on luultavasti ei tyypillinen use case, muuten. Luultavasti. Niin se on hyvä. Mutta olettaen et, mitä yksi toiminto, tiedät olemassa jokaisessa C-ohjelma? Ei ole väliä kuinka suuri tai kuinka monimutkainen se on, tämä toiminto on varmasti olemassa. Main, eikö? Joten ei ole kaikkea, voimme asettaa taitekohta tärkeimmissä. Ja vielä, voisin vain tyyppi rikkoa tärkein sijasta b. Ja jos olet kiinnostunut, jos koskaan kirjoittamiseen pitkä komento ja sitten ymmärtää, että olet kirjoittanut väärää, ja haluat päästä eroon kaikki kuten juuri tein, voit hallita U, joka poistaa kaiken ja tuo sinut takaisin alkuun kohdistinviivat. Paljon nopeammin kuin vain pitämällä poistaa, tai lyömällä se joukko kertaa yli. Joten me asettaa taitekohta tärkeimmissä. Ja kuten näette, se sanoo olemme asettaa taitekohta on tiedosto buggy1.c, ja ilmeisesti ensimmäinen rivi koodi tärkeimmistä on line seitsemän. Jälleen meillä ei ole lähdetiedosto täällä, mutta minä olettaa, että se on kertoo minulle totuuden. Ja sitten, yritän vain ja suorita ohjelma, r. Alkaen ohjelma. Selvä, niin tämä viesti on hieman arvoituksellinen. Mutta pohjimmiltaan mitä tapahtuu tässä se on vain kertoo minulle Olen löi tauko kohta, taitekohta numero 1. Ja sitten, että rivi koodia, Ei tällaista tiedostoa tai hakemistoa. Ainoa syy, että Näen, että viesti on koska olen vahingossa Poistin buggy.c tiedosto. Jos minun buggy1.c tiedosto olemassa nykyisen hakemiston, että linja tuolla todella kerro mitä koodiriviä kirjaimellisesti lukee. Valitettavasti olen poistanut sen. Aiomme olla sellaista navigoida kautta tämä hieman sokeasti. OK, joten katsotaanpa, mitä minä haluan tehdä täällä? No, haluaisin tietää mitä paikallisia muuttujat ehkä minulla on käytössäni. Olen alkanut minun ohjelma. Katsotaan, mitä voisi olla jo alustettu meille. Kirjoitan Info paikalliset, ei paikallisia. Hyvä, jotta ei antaa minulle ton tiedon. Voisin yrittää tulostaa muuttuja, mutta en tiedä mitään muuttujien nimet. Voisin yrittää takaisin jälki, mutta olen sisällä tärkein, joten tiedän En ole tehnyt toinen toiminto soittaa juuri nyt. Joten näyttää minun ainoat vaihtoehdot ovat käyttää n tai niin ja alkaa sukeltaa. Aion käyttää n. Joten kirjoitan n. Jestas, mitä täällä tapahtuu. Ohjelma vastaanotetut signaalit, SIGSEGV segmentointi vika, ja sitten koko joukko tavaraa. Olen jo ylityöllistettyjä. No, on oikeastaan paljon opittavaa täällä. Mitä tämä kertoo meille? Mitä se kertoo meille on, tämä ohjelma on noin, mutta ei ole vielä, seg vika. Ja erityisesti, aion zoomata entisestään täällä, se on noin Seg vika noin jotain kutsutaan strcmp. Nyt, emme ehkä keskustelleet tämä toiminto laajasti. Mutta se is-- koska emme aio puhua jokainen toiminto olemassa C standardin library-- mutta ne ovat kaikki käytettävissä, varsinkin jos otat katsokaa reference.cs50.net. Ja strcmp on todella voimakas toiminto, joka on olemassa sisällä on string.h otsikon tiedosto, joka on header tiedoston, joka on omistettu toimintoja että työn ja manipuloida jouset. Ja erityisesti, mitä strcmp tekee on se vertaa arvoja kaksi merkkijonoa. Joten olen aikeissa segmentointi vika päälle puhelun strcmp se näyttää. Osuin n, ja itse asiassa saan viestin, Ohjelma päättyi signaalin SIGSEGV segmentointi vika. Joten nyt Olen itse seg vialliseksi, ja minun ohjelma on melko paljon tehokkaasti luopunut. Tämä on ohjelman lopussa. Se hajosi, se kaatui. Joten ei ollut paljon, mutta olen itse asiassa opin melkoisesti tästä vähän kokemusta. Mitä olen oppinut? No, minun ohjelma kaatuu melko paljon heti. Minun ohjelma kaatuu soittaa strcmp, mutta minä ei ole paikallisia muuttujia minun ohjelma tuolloin, että se kaatuu. Joten mitä string, tai jouset, voisin olla vertaamalla. Jos minulla ei ole mitään paikallista muuttujat, saatat otaksua, että minä have-- siellä ehkä on globaali muuttuja, joka voisi olla totta. Mutta yleisesti, se näyttää kuten olen vertaamalla jotain jota ei ole olemassa. Joten tutkia että hieman pidemmälle. Joten aion tyhjentää näytön. Aion lopettaa ulos GDB ympäristö toista. Ja olen ajatellut, OK, joten ei ei paikallisia muuttujia minun ohjelma. Ihmettelen, jos ehkä minun pitäisi välittää merkkijono kuin komentorivillä. Joten vain testata tätä ulos. En ole tehnyt tätä ennen. Katsotaanpa, jos ehkä, jos en suorita tämä ohjelma jossa komentorivillä se toimii. Huh, ei segmentointi vika siellä. Se kertoi minulle juuri, että olen tajunnut sitä. Joten ehkä se on korjata täällä. Ja todellakin, jos menen takaisin ja katsoa todellinen lähdekoodi buggy1.c, näyttää siltä, ​​että mitä teen on Teen puhelun strcmp ilman tarkistetaan, onko itse asiassa argv [1] on olemassa. Tämä on oikeastaan lähdekoodi buggy1.c. Joten mitä todella tarvitsee tehdä tästä vahvistaa minun ohjelma, olettaen Minulla tiedosto edessäni, on vain lisätä tarkista, Varmista, että argc on yhtä suuri kuin 2. Joten tässä esimerkissä taas, kuten sanoin, on hieman keinotekoinen, eikö? Et yleensä aio vahingossa poistaa lähdekoodi ja sitten täytyy yrittää ja debug ohjelman. Mutta toivottavasti se antoi sinua kuva siitä, millaisia ​​asioita, jotka voisit ajatella kun olet virheenkorjaus ohjelman. Mikä tilanne täällä? Mitä muuttujia minun on saatavilla minulle? Missä tarkalleen on minun ohjelma kaatuu, mitä linja, mitä puhelun mitä toimintoa? Millaisia ​​johtolankoja ei, jotka antavat minulle? Ja juuri Tällainen ajattelutapa, että te olisi päästä, kun olet ajatellut virheenkorjaus ohjelmat. Olen Doug Lloyd. Tämä on CS50.