Doug LLOYD: All GDB dritt. X'inhu eżattament? Allura GDB, li stands għall-Debugger GNU, hija għodda verament tal-biża li nistgħu jużaw biex tgħinna debug programmi tagħna, jew issir taf fejn l-affarijiet huma tmur ħażina fil-programmi tagħna. GDB huwa amazingly qawwija, iżda l-output u l-interazzjoni magħha tista 'tkun ftit cryptic. Huwa ġeneralment għodda linja ta 'kmand, u din tista tarmi ħafna ta 'messaġġi fi inti. U jista tip ta 'diffiċli biex parse eżattament x'inhu għaddej. Fortunatament, aħna ħadt passi li tiffissa din il-problema għalik kif inti taħdem permezz CS50. Jekk m'intix tuża l-grafika debugger, li kollega tiegħi Dan Armandarse mitkellma pjuttost ftit dwar fil-video li għandu jkun minn hawn dritt issa, jista 'jkollok bżonn li jużaw dawn linja tal-kmand għodod li jaħdmu ma 'GDB. Jekk int taħdem fil-CS50 IDE, inti m'għandekx bżonn li tagħmel dan. Imma jekk int ma jaħdmu fil-IDE CS50, forsi permezz ta 'verżjoni tal CS50 Appliance, jew Linux ieħor operattiva sistema ma GDB installat fuqu, jista 'jkollok bżonn li tuża dawn l-għodod linja tal-kmand. U peress li inti tista għandek tagħmel dan, huwa utli biss biex wieħed jifhem kif GDB xogħlijiet mill-linja tal-kmand. Iżda għal darb'oħra, jekk int tuża l-IDE CS50, inti jistgħu jużaw l-debugger grafika li hija mibnija fis-IDE. Allura biex tikseb l-affarijiet għaddejjin ma GDB, biex jibdew il-debugging proċess ta 'partikolari programm, inti kollha bżonn tagħmel huwa tat-tip GDB segwita mill-isem tal-programm. Għalhekk, per eżempju, jekk program tiegħek hija hello, inti tip bonjour GDB. Meta inti tagħmel dan, int ser biex tiġbed l-ambjent GDB. Your pront se jinbidlu, u minflok ma 'dak li normalment huwa meta inti tip affarijiet lejn il-ls line-- kmand, cd-- kollha ta 'tiegħek tipiċi Linux jikkmanda, fil-pront tiegħek ser tinbidel għal, probabbilment, xi ħaġa bħal parentesi GDB parentesi. C'est GDB pront ġdida tiegħek, għaliex int ġewwa l-ambjent GDB. Ladarba ġewwa ta 'dak l-ambjent, hemm żewġ jikkmanda ewlenin li inti probabilment tuża fl-ordni li ġejja. L-ewwel huwa b, li huwa qasir għall break. U wara inti tip b, inti tipikament tip l-isem ta 'funzjoni, jew jekk jiġri li tkun taf madwar liema linja numru programm tiegħek qed tibda li jaġixxu ftit stramb, inti tista tip linja Numru hemm ukoll. Liema b, jew break, ma huwa jippermetti program tiegħek jiddekorri sa ċertu punt, jiġifieri, l-isem tal-funzjoni li inti tispeċifika jew il-linja numru li inti tispeċifika. U f'dak il-punt, hija se friża eżekuzzjoni. Din hija ħaġa verament tajba, għaliex ladarba eżekuzzjoni ġiet iffriżata, inti tista 'tibda bil-mod ħafna pass permezz tal-programm tiegħek. Tipikament, jekk inti kont qed taħdem programmi tiegħek, dawn qed pretty qasir. Normalment, inti tip dot slash x'ikun l-isem tal-programm tiegħek huwa, hit Ikteb, u qabel ma tkun tista blink, tiegħek programm huwa diġà lest. Mhuwiex verament ħafna ħin biex jippruvaw u ċifra barra dak li għaddej ħażin. Allura huwa verament li tkun kapaċi jrażżan affarijiet stabbiliti billi jiġi stabbilit punt tal-qasma bil b, u mbagħad titjib fil. Imbagħad ladarba inti ħadthom stabbiliti break tiegħek punt, inti tista 'tmexxi l-programm. U jekk għandek xi argumenti kmand linja, inti tispeċifika lilhom hawnhekk, mhux meta inti tip GDB isem tal-programm tiegħek. Inti tispeċifika l-linja tal-kmand argumenti billi jieħdu r, jew run, u mbagħad ikun x'ikun linja tal-kmand argumenti għandek bżonn ġewwa tal-programm tiegħek. Hemm numru ta 'oħrajn verament kmandi importanti u utli ġewwa tal-ambjent PGD. So let me biss malajr jmorru fuq xi wħud minnhom. L-ewwel huwa n, li huwa qasir għall jmiss, u inti tista tip li jmiss minflok n, kemm tkun taħdem. U huwa biss l-shorthand. U kif inti probabilment ħadthom diġà gotten użati biex, tkun tista 'affarijiet tip iqsar huwa ġeneralment aħjar. U dak li se tagħmel huwa li ser pass 'il quddiem wieħed blokk ta' kodiċi. Allura dan ser jimxu 'l quddiem sakemm sejħa funzjoni. U allura minflok għaddasa fis dik il-funzjoni u li jmorru kollha permezz ta 'li l-funzjonijiet kodiċi, hija biss se jkollu l-funzjoni. Il-funzjoni se tkun imsejħa. Hija se tagħmel dak kollu li x-xogħol tagħha hu. Huwa ser jerġa valur li il-funzjoni li hija imsejħa. U allura inti ser timxi fuq il- linja li jmiss ta 'dik il-funzjoni sejħa. Jekk inti tixtieq li pass ġewwa tal-funzjoni, minflok sempliċiment li dan iwettaq, speċjalment jekk taħseb li l-problema jista jinsabu ġewwa ta 'dik il-funzjoni, inti tista ', naturalment, sett waqfa punt ġewwa ta 'dik il-funzjoni. Jew jekk int diġà għaddej, inti tista użu s pass 'il quddiem wieħed linja tal-kodiċi. Allura dan se tintervjeni u adsa fis-funzjonijiet, minflok sempliċiment għandek l-tesegwixxi u jkompli fuq fil-funzjoni li int fl għal debugging. Jekk inti qatt trid tkun taf il-valur ta 'varjabbli, inti tista tip p, jew Stampa, u mbagħad l-isem varjabbli. U li se jistampa lilek, ġewwa tal-ambjent GDB, l-isem tal-varjabbli, li you-- skuża me-- il-valur tal-varjabbli li inti stajt msemmija. Jekk inti trid tkun taf l-valuri ta 'kull aċċessibbli varjabbli lokali minn fejn inti bħalissa huma fis tiegħek programm, inti tista tip lokal info. Huwa ħafna aktar malajr milli ittajpjar p u mbagħad tkun xi tkun, elenkar out kollha tal- varjabbli li inti taf jeżistu. Tista 'tip lokal info, u se jistampa kollox għalik. Li jmiss up huwa bt, li huwa qosra għall Back traċċa. Issa, ġeneralment, speċjalment kmieni fil-CS50, inti mhux ser verament ikollhom okkażjoni għall-użu bt, jew Back Jittraċċaw, għaliex int ma jkollhom funzjonijiet li jsejħu funzjonijiet oħra. Inti jista 'jkollok prinċipali sejħa a funzjoni, iżda li probabbilment dan. Inti ma għandekx li funzjoni oħra sejħa funzjoni oħra, li jitlob funzjoni oħra, u l-bqija. Imma kif programmi tiegħek nikseb aktar kumplessi, u partikolarment meta tibda taħdem ma recursion, traċċa lura tista 'tkun mod verament utli biex tavżak tip ta 'nikseb xi kuntest ta fejn I am fil-programm tiegħi. Allura ngħid li inti stajt bil-miktub kodiċi tiegħek, u inti taf li ewlieni sejħiet funzjoni f, li jitlob funzjoni g, li jitlob funzjoni h. Allura għandna diversi saffi ta 'nesting jiġri hawn. Jekk int ġewwa tal ambjent GDB tiegħek, u inti taf ġewwa tiegħek tal h, imma tinsa dwar dak ltqajna inti fejn inti are-- inti tista tip BT, jew traċċa lura, u se jistampa h, g, prinċipali f, flimkien xi informazzjoni oħra, li jagħtik ħjiel li, prinċipali OK imsejħa f, f imsejħa g, g h imsejħa, u li fejn I bħalissa am fil-programm tiegħi. Allura jista 'jkun verament utli, speċjalment bħala l-cryptic-negozju tal GDB isir ftit kbira, biex issir taf eżattament fejn l-affarijiet huma. Fl-aħħarnett, meta program tiegħek isir, jew meta qed isir debugging dan u inti tixtieq li pass bogħod mill-ambjent GDB, dan jgħin biex tkun taf kif toħroġ minnha. Tista 'tip q, jew Nieqaf, li toħroġ. Issa, qabel video lum I ppreparat programm Buggy imsejħa buggy1, li jiena ikkumpilata minn fajl magħrufa bħala buggy1.c. Kif inti tista 'tistenna, dan programm huwa fil-fatt Buggy. Xi ħaġa tmur ħażin meta nipprova u run. Issa, sfortunatament, I involontarjament imħassar fajl buggy1.c tiegħi, dan sabiex għalija biex insemmu x'inhu għaddej ħażin ma dan il-programm, Jien ser jkollhom jużaw GDB tip ta 'bl-addoċċ, jippruvaw biex jinnaviga permezz dan il-programm għall insemmu eżattament x'inhu għaddej ħażin. Iżda bl-użu biss l-għodod konna diġà tgħallmu dwar, nistgħu figura pretty ħafna eżattament dak li hu. Mela ejja ras fuq CS50 IDE u agħti ħarsa. OK, hekk aħna qed hawn fil tiegħi CS50 ambjent IDE, u jien ser zoom ftit sabiex inti tista 'tara ftit aktar. Fil tieqa terminal tiegħi, jekk I lista il-kontenut tal direttur kurrenti tiegħi ma ls, aħna ser tara li I jkollhom koppja ta 'fajls sors hawn, inkluż il- diskuss qabel buggy1. X'inhuma eżattament tmur fuq meta Nipprova u run buggy1. Well ejja nsib. I tip dot mmejla, Buggy, u I hit Ikteb. Difetti segmentazzjoni. Li mhux tajjeb. Jekk inti recall, a tort segmentazzjoni tipikament iseħħ meta aħna jkollhom aċċess memorja li aħna mhux qed jitħallew għall-mess. Imxejna b'xi laħaq barra mill-limiti ta 'dak il-programm, il- kompilatur, tatna. U hekk diġà li l- clue li jżomm fil-toolbox kif aħna jibdew il-proċess debugging. Xi ħaġa marret ħażin għal ftit hawn. Dritt kollox, Mela ejja nibdew l-ambjent GDB u ara jekk nistgħu insemmu x'inhi eżattament l-problema hija. Jien ser ċar l-iskrin tiegħi, u jien ser tip GDB għal darb'oħra, jidhlu fl-ambjent GDB, u l-isem tal-programm li nixtieq li debug, buggy1. Nikbru messaġġ ftit, qari simboli mill buggy1, isir. Dak kollu li jfisser huwa miġbud flimkien kollha tal-kodiċi, u issa huwa kien jitgħabbew fil GDB, u huwa lest li tmur. Issa, dak li nixtieq do? Tiftakar dak l- ewwel pass tipikament huwa wara Jien ġewwa ta 'dan l-ambjent? Nisperaw, inti qal sett punt break, minħabba fil-fatt dan huwa dak li nixtieq do. Issa, jien ma jkollhom l- kodiċi tas-sors għal dan quddiem lili, li hija probabbilment mhuwiex il-każ użu tipiku, bil-mod. You probabbilment se. Allura li tajjeb. Imma jekk wieħed jassumi inti ma, x'hemm il-funzjoni waħda li taf teżisti f'kull programm C wieħed? Ma jimpurtax kemm hu kbir jew kif kkumplikata huwa, din il-funzjoni definittivament jeżisti. Main, id-dritt? Allura nuqqas kollox, nistgħu tistabbilixxi punt tal-qasma fil prinċipali. U għal darb'oħra, I jistgħu biss tip break prinċipali, minflok b. U jekk int kurjuż, jekk inti qatt tip out kmand twil u mbagħad jirrealizzaw li inti ttajpjati il-ħaġa ħażina, u inti tixtieq li jeħles ta 'kulħadd kif I biss ma, inti tista 'tieħu Kontroll U, li se ħassar kollox u inti tressaq lura għall-bidu tal-linji cursor. A ħafna aktar malajr milli sempliċement żomm il- tħassar, jew jolqot il-darba mazz fuq. Allura aħna ser jistabbilixxu punt tal-qasma fil prinċipali. U kif tista 'tara, li jgħid konna tistabbilixxi punt tal-qasma fil-fajl buggy1.c, u apparentement l-ewwel linja tal-kodiċi ta 'prinċipali hija linja sebgħa. Għal darb'oħra, aħna ma jkollhomx il sors fajl hawn, imma jien ser jassumi li huwa javżak me-verità. U mbagħad, jien biss tipprova u tmexxi l-programm, r. Programm tal-bidu. Dritt kollox, hekk dan il-messaġġ huwa xi ftit cryptic. Imma bażikament x'hemm jiġri hawn huwa huwa biss javżak me I ve hit break tiegħi punt, break-punt numru 1. U mbagħad, dik il-linja tal-kodiċi, ebda tali file jew direttorju. L-unika raġuni li Jien jaraw dak il-messaġġ huwa għaliex I involontarjament imħassar fajl buggy.c tiegħi. Jekk il-fajl buggy1.c tiegħi kienet teżisti fid-direttorju kurrenti, dak id-dritt line kieku hemm fil-fatt tell me dak li l-linja tal-kodiċi litteralment jaqra. Sfortunatament, I hija mħassra. Aħna ser ikollhom biex tip ta 'jinnaviga permezz ta 'dan ftit aktar bl-addoċċ. OK, so ejja naraw, dak do I trid tagħmel hawn? Well, I jixtieq ikun jaf liema lokali varjabbli forsi huma disponibbli għalija. Stajt bdew programm tiegħi. Ejja naraw dak li jista 'jkun diġà initialized għalina. I tip lokal Info, l-ebda lokal. Dritt kollu, sabiex ma tagħti me ton ta 'informazzjoni. I tista 'tipprova u jistampa varjabbli, imma jien ma nafx xi ismijiet varjabbli. I tista 'tipprova traċċa lura, imma jien ġewwa tal ewlenija, so I know I ma jkunux għamlu sejħa oħra funzjoni dritt issa. Allura jidher qisu għażliet biss tiegħi huma li tuża n jew hekk u jibdew adsa. Jien ser tuża n. So I tip n. Oh gosh tiegħi, dak li qed jiġri hawn. Programm irċieva sinjali, SIGSEGV tort segmentazzjoni, u mbagħad mazz sħiħ ta 'għalf. Jien diġà megħlub. Ukoll, hemm attwalment lott li wieħed għandu jitgħallem hawn. Allura dak li jfisser dan tgħidilna? Dak li tgħidilna huwa, dan il-programm huwa waslet biex, iżda għadu ma, tort SEG. U b'mod partikolari, jien ser li zoom anke aktar hawn, huwa dwar li SEG tort dwar xi ħaġa imsejħa strcmp. Issa, aħna ma jista diskussi din il-funzjoni b'mod estensiv. Iżda huwa is-- għaliex aħna ma tkunx qed tmur biex jitkellmu dwar kull funzjoni li teżisti fl-istandard C library-- iżda dawn qed kollha disponibbli lilek, partikolarment jekk inti tieħu tħares lejn reference.cs50.net. U strcmp huwa verament b'saħħtu funzjoni li teżisti ġewwa tal-header string.h fajl, li huwa header fajl li hija ddedikata għall-funzjonijiet li x-xogħol ma 'u timmanipula kordi. U b'mod partikolari, dak strcmp ma huwa jikkompara l-valuri ta 'żewġ kordi. Hekk jien wasalt biex Segmentazzjoni tort fuq sejħa għall strcmp jidher. I hit n, u fil-fatt I nikseb il-messaġġ, programm ttemm fil SIGSEGV sinjal tort segmentazzjoni. Allura issa I attwalment jkollhom seg akkużati, u l-programm tiegħi pretty ħafna effettiv mogħti. Dan huwa l-aħħar tal-programm. Hija fallew, ġġarraf. Allura ma kien ħafna, imma jien fil-fatt ma jitgħallmu pjuttost ftit minn din l-esperjenza ftit. Liema kienu I tgħallmu? Ukoll, il-programm tiegħi ħabtiet pretty ħafna immedjatament. Programm tiegħi crashes fuq Sejħa għall strcmp, imma I m'għandhom l-ebda varjabbli lokali tiegħi programm fiż-żmien li ġġarrfu. Allura dak string, jew kordi, jista I tkun possibbilment jitqabblu. Jekk jien ma jkollhom ebda lokali varjabbli, inti tista surmise li I have-- hemm forsi huwa varjabbli globali, li jista 'jkun minnu. Iżda ġeneralment, jidher bħal jien tqabbil għal xi ħaġa li ma teżistix. Mela ejja tinvestiga li ftit aktar. Hekk jien ser ċara iskrin tiegħi. Jien ser nieqaf mill- Ambjent GDB għat-tieni. U jien ħsieb, OK, hekk hemm ebda varjabbli lokali fl-programm tiegħi. I wonder jekk forsi jien suppost li jgħaddu fi string bħala argument kmand tal-linja. Mela ejja biss dan it-test. I għadhom ma għamlux dan qabel. Ejja naraw jekk forsi jekk I run dan il-programm bi argument kmand tal-linja taħdem. Huh, l-ebda tort segmentazzjoni hemmhekk. Hija biss told me I dehret out. Allura forsi li l-jiffissaw hawn. U fil-fatt, jekk immur lura u nħarsu lejn il-kodiċi tas-sors attwali għall buggy1.c, jidher bħallikieku dak li qed nagħmel huwa Jien jagħmlu sejħa għal strcmp mingħajr verifika jekk fil-fatt ARGV [1] jeżisti. Dan huwa effettivament il- kodiċi tas-sors għall buggy1.c. Allura dak I really bżonn biex tagħmel hawn biex jiffissaw programm tiegħi, jekk wieħed jassumi Għandi l- fajl quddiem lili, huwa li żżid ftit kontroll li jagħmlu żgur li argc huwa ugwali għal 2. Allura dan l-eżempju, għal darb'oħra, bħal I said, huwa ftit artifiċjali, right? Int ġeneralment mhux ser aċċidentalment tħassar kodiċi sors tiegħek u mbagħad għandhom jippruvaw u debug-programm. Iżda wieħed jittama, hija tat inti illustrazzjoni tat-tipi ta 'affarijiet li inti tista 'taħseb dwar kif int debugging program tiegħek. X'inhu l-istat ta 'affarijiet hawn? What do I varjabbli għandhom aċċessibbli lili? Fejn eżattament programm tiegħi jiġġarrfu, fuq liema linja, fuq dak sejħa għal liema funzjoni? X'tip ta 'ħjiel ma li jagħtu me? U dan huwa eżattament l- tip ta 'mentalità li inti għandek tkun jkollna fis meta int jaħsbu dwar debugging programmi tiegħek. Jien Doug Lloyd. Dan huwa CS50.