Doug LLOYD: Vredu GDB. Kaj je to točno? Torej GDB, ki stoji za GNU Debugger, je res super orodje, da bomo lahko uporabiti, da nam pomagajo debug naše programe, ali kje so stvari narobe v naših programih. GDB je neverjetno močan, vendar proizvodnja in interakcija z njim mogoče malo skrivnosten. To je običajno črta orodje ukaz, in lahko vrgel veliko sporočil na vas. In to lahko nekako težko razčleniti, kaj se dogaja. Na srečo smo sprejeti ukrepe da se določi ta problem za vas kot delate skozi CS50. Če ne uporabljate grafičnega razhroščevalnik, ki je moj kolega Dan Armandarse je precej govoril malo o tem v videoposnetku, ki bi morala biti tukaj zdaj, boste morda morali Za uporabo te ukazno vrstico orodja za delo z GDB. Če delate v CS50 IDE, vam ni treba, da to storijo. Ampak, če niste delajo v CS50 IDE, morda z uporabo različico od CS50 Appliance, ali drugo Linux operacijski Sistem z GDB nameščen na njej, boste morda morali uporabiti ta orodja ukazni vrstici. In ker boste morda morali storiti, da, to je koristno, da bi razumeli, kako GDB deluje v ukazni vrstici. Ampak še enkrat, če ste pomočjo CS50 IDE, si Lahko uporabite grafični razhroščevalnik ki je vgrajen v IDE. Torej, da se stvari dogaja z GDB, da začnete razhroščevanje Postopek posebno Program, vse, kar morate storiti, je tip GDB sledila z imenom programa. Tako, na primer, če je vaš program zdravo, bi vnesete GDB zdravo. Ko boste to storili, boste potegnite navzgor GDB okolje. Vaš hiter bo spremenilo, in namesto da bi tisto, kar je običajno je, ko vnesete stvari V ukazni line-- ls, CD- vse vaš tipičen Linux ukazi, svoj poziv se bo spremenila, verjetno nekaj kot je oklepaju GDB oklepajih. To je vaš novi GDB hitro, saj ste v notranjosti GDB okolje. Ko znotraj tega okolja, tam je dve veliki ukazi da boste verjetno uporabili v tem vrstnem redu. Prvi je b, ki je okrajšava za počitek. In ko tip B, ki jih običajno vnesite ime funkcije, ali pa če se zgodi, da veš okoli kakšna številka vrstice vaš program se začenja obnašati malo čudno, lahko vnesete linijo Številka tudi tam. Kaj b, ali odmor, ne je to omogoča vaš program teči do določene točke, sicer ime funkcije ki ste jo določili, ali je linija Številka, ki ste jo določili. In na tej točki, da zamrzne izvajanje. To je res dobra stvar, saj ko je izvedba zamrznjen, lahko začnete zelo počasi stopite skozi svoj program. Značilno je, če ste bili teče vaši programi, oni so zelo kratki. Ponavadi, ko tipkate dot poševnica karkoli ime vašega programa, pritisnite tipko Enter, in preden boste lahko utripajo, vaš Program je že končal. To ni res veliko časa, da poskusite in ugotoviti, kaj je šlo narobe. Torej je res, da se lahko stvari počasi dol z določitvijo točko lomljenja z b, nato pa odskočna v. Potem, ko ste nastavili odmor točka, lahko zaženete program. In če imate argumenti v ukazni vrstici, jih določite tukaj, ne takrat, ko tipkanjem GDB vaše ime programa. Vi določite vse ukazni vrstici Argumenti, ki jih ob r, ali tek, in nato argumenti glede ukazni vrstici morate znotraj vašega programa. Obstajajo številni drugi res pomembne in uporabne ukaze znotraj okolja BDP. Torej, mi dovolite, samo hitro iti čez nekatere od njih. Prvi je n, ki je okrajšava za dostavo, in lahko vnesete naslednji namesto n, tako bi delovalo. In to je samo bljižnica. In kot ste verjetno že gotten vajeni, da lahko tipa stvari krajši je na splošno boljša. In kaj bo naredil, je, da bomo korak naprej en blok kode. Torej bomo napredovati dokler klic funkcije. In nato namesto potapljanje v tej funkciji in gredo skozi vse, ki deluje koda, bo samo še funkcijo. Funkcija se bo imenoval. To bo storila ne glede na njeno delo. To bo vrnil vrednost funkcija, ki ga je imenoval. In potem boš prehod na koncept Naslednja vrstica te funkcije kliče. Če želite korak notranjost funkcije namesto samo ob to izvesti, še posebej, Če menite, da je problem morda ležijo znotraj te funkcije, lahko bi, seveda, določi odmor točko znotraj te funkcije. Ali pa, če ste že teče, lahko uporabite s korakom naprej eno vrstico kode. Torej bo to korak v in se potopite v funkcijah, namesto imajo samo izvedbo in nadaljuje naprej v funkciji da ste v za razhroščevanje. Če ste kdaj želeli vedeti vrednost spremenljivke, lahko vnesete p ali Print, in nato ime spremenljivke. In da se bo izpisal na vas, notranjost GDB okolja, ime spremenljivke, ki you-- oprostite me-- vrednost spremenljivke da ste poimenovali. Če želite vedeti, vrednote vsak lokalna spremenljivka dostopen od koder trenutno so v vašem Program, lahko vnesete info domačine. To je veliko hitreje kot tipkanje p in potem karkoli, kotacijo ven vse spremenljivke, da veste, obstajajo. Lahko vnesete info domačini, in to bo izpisal vse za vas. Naslednji je bt, ki je okrajšava za izsledil. Sedaj splošno predvsem v začetku CS50, ne boste res imeli priložnost za uporabo BT ali izsledil, ker niste ob funkcij da pokličete druge funkcije. Morda imate glavno poklicati funkcija, ampak to je verjetno to. Nimate to drugo funkcijo kliče drugo funkcijo, ki poziva drugo funkcijo, in tako naprej. Ampak kot vaši programi dobili več kompleks, in zlasti Ko začnete z delom z rekurzija, nazaj v sledovih more biti res koristen način, da bi vas nekako dobili nekaj kontekst, kjer Jaz sem v mojem programu. Tako pravijo, da ste napisal kodo, in veste, da je glavna zahteva funkcijo f, ki kliče funkcijo g, ki kliče funkcijo h. Torej imamo več plasti gnezditvenih dogaja. Če ste v notranjosti Vaše GDB okolje, in poznate svoje notranjosti H, ampak ste pozabili o tem, kaj vas imam, kjer vas are-- lahko vnesete bt, ali zadnji sled, in se bo izpisal h, g, f glavni, poleg nekaterih drugih informacij, ki vam daje namig, da je OK glavna imenovana f, f imenovanega g, g imenuje h in da je, kjer sem Trenutno sem v mojem programu. Torej je lahko zelo koristno, še posebej, ker Grobni-sti GDB postane malo veliko, da izvedeti, kje so stvari. Nazadnje, ko je vaš program storiti, ali ko ste končali ga debugging in želite odmakniti Iz GDB okolja, je koristno vedeti, kako priti iz nje. Lahko vnesete q, ali Končaj, da gremo ven. Zdaj pa, preden današnjem videu Sem pripravila program hroščat imenovano buggy1, ki sem zbrati iz datoteke znan kot buggy1.c. Kot bi lahko pričakovali, to Program je v resnici buggy. Gre kaj narobe ko sem poskusil in ga zaženite. Zdaj pa, žal, sem nehote izbrisal svoj buggy1.c datoteko tako da mi je, da ugotovimo, kaj je narobe s tem programom, Bom moral uporabiti GDB vrsta slepo, poskušam pluti skozi ta program, da ugotoviti, kaj je šlo narobe. Vendar s samo orodja smo že spoznali, smo lahko precej sliko ven točno to, kar je. Torej, kaj je nad glavo, CS50 IDE in si oglejte. OK, tako da smo tukaj, v mojem CS50 IDE okolje, in bom povečate malo tako da boste lahko videli malo več. V mojem terminalsko okno, če sem seznam vsebina mojega sedanjega direktorja z ls, bomo videli, da sem imajo nekaj izvornih datotek tod vključno prej razpravljali buggy1. Kaj točno se dogaja, ko Sem poskusil in teči buggy1. No kaj izvedeli. Sem tip dot poševnica, Otroški voziček in sem udaril Enter. Segmentacija napake. To ni dobro. Če se spomnite, A segmentacije krivda običajno se pojavi, ko imamo dostop do pomnilnika da si ne smemo dotakniti. Mi smo nekako dosegli izven meja o tem, kaj program je prevajalnik, nam je dano. In tako je že, da je namig, da v orodjarni kot smo začeli proces debugging. Nekaj ​​je šel malo narobe tukaj. Vse je v redu, zato začnimo up GDB okolje in videli, če lahko ugotovimo, kaj točno je problem. Grem zbistriti zaslon, in grem na vrsto GDB še enkrat, da vnesete GDB okolje, in ime programa da želim debug, buggy1. Smo dobili malo sporočilo, branje simboli iz buggy1, storjeno. Vse to pomeni, da je potegnil skupaj vse kode, in zdaj je bil naložen v GDB, in je pripravljena iti. Zdaj, kaj hočem narediti? Ali se spomnite, kaj je Prvi korak je značilno ko sem znotraj tega okolja? Upajmo, pri čemer si nastavite odmor točka, saj v dejstvu, da je tisto, kar želim storiti. Zdaj, jaz ne imeti Izvorna koda za ta pred mano, kar je verjetno ni tipičen primer uporabe, mimogrede. Ste verjetno bo. Torej, to je dobro. Vendar ob predpostavki, da ne, kaj je tista funkcija, ki veste obstaja v vsakem posameznem programu C? Ne glede na to, kako velik ali kako zapleteno je ta funkcija nedvomno obstaja. Main, kajne? Torej ni vse ostalo, smo lahko nastavite prelom točko na glavni. In spet, sem lahko samo tip prekinil glavni namesto b. In če ste radovedni, če vas kdaj tip ven dolgo ukaz in potem ugotovili, da vas vnesli napačno stvar, in želite, da se znebite vse, kot sem storil, si lahko prevzamejo nadzor nad U, ki bo izbrisati vse in vas pripeljem nazaj na začetku kazalca vrstic. Veliko hitreje kot samo držite izbrisati ali jo tepe kup krat konec. Torej bomo nastavili točko lomljenja na glavni. In kot vidite, se pravi, da smo jih nastavite točko lomljenja na datotečnem buggy1.c, in očitno prva vrstica o kodeksu glavna je linija sedem. Again, nimamo vir datoteke tukaj ampak bom Predvidevam, da je mi je povedal resnico. In potem, Poskušam in zaženite program, r. Zagon programa. Vse je v redu, tako da to sporočilo je malo skrivnosten. Ampak v bistvu, kaj je tu dogaja je, da je samo mi pravi, da sem udaril moj odmor točka, break točko številka 1. In potem, da je vrstica kode, takšno datoteko ali imenik ni. Edini razlog, da Jaz vidim to sporočilo je zato, ker sem nehote izbrisal svoj buggy.c datoteko. Če je obstajala moja buggy1.c datoteka v trenutnem imeniku, ta pravica linija tam bi dejansko povej mi, kaj je vrstica kode dobesedno bere. Na žalost sem jo izbrisali. Bomo morali nekako navigacijo skozi to malo bolj na slepo. OK, tako da vidimo, kaj hočem narediti tukaj? No, jaz bi rad vedel, kaj je lokalna spremenljivke, morda so mi na voljo. Sem začel svoj program. Poglejmo, kaj bi lahko bilo že inicializiran za nas. Sem tip Info domačini, ne domačini. Vse je v redu, tako da ne dajte mi tono informacij. Jaz bi poskusil in natisniti spremenljivke, ampak ne vem nobenega imena spremenljivk. Jaz bi poskusil back sled, vendar sem znotraj glavno, tako da vem, da še niso dosegli en klic funkcije zdaj. Torej izgleda so moje edine možnosti uporabiti n ali tako in začeti, da se potopite v. Jaz grem za uporabo n. Torej sem tip n. O moj bog, kaj se tukaj dogaja. Program prejel signale, SIGSEGV segmentacije krivda, nato pa cel kup stvari. Sem že preobremenjeni. No, tam je pravzaprav Veliko se tukaj naučil. Torej, kaj nam to pove? Kaj nam pove, je, da je ta program o tem, ampak še ni, SEG krivda. In predvsem, bom za povečavo še tu, gre za SEG napako o nekaj, kar se imenuje strcmp. Zdaj smo morda niso razpravljali ta funkcija v veliki meri. Ampak to is-- zato, ker ne bomo govoriti o vse funkcije, ki obstaja v standardu C library-- ampak oni so vse na voljo za vas, še posebej, če ste vzeli poglej reference.cs50.net. In strcmp je res močna Funkcija, ki obstaja znotraj od string.h glavi datoteka, ki je glava datoteka, ki je posvečena funkcij da je delo z in manipulirati strune. In predvsem, kaj strcmp pa je primerja vrednosti dveh nizov. Torej sem približno segmentacije napako na poziv k strcmp zdi. Sem udaril n, in v bistvu sem dobil sporočilo, Program zaključi s signalom SIGSEGV segmentacije krivda. Torej zdaj Imam dejansko SEG očitati, in moj program ima precej precej učinkovito obupal. To je konec programa. Je pokvaril, je strmoglavilo. Torej ni bilo veliko, vendar sem dejansko naredil učijo zelo malo od tega malo izkušenj. Kaj sem se naučil? No, moj Program zruši precej takoj. Moj program zruši na poziv k strcmp, vendar sem nimajo nobenih lokalnih spremenljivk v moji Program v času, ko se raztrešči. Torej, kaj je niz, ali strune, Lahko bi morda primerjavo. Če nimam vsak lokalni spremenljivke, boste morda Domnevamo, da sem have-- obstaja morda je Globalna spremenljivka, ki bi lahko bilo res. Vendar na splošno, se zdi kot sem primerjavo na nekaj, kar ne obstaja. Torej, kaj je raziskati da malo naprej. Torej bom zbistriti zaslon. Bom nehal ven iz GDB okolje za sekundo. In sem razmišljal, OK, tako da je Ni lokalne spremenljivke v mojem programu. Zanima me, če morda sem moral opraviti v nizu, kot argument ukazne vrstice. Torej, kaj je samo preizkusiti to. Prej nisem storil tega. Poglejmo, če morda, če sem teči ta program z argumentom ukazne vrstice deluje. Huh, ne segmentacija napaka tam. To mi je pravkar povedal, da sem pogruntal. Tako da morda to je fix tukaj. In res, če sem šel nazaj in poglej dejanska izvorna koda za buggy1.c, se zdi, da tisto, kar delam, je Delam klic strcmp brez preverjanje, ali v resnici argv [1] obstaja. To je dejansko Izvorna koda za buggy1.c. Torej, kaj sem res potrebujejo, da storite tukaj popraviti svoj program, ob predpostavki, da imam vložiti pred mano, je da samo dodati preverite, zagotoviti, da argc je enak 2. Torej ta primer, še enkrat, kot sem rekel, je malo izmišljeno, kajne? Ste na splošno ne bo pomotoma izbrisali izvorno kodo in potem poskusiti in debug program. Ampak upam, da je dal Ste ilustracija od vrst stvari, ki si lahko razmišljal o kot ste odpravljanje napak v programu. Kaj je stanje tukaj? Kaj spremenljivke storiti I imajo dostop do mene? Kje točno je moj program, treskav, na kakšni liniji, o tem, kaj klic na kakšno funkcijo? Kakšno indicev, ne da mi daje? In to je točno vrsta miselnosti, ki vas naj se dobili v, ko ste razmišljanje o razhroščevanje svojih programov. Sem Doug Lloyd. To je CS50.