DOUG LLOYD: Olgu GDB. Mis see on täpselt? Nii GDB, mis tähistab GNU siluri, on tõesti fantastiline vahend, et saame kasutada, et aidata meil siluda meie programmid, või teada, kus asjad on valesti meie programme. GDB on hämmastavalt võimas, kuid väljund ja temaga tegemist võib olla natuke segasena. See on tavaliselt käsurea vahend, ja see ei viska palju sõnumeid sind. Ja see võib mingi raske sõeluda täpselt, mis toimub. Õnneks oleme astunud samme probleemi lahendada sinu jaoks nagu te tööd läbi CS50. Kui te ei kasuta graafilise siluri, mis kolleeg Dan Armandarse on rääkinud üsna natuke on video, mis peaks olema siin kohe, peate kasutada neid käsurea tööriistad töötada GDB. Kui oled töötanud CS50 IDE, sa ei pea seda tegema. Aga kui sa ei ole töötab CS50 IDE, ehk kasutades versioon on CS50 Appliance, või teise Linux operatsioonisüsteemi süsteemi GDB installitud, peate kasutama Nende käsurea tööriistu. Ja kuna te võite pead tegema, et see on kasulik lihtsalt mõista, kuidas GDB töötab käsurealt. Aga jälle, kui sa oled abil CS50 IDE, siis võib kasutada graafilist siluri mis on ehitatud IDE. Nii et asjad lähevad koos GDB, et alustada silumine Meetod konkreetse Programm on kõik, mida vaja teha on kirjutada GDB järgneb programmi nimi. Nii näiteks, kui teie programm on hello, siis oleks tüüp GDB tere. Kui sa seda teha, sa lähed tõmba GDB keskkond. Teie kiiret muutub, ja selle asemel, et see, mida ta tavaliselt on see, kui sa kirjutad asju käsul LINE ls, cd-- kõik oma tüüpiline Linuxi käsud, oma kiire muutub, arvatavasti midagi nagu sulgudes GDB sulgudes. See on endale GDB kiire, sest sa oled sees GDB keskkond. Kui oled selle keskkonna, seal on kaks suurt käske et sa ilmselt kasutada järgmises järjekorras. Esimene on b, mille on lühike paus. Ja pärast seda, kui B-tüüpi, siis tavaliselt kirjuta nimi funktsioon, või kui juhtub, et tean ümber, mida line number Teie programm algab käituda natuke imelik, saab kirjutada rida number ka seal. Mis b, või pausi, ei see võimaldab oma programmi joosta, kuni teatud punkti, nimelt funktsiooni nimi mida te määrate või line teie määratud numbrile. Ja sel hetkel, see külmutada täitmist. See on tõesti hea, sest kui täitmine on külmutatud, võite alustada väga aeglaselt sammult läbi oma programmi. Tavaliselt, kui olete käinud Sinu programmid, nad on üsna lühike. Tavaliselt kirjutad dot kaldkriipsuga iganes nime oma programmi, Enter, ja enne kui sa saad vilkuma, oma Programm on juba valmis. See ei ole tõesti palju aega, et proovida ja aru saada, mis on valesti. Nii see tõesti olla võimelised aeglustada asju Seades murdepunkt, kus b, ja siis astuvad. Siis kui olete loonud oma vaheaega punkti, saate käivitada programmi. Ja kui teil on käsurea argumente, sa täpsustada neid siin, mitte siis, kui kirjutad GDB oma programmi nimi. Sa täpsustada kõiki käsureal argumente, võttes r või joosta, ja siis mis iganes käsurea argumente sa pead sees oma programmi. On mitmeid teisi tegelikult oluline ja kasulik käske sees SKP keskkond. Lubage mul kiiresti minna üle mõned neist. Esimene on n, mis on lühikese järgmisel, ja saate tippida järgmine asemel n, nii teeks. Ja see on lihtsalt stenografist. Ja kui olete ilmselt juba saanud kasutatakse, on võimelised kirjutama asju lühem on üldiselt parem. Ja mida ta teeb on see saab samm edasi ühe ploki koodi. Nii saad edasi kuni funktsioon kõne. Ja siis selle asemel, et sukeldudes et funktsiooni ja läbimas kõik selle funktsioonid kood, see lihtsalt on funktsioon. Funktsioon kutsutakse. See teeb kõik oma töö. Ta tagastab väärtuse funktsioon, mis nõudis ta. Ja siis saate liikuda edasi Järgmine rida, et helistaja funktsiooni. Kui soovite astuda sees funktsiooni, selle asemel, et lihtsalt võttes see täita, eriti Kui te arvate, et probleem võib valetada sees, et funktsiooni, võid muidugi seada murda punkti sees, et funktsioon. Või kui sa oled juba töötab, võite Kasutage S samm edasi üks rida koodi. Nii et see on samm ja sukelduda funktsioone, selle asemel, et lihtsalt on täita ja jätkuvalt edasi funktsiooni et sa oled silumiseks. Kui sa kunagi tahad teada väärtus muutuja, saate tippida p või Print, ja siis muutuja nimi. Ja mis välja printida teile, sisemusse GDB keskkonna nimi muutuja, mis sina-- vabandust mind-- väärtus muutuja et olete nime. Kui sa tahad teada, väärtused iga kohaliku muutuja kättesaadava kust sa praegu oled oma Programmi saab kirjutada info kohalikega. See on palju kiirem kui kirjutades p ja siis mis iganes, loetletakse välja kõik muutujaid, et sa tead olemas. Sa võid kirjutada info kohalikega, ja see saab välja printida kõike teile. Järgmisena on bt, mis on lühike Tagasi Trace. Nüüd üldiselt Eriti alguses CS50, sa ei tõesti kord kasutada BT või Back Trace, sest sa ei ole võttes funktsioonid et helistada muid funktsioone. Sul võib olla peamiseks üksikpakkumist funktsioon, kuid see on ilmselt see. Sa ei pea, et muud ülesanded kutsudes teise funktsiooni, mis nõuab teise funktsiooni, ja nii edasi. Aga kui oma programmides rohkem Keerulise ja eriti kui töö alustamist rekurrentselt, tagasi jälgi võib tõesti kasulik viis teile Selline saaksin olukorra tausta Ma olen oma programmi. Nii öelda olete kirjutanud oma kood, ja sa tead, et peamine nõuab funktsiooni f, mis nõuab funktsiooni g, mis nõuab funktsiooni h. Nii et meil on mitu kihti pesitsevate siin toimub. Kui oled sees Sinu GDB keskkond ja sa tead oma sees h, kuid te unustate mida on sulle, kus sa are-- saate tippida bt või tagasi jälje, ja siis välja printida h, g, f peamine, koos mõne muu teave, mida annab teile aimugi, et OK peamine nimetatakse f, f nimetatakse g, g nimetatakse h, ja see, kus ma Praegu olen oma programmi. Nii et see võib olla väga kasulik, eriti kui segasena-likkust GDB muutub veidi valdav, et täpselt teada, kus asjad on. Lõpuks, kui teie programm on teinud, või kui oled valmis silumine see ja sa tahad sammu kaugusel alates GDB keskkond see aitab teada, kuidas saada välja. Sa võid kirjutada q või Lõpeta, et saada välja. Nüüd, enne tänast video Olen valmis lollakas programmi nimetatakse buggy1, mida ma koostatud failist tuntud buggy1.c. Nagu te võite arvata, see Programm on tegelikult lollakas. Midagi läheb valesti kui ma üritan ja käivitada. Nüüd kahjuks ma kogemata kustutada minu buggy1.c faili nii et minu jaoks välja nuputada mis toimub vale selle programmiga, Ma pean kasutama GDB mingi pimesi, püüdes liikuda selle programmi nuputada, millised täpselt on valesti. Aga kasutades ainult tööriistad me oleme juba õppinud, saame päris palju näitaja täpselt, mis see on. Nii saab pea üle CS50 IDE ja tutvuda. OK, nii et me oleme siin minu CS50 IDE keskkonnas, ja ma suumida natuke nii näed natuke rohkem. Minu terminali aken, kui ma nimekirja sisu minu praegune direktor LS, näeme, et ma on paar allikas faile Siit võivad sealhulgas varem arutatud buggy1. Mis täpselt läheb, kui Püüan ja käivitada buggy1. Noh olgem teada. Ma dot kaldkriipsuga lollakas, ja ma Enter. Segmenteerimine vigu. See ei ole hea. Kui te mäletate, et killustatust süü tavaliselt tekib siis, kui me Access Memory et me ei tohi puudutada. Me oleme kuidagi jõudnud väljaspool piire mida Programmi tõlkija, on meile andnud. Ja nii juba, et on aimugi, et hoida tööriistakasti kui me hakkame silumine protsessi. Midagi on läinud natuke valesti. Olgu, nii alustame üles GDB keskkond ja vaata, kas saame nuputada Mis täpselt probleem on. Ma kustutan oma ekraanil, ja ma lähen kirjuta GDB uuesti siseneda GDB keskkond ja programmi nimi et ma tahan siluda, buggy1. Me natuke sõnumi lugemine sümboleid buggy1, tehtud. Kõik see tähendab, et tõmbas koos kõigi kood, ja nüüd on see laaditud GDB, ja see on valmis minema. Nüüd, mida ma tahan teha? Kas te mäletate, milline Esimene samm on tavaliselt kui ma olen sees selles keskkonnas? Loodetavasti sa ütlesid seatud murdepunkt, sest Tegelikult see on see, mida ma tahan teha. Nüüd ma ei ole lähtekoodi seda minu ees, mis on ilmselt ei tüüpiline kasutamise puhul, muide. Sa ilmselt. Nii see on hea. Aga eeldades, et sa seda ei tee, mis on üks funktsioon, et sa tead eksisteerib iga C programmi? Ükskõik kui suur või kui keeruline see on, seda funktsiooni kindlasti olemas. Main, eks? Nii ei suuda kõik muu, saame määrata murdepunkti on peamine. Ja jälle, ma ei kirjuta murda peamised asemel b. Ja kui sa oled uudishimulik, kui te kunagi kirjuta välja pikk käsk ja siis mõistad, et sa tipitud vale asi, ja sa tahad lahti saada kõik nagu ma just tegin, saab võtta kontrolli U, mis kustutada kõike ja viib teid tagasi algusega kursori read. Palju kiiremini kui lihtsalt hoia kustutada või lööb see kamp korda üle. Nii me määrata murdepunkti on peamine. Ja nagu näete, see ütleb me oleme määrata murdepunkti kell faili buggy1.c, ja ilmselt esimene rida koodi peamised on line seitse. Jällegi, me ei ole lähtefaili siin aga ma eeldada, et see on räägib mulle tõtt. Ja siis ma üritan ja käivitage programm, r. Alates programmi. Olgu, nii et see sõnum on veidi segasena. Aga põhimõtteliselt mida on siin toimub on see lihtsalt mulle öelda, ma olen tabanud minu murda punkti, numbriga 1. Ja siis, et rida koodi, no sellist faili või kataloogi. Ainus põhjus, mis Ma näen, et sõnum on, sest ma kogemata kustutada minu buggy.c faili. Kui minu buggy1.c fail olemas aktiivses kataloogis, et joon seal tegelikult öelge mulle, mida koodirida sõnalt loeb. Kahjuks ma kustutasin selle. Me läheme pea sellist navigate läbi selle natuke rohkem pimesi. OK, nii et vaatame, mida ma tahan teha siin? Noh, ma tahaks teada, mida kohalikud muutujad võibolla on minule. Olen hakanud oma programmi. Vaatame, mis võib olla juba vormindatud meile. I tüüpi Info kohalikega, no kohalikega. Olgu, nii et ei ole mulle ton teabe. Ma võiks proovida ja välja printida muutuja, aga ma ei tea, mis tahes muutuja nime. Ma võiks proovida uuesti jälgi, aga ma olen sees peamine, nii et ma tean, et ma ei ole teinud teine ​​funktsioon kõne just nüüd. Nii näeb välja nagu mu ainus valikud kasutada n või nii ja alustada sukelduda. Ma lähen kasutada n. Nii I tüüpi n. Oh heldust, mis toimub siin. Programm sai signaale, SIGSEGV killustatust süü, ja siis terve hunnik kraami. Ma olen juba ülekoormatud. Noh, seal on tegelikult palju õppida siin. Mida see meile ütleb? Mida see ütleb meile on see programm on umbes, kuid ei ole veel, seg süü. Ja eriti, ma lähen et suurendada veelgi siin see on umbes SEG süü kohta midagi, mida nimetatakse strcmp. Nüüd ei arutanud Selle funktsiooni ulatuslikult. Aga see on-- sest me ei kavatse rääkida iga funktsiooni, mis eksisteerib C standard library-- kuid nad kõik teile kättesaadavad, eriti kui te võtate vaata reference.cs50.net. Ja strcmp on tõesti võimas funktsioon, mis eksisteerib sees on string päise kaudu faili, mis on päise kaudu fail, mis on pühendatud funktsioonid et töö ja manipuleerida stringid. Ja eriti, mida strcmp teeb, on võrreldakse väärtustega kaks stringi. Nii et ma olen umbes killustatust süü kohta kõne strcmp tundub. I hit n, ja tegelikult saan teate, Programm lõpeb signaali SIGSEGV killustatust süü. Nüüd Ma tegelikult ei seg faulted, ja minu programm on päris palju tõhusamalt loobunud. See on programmi lõppu. See lagunes, siis kukkus. Nii ei olnud palju, aga ma tegelikult ei õppida mõndagi sellest vähe kogemusi. Mida ma õppisin? Noh, minu programm jookseb päris palju kohe. Minu programm jookseb Kõne strcmp, aga ma ei ole veel ühtegi kohalikud muutujad minu Programmi ajal, et see jookseb. Mis string või stringid, mida ma võib-olla võrrelda. Kui mul ei ole ühtegi kohalikku muutujaid, võite Arvata, et ma have-- seal võibolla on Globaalse muutuja, mis võib olla tõsi. Aga üldiselt tundub nagu ma võrrelda midagi, mida ei eksisteeri. Nii uurigem et veidi kaugemale. Nii et ma lähen kustutada oma ekraanil. Ma lõpetan välja GDB keskkond teise. Ja ma olen mõelnud, OK, nii et seal on no kohalikud muutujad minu programm. Ma ei tea, kas äkki ma peaksin edasi string käsurea argument. Nii saab lihtsalt testida seda. Ma ei ole seda varem teinud. Vaatame, kas äkki kui ma saan selle programmi koos käsurea argument see toimib. Huh, no killustatust süü olemas. See lihtsalt ütles mulle, et ma arvasin seda. Ehk see on fix siin. Ja tõepoolest, kui ma tagasi minna ja vaadata tegelik lähtekoodi buggy1.c, tundub, et mida ma teen on Ma helistades strcmp ilma kontrollida, kas tegelikult argv [1] on olemas. See on tegelikult lähtekoodi buggy1.c. Mida ma tõesti vaja teha siia, et määrata oma programmi, eeldades mul esitada minu ees, on lihtsalt lisada kontrollige Veenduge, et Argc on võrdne 2. Nii et see näide jällegi, nagu ma ütlesin, on natuke kunstlik, eks? Sa üldjuhul ei kavatse kogemata kustutada oma lähtekoodi ja siis on proovida ja siluda programmi. Aga loodetavasti ta andis sa illustratsioon on asju, mis siis võiks mõelda kui sa programmi silumist. Milline on asjade seis siin? Mis muutujad ma on kättesaadav mind? Kus täpselt on minu programmi krahh, mida joon, mida kõne, mida funktsioon? Millist vihjeid annab see mulle? Ja see on täpselt Selline mõtteviis, et teil tuleks sattumist, kui sa oled mõtled silumine oma programme. Ma olen Doug Lloyd. See on CS50.