DOUG LLOYD: Allt í lagi GDB. Hvað er það nákvæmlega? Svo GDB, sem stendur fyrir GNU Debugger, er mjög ógnvekjandi tól sem við getum notað til að hjálpa okkur að kemba forrit okkar, eða finna út hvar hlutirnir eru að fara úrskeiðis í áætlunum okkar. GDB er ótrúlega öflugur, en framleiðsla og samspil við það getur verið svolítið dulinn. Það er yfirleitt a stjórn lína tól, og það getur kastað mikið af skilaboðum á þig. Og það getur eins konar erfitt að flokka nákvæmlega hvað er að gerast. Sem betur fer, höfum við gert ráðstafanir að laga þetta vandamál fyrir þig eins og þú vinna í gegnum CS50. Ef þú ert ekki að nota grafísku aflúsara, sem samstarfsmaður Dan minn Armandarse hefur talað alveg svolítið um í myndbandi sem ætti að vera hérna núna, þú gætir þurft að nota þessa stjórn lína verkfæri til að vinna með gdb. Ef þú ert að vinna í CS50 IDE, þú þarft ekki að gera þetta. En ef þú ert ekki vinna í CS50 IDE, kannski nota útgáfu CS50 Appliance, eða annar Linux stýrikerfi kerfi með gdb upp á það, þú gætir þurft að nota þessi stjórn lína tól. Og þar sem þú gætir að gera það, það er gagnlegt bara að skilja hvernig GDB verksmiðja frá the stjórn lína. En aftur, ef þú ert nota CS50 IDE, þú Hægt er að nota grafísku aflúsara sem er byggt inn í IDE. Svo til að fá það að fara með GDB, til að hefja kembiforrit Ferlið tiltekin program, það eina sem þú þarft að gera er að slá GDB fylgt af áætluninni nafni. Svo til dæmis, ef forritið þitt er halló, myndir þú slærð gdb halló. Þegar þú gerir það, þú ert að fara að draga upp gdb umhverfi. Hvetja mun breytast, og í stað þess að vera það sem það venjulega er þegar þú slærð það Í stjórn line-- LS, cd-- öll dæmigerð Linux skipanir, hvetja þig mun breytast til, líklega eitthvað eins sviga GDB sviga. Það er nýtt GDB hvetja þinn, því þú ert inni í GDB umhverfi. Einu sinni inni í því umhverfi, það er tveir helstu skipanir að þú munt sennilega nota í eftirfarandi röð. Í fyrsta lagi er b, sem er stutt fyrir brot. Og eftir að þú slærð b, þú oftast Sláðu inn nafn fall, eða ef þú skyldir vita um hvaða línu númer program er farin að haga sér svolítið skrítið, þú getur slegið línu Fjöldi þar sem vel. Hvað b, eða brot, er er það gerir program að hlaupa upp til að ákveðnum stað, nefnilega, nafn fallsins sem þú tilgreinir eða lína tala sem þú tilgreinir. Og á þeim tímapunkti, það vilja frysta framkvæmd. Þetta er mjög gott, því þegar framkvæmd hefur verið fryst, þú getur byrjað að mjög hægt skref í gegnum program. Venjulega, ef þú hefur verið að keyra áætlanir þínar, þá eru þeir mjög stutt. Venjulega, þú skrifar punktur rista hvað nafn program er, ýta á Enter, og áður en þú getur blikka, þinn Námið er þegar lokið. Það er ekki raunverulega a einhver fjöldi af tími til að reyna og reikna út hvað er að fara úrskeiðis. Svo það virkilega að vera fær um að hægur hlutur niður með því að setja brot lið með b, og þá í málinu. Síðan þegar þú hefur stillt brot þitt lið, er hægt að keyra forritið. Og ef þú hefur einhverjar stjórn lína rifrildi, þú tilgreinir þær hér, ekki hvenar þú skrifar GDB nafn program. Þú verður að tilgreina allar stjórn lína rök með því að taka r, eða hlaupa, og þá hvað stjórn lína rifrildi þú þarft inni forritinu. There ert a tala af öðrum í raun mikilvægt og gagnlegt skipanir inni af landsframleiðslu umhverfi. Svo láta mig bara fljótt fara yfir nokkrar af þeim. Í fyrsta lagi er n, sem er stytting á næsta, og þú getur slegið á næsta stað n, bæði myndi vinna. Og það er bara styttingin. Og eins og þú hefur sennilega nú þegar fengið er notað til að, að vera fær um að slá inn hluti styttri er almennt betri. Og hvað það mun gera það mun stíga fram einn kóðanum. Svo það verður að halda áfram þar til virka símtalinu. Og þá í stað þess köfun í að virka og fara í gegnum öll þessi störf númer, það verður bara að hafa það hlutverk. Fallið verður kallað. Það mun gera hvað starf hennar er. Það mun skila gildi til virka sem kallaði það. Og þá munt þú fara til the næsta lína af þeirri starf virka. Ef þú vilt að stíga inni á virka, í stað þess að bara að hafa það framkvæma, sérstaklega ef þú heldur að vandamálið gæti liggja inni að virka, þú gætir auðvitað sett hlé benda inni að virka. Eða ef þú ert nú þegar í gangi, þú getur nota s til að stíga fram eina línu af kóða. Þannig að þetta mun stíga á og kafa í aðgerðir, í stað þess að bara hafa keyrt og halda áfram á sömu aðgerðina að þú ert í fyrir kembiforrit. Ef þú vilt alltaf að vita gildi breytu, þú getur slegið p, eða prenta, og þá breyta heiti. Og það mun prenta út til yðar, inni á gdb umhverfi, nafn breytu, sem you-- afsakar me-- gildi breytunnar sem þú hefur nefnt. Ef þú vilt vita gildi á hverjum staðbundin breytu aðgengileg hvaðan þú ert nú í þinn program, getur þú slærð upplýsa heimamenn. Það er mikið hraðar en slá p og þá hvað, skráningu út allar breytur sem þú veist eru. Þú getur slegið upplýsingum heimamenn, og það mun prenta út allt fyrir þig. Næst er bt, sem er stutt fyrir bak Trace. Nú, almennt, sérstaklega snemma í CS50, þú munt ekki raunverulega hafa tækifæri að nota BT, eða aftur Trace, vegna þess að þú ert ekki að hafa aðgerðir að hringja í önnur störf. Þú gætir hafa helstu hringja í virka, en það er líklega það. Þú þarft ekki að öðru hlutverki að hringja í annað virka, sem kallar annan valkost, og svo framvegis. En eins og áætlanir þínar fá meira flókið, og sérstaklega þegar þú byrjar að vinna með endurkvæmni, aftur rekja getur verið mjög gagnleg leið til að láta þig konar fá smá samhengi þar Ég er í áætlun mína. Svo segja að þú hafir skrifað númerið þitt, og þú veist að helsta kallar virka f sem kallar virka g, sem kallar virka h. Þannig að við höfum nokkur lög af hreiður fara á hér. Ef þú ert inni á GDB umhverfi þitt, og þú veist Inni H, en þú gleymir um hvað fékk þig þangað sem þú are-- þú getur slegið BT, eða bak rakið, og það mun prenta út h, g, f meginatriðum ásamt einhverjum öðrum upplýsingum, sem gefur þér vísbendingu um að, OK helstu kallað f-f heitir g, g heitir h og það er þar sem ég nú er í áætlun mína. Svo það getur verið mjög gagnlegt, sérstaklega þar sem dulinn-nesi á gdb verður svolítið yfirþyrmandi, að finna út nákvæmlega hvar hlutirnir eru. Að lokum, þegar kerfið er að gert, eða þegar þú ert búinn kembiforrit það og þú vilt að stíga í burtu frá gdb umhverfi, það hjálpar að vita hvernig á að fá út úr því. Þú getur slegið q eða Hætta til að komast út. Nú, áður vídeó dag Ég undirbúið þrjótur forrit heitir buggy1, sem ég saman úr skrá sem kallast buggy1.c. Eins og þú might búast við, þetta Námið er í raun kerrunni. Eitthvað fer úrskeiðis þegar ég reyni og keyra það. Nú, því miður, ég óvart eytt buggy1.c skrá minn, svo í því skyni fyrir mig að reikna út hvað er að gerast rangt með þessu forriti, Ég ætla að hafa að nota GDB konar blindni, reyna að sigla í gegnum þetta forrit til reikna út nákvæmlega hvað er að fara úrskeiðis. En að nota bara verkfæri við höfum nú þegar lært um, við getum nokkurn veginn mynd út nákvæmlega hvað það er. Svo skulum fara yfir til CS50 IDE og hafa a líta. OK, þannig að við erum hér í minn CS50 IDE umhverfi, og ég ætla að stækka smá svo þú getur séð smá meira. Í flugstöðinni gluggann minn, ef ég lista innihald núverandi forstöðumaður minn með LS, munum við sjá að ég hafa a par af uppspretta skrá hér, þar á meðal áður rætt buggy1. Hvað nákvæmlega fer á þegar Ég að reyna að hlaupa buggy1. Jæja við skulum finna út. Ég gerð punktur rista, þrjótur, og ég ýta á Enter. Skiptingu galla. Það er ekki gott. Ef þú manst, a skiptingu kenna yfirleitt sér stað þegar við aðgang minni að við erum ekki leyft að snerta. Við höfum einhvern veginn náð utan við mörk af því hvað forritið er þýðanda, hefur gefið okkur. Og svo þegar er að vísbending að halda í verkfærakistu þegar við byrjum kembiforrit aðferð. Eitthvað hefur farið lítið rangt hér. Allt í lagi, þannig að við skulum byrja upp gdb umhverfi og sjá hvort við getum fundið út hvað nákvæmlega vandamálið er. Ég ætla að hreinsa skjáinn minn, og ég ætla að slá GDB aftur, til að slá inn gdb umhverfi, og nafn af the program að ég vil að kemba, buggy1. Við fáum smá skilaboð, lesa tákn frá buggy1, gert. Allt sem þýðir það dregið saman allan kóðann, og nú er verið hlaðið inn í GDB, og það er tilbúið til að fara. Nú, hvað mig langar að gera? Manstu hvað við Fyrsta skrefið venjulega er eftir að ég er inni þessu umhverfi? Vonandi sagði þér að setja a brot lið, vegna þess í raun það er það sem ég vil gera. Nú, ég hef ekki Kóðinn fyrir þetta fyrir framan mig, sem er sennilega ekki dæmigerður nota málið, við the vegur. Þú verður sennilega. Svo er það gott. En miðað við að þú ert ekki, það er sá fall sem þú veist er til í hvert einasta C program? Sama hversu stór eða hversu flókið það er þessi aðgerð er til ákveðið. Main, ekki satt? Svo galli allt annað, við getum setja brot lið á main. Og aftur, ég gæti bara slá brjóta helstu, í stað þess að b. Og ef þú ert forvitinn, ef þú alltaf slá út í langan skipun og þá átta sig á að þú slegið rangt hlutur, og þú vilt losna af öllu sem ég gerði bara, hægt að taka stjórn U, sem mun eyða öllu og koma þér aftur að upphafi bendilinn línum. A einhver fjöldi hraðar en bara halda niðri eyða eða hitting það fullt sinnum yfir. Þannig að við munum setja brot lið á helstu. Og eins og þú geta sjá, það segir að við höfum setja brot lið á skrá buggy1.c, og virðist fyrsta línan af kóða á helstu er lína sjö. Aftur, við höfum ekki frumskrár hér, en ég geri ráð fyrir að það er segja mér sannleikann. Og þá, ég er bara að reyna og hlaupa the program, r. Byrjar program. Allt í lagi, þannig að þessi skilaboð er svolítið dulinn. En í grundvallaratriðum er það að gerast hér er að það er bara segja mér að ég hef lenti hlé minn lið, brot lið númer 1. Og svo, að lína af kóða, Engin slík skrá né mappa. Eina ástæðan fyrir því að Ég ætla að sjá þessi skilaboð er vegna þess að ég óvart eytt buggy.c skrá minn. Ef buggy1.c skrá minn verið í núverandi möppu, þessi lína þarna væri í raun segja mér hvað lína af kóða bókstaflega les. Því miður, ég eyddi því. Við erum að fara að þurfa að konar vafra gegnum þetta aðeins meira í blindni. OK, þannig að við skulum sjá, hvað Ég vil gera hér? Jæja, ég vildi eins og til vita hvað sveitarfélaga breytur kannski eru í boði fyrir mig. Ég hef byrjað að forritið mitt. Við skulum sjá hvað gæti verið þegar frumstilla fyrir okkur. Ég gerð Info heimamenn, ekki heimamenn. Allt í lagi, þannig að ekki gefa mér tonn af upplýsingum. Ég gæti reynt og prenta út breytu, en ég veit ekki hvaða breytu nöfn. Ég gæti reynt bak ummerki, en ég er inni main, þannig að ég veit að ég hef ekki gert annar virka símtalinu núna. Svo lítur út eins einu valkostirnir mínir eru að nota n eða svo og byrja að kafa í. Ég ætla að nota n. Svo ég slá n. Oh my gosh, hvað er að gerast hér. Program fengið merki, SIGSEGV skiptingu kenna, og þá er allt fullt af efni. Ég er nú þegar óvart. Jæja, það er í raun geta lært margt hér. Svo hvað segir þetta okkur? Hvað það segir okkur er, this program er um að, en hefur ekki enn, seg kenna. Einkum, ég ætla að stækka enn frekar hér, það er um að seg kenna um eitthvað sem kallast strcmp. Nú getum við ekki rætt þessi aðgerð mikið. En það is-- vegna þess að við erum ekki að fara að tala um alla virka sem er til í C Standard library-- en þeir eru allir í boði fyrir þig, sérstaklega ef þú tekur a líta á reference.cs50.net. Og strcmp er mjög öflugur fall sem er til inni af string.h haus skrá, sem er haus skrá sem er tileinkað aðgerðir að vinna með og vinna strengi. Einkum hvað strcmp gerir er það saman gildi tveimur strengjum. Þannig að ég er að fara að skiptingu kenna á símtali stendur til að strcmp það virðist. Ég lenti n, og í raun ég að fá skilaboð, program slitið með merki SIGSEGV skiptingu kenna. Svo nú Ég reyndar hef seg faulted, og áætlun mín er ansi mikið í raun gefið upp. Þetta er endir af the program. Það braut niður, hrundi það. Svo var ekki mikið, en ég reyndar gerði læra töluvert frá þessu litla reynslu. Hvað hef ég lært? Jæja, program minn hrun ansi mikið strax. Áætlun mín hrun á a kalla til strcmp, en ég ekki hafa allir staðværar breytur í mínum program á þeim tíma sem hún frýs. Svo hvað band, eða strengir, gæti ég hugsanlega verið að bera saman. Ef ég hef ekki allir heimamaður breytur, þú gætir surmise að ég have-- það kannski er global breyta, sem gæti verið satt. En almennt, það virðist eins og ég er að bera saman eitthvað sem er ekki til. Svo skulum rannsaka að aðeins lengra. Þannig að ég ætla að hreinsa skjáinn minn. Ég ætla að hætta út af GDB umhverfi fyrir a second. Og ég er að hugsa, OK, þannig að það er engar staðbundnar breytur í forritinu mínu. Ég velti því ef til vill ég átti að fara í streng sem stjórn lína rifrildi. Svo skulum prófa bara þetta út. Ég hef ekki gert þetta áður. Við skulum sjá hvort kannski ef ég keyra þetta forrit með stjórn lína rifrildi það virkar. Huh, ekki skiptingu kenna það. Það sagði bara við mig að ég mynstrağur það út. Svo kannski er að festa hér. Og reyndar, ef ég fer aftur og líta á í raun Kóðinn fyrir buggy1.c, það virðist eins og það sem ég er að gera er Ég er að hringja til að strcmp án athuga hvort í raun argv [1] til. Þetta er í raun Kóðinn fyrir buggy1.c. Svo það sem ég þarf virkilega að gera hér til að festa áætlun mína, miðað Ég hef skrá fyrir framan mig, er bara bæta ávísun til að gera úr skugga um að argc er jafnt og 2. Þannig að þetta dæmi, aftur, eins og ég sagði, er svolítið háttuð, ekki satt? Þú ert yfirleitt ekki að fara að tilviljun að eyða kóðann þinn og þá þarf að reyna og kemba program. En vonandi, gaf það þú mynd sem sýnir um hvers konar hluti sem þú gætir verið að hugsa um eins og þú ert að kemba program. Hvað er ástand mála hér? Hvað breytur gera I hafa aðgengilegar mér? Hvar nákvæmlega er áætlun mín hrun, á hvaða línu, á hvað kalla til hvaða starfsemi? Hvers konar vísbendingar er að gefa mér? Og það er einmitt konar hugarfari sem þú skal fá inn þegar þú ert hugsa um kembiforrit programs. Ég er Doug Lloyd. Þetta er CS50.