>> 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.