>> Doug LLOYD: Visos teisės GDB.
Kas tai tiksliai?
Taigi GDB, kuris reiškia už GNU Debugger,
yra tikrai nuostabus įrankis, kad mes galime naudoti, siekiant padėti mums derinti savo programas,
arba sužinoti, kur viskas yra negerai mūsų programas.
GDB yra stebėtinai galingas, tačiau produkcijos ir sąveikos su juo
gali būti šiek tiek paslaptingas.
Tai paprastai komandų eilutės įrankis, ir jis gali mesti daug pranešimų į tave.
Ir ji gali tipo sunku išanalizuoti tiksliai, kas vyksta.
Laimei, mes ėmėsi veiksmų išspręsti šią problemą už jus
kaip jūs dirbate per CS50.
Jei nesate naudojant grafines debugeris, kuris mano kolega Dan
Armandarse kalbėjo gana šiek tiek apie į vaizdo įrašą, kuris
turėtų būti daugiau nei čia dabar, jums gali prireikti
naudoti šias komandų eilutę Įrankiai darbui su GDB.
Jei dirbate į CS50 IDE, jums nereikia tai padaryti.
Tačiau, jei nesate dirba CS50 IDE,
galbūt naudojant versija iš CS50 Appliance,
ar kitas Linux operacinė sistema su GDB įdiegta,
Jums gali tekti naudoti Šie komandinės eilutės įrankius.
>> O kadangi jums gali turi padaryti, tai
Naudinga tiesiog suprasti, kaip GDB veikia iš komandinės eilutės.
Bet vėl, jei esate naudojant CS50 IDE, jums
galite naudoti grafinį debugerem kuris yra pastatytas į IDE.
Taigi, norint gauti dalykų vyksta su GDB, pradėti derinti
procesas ypač programa, viskas, ką jums reikia padaryti,
tai tipo GDB po pagal programos pavadinimą.
Taigi, pavyzdžiui, jei jūsų programa yra Sveiki, turėtumėte įvesti GDB labas.
>> Kai tai padarysite, jūs ketinate atsigriebti GDB aplinką.
Jūsų greitas keisis ir vietoj to, kad tai, ką ji paprastai
yra tada, kai įvedate dalykus Į komandų line-- ls,
cd-- visi jūsų tipiškų "Linux" komandos, savo eilutę
keisis galbūt kažką kaip skliausteliuose GDB skliausteliuose.
Štai jūsų naują GDB greitai, nes esate viduje GDB aplinkoje.
Kai viduje toje aplinkoje, ten du pagrindiniai komandos
kad jūs tikriausiai naudoti tokia tvarka.
>> Pirmasis yra b, kuris yra trumpas pertraukos.
Ir po to, kai B tipo, jums paprastai įveskite pavadinimą funkcija,
arba, jei atsitiktų žinoti maždaug kas eilutės numeris
Jūsų programa pradeda elgtis truputį keistai,
galite įrašykite linija Taškų ten taip pat.
Kas B arba pertrauka, ar tai leidžia savo programą
paleisti iki tam tikro taško, būtent, funkcijos pavadinimas
kad jūs nurodote ar linija skaičius, kad jūs nurodote.
>> Ir tuo momentu, tai bus įšaldyti vykdymą.
Tai yra tikrai geras dalykas, nes kartą vykdymas buvo užšaldytas,
galite pradėti labai lėtai žingsnis per savo programą.
Paprastai, jei jau veikia jūsų programas, jie gana trumpas.
Paprastai įvesite dot velniop viską, Jūsų programos pavadinimas, paspauskite Enter,
prieš galite mirksėti, jūsų programa jau baigta.
Tai tikrai ne laikas pabandyti daug ir išsiaiškinti, kas vyksta negerai.
Taigi, tai tikrai, kad būtų galima sulėtinti dalykus nustatę pertraukos tašką su B,
ir tada žengia į.
>> Tada, kai jūs nustatyti savo pertrauką taškas, galite paleisti programą.
Ir jei jūs turite bet kurį komandinės eilutės argumentai,
Jūs juos nurodyti čia ne tada, kai įvedate GDB jūsų programos pavadinimas.
Jūs nurodote visą komandinę eilutę argumentai, imantis R, arba paleisti,
ir tada kokia komandinės eilutės argumentai jums reikia viduje savo programą.
Yra kitas numeris tikrai svarbus ir naudingas komandas
viduje BVP aplinkoje.
Taigi leiskite man tiesiog greitai eiti per kai kurias iš jų.
>> Pirmasis yra n, kuris yra trumpas kitą, ir jūs galite įvesti Kitas vietoj n,
tiek dirbtų.
Ir tai tik sutrumpinimas.
Ir kaip jūs tikriausiai jau įsigijo naudojamas, kad galėtų įvesti dalykus
trumpesnis paprastai yra geriau.
Ir ką jis darys tai bus žingsnis į priekį vieną bloką kodą.
Taigi jis bus judėti pirmyn kol skambinimo funkcijos.
Ir tada vietoj Nardymas į tą funkciją
ir vyksta per visus, kuris veikia kodas, ji bus tiesiog turi funkciją.
>> Ši funkcija bus vadinamas.
Jis padarys viską, jos darbas yra.
Jis grįš vertę funkcija, kad pavadino ją.
Ir tada jums pereiti į kitą eilutę tos skambinimo funkcija.
Jei norite žingsnis viduje funkcija,
vietoj tiesiog tai vykdyti, ypač
jei manote, kad problemos gali gulėti viduje šią funkciją,
galima, žinoma, nustatyti pertraukos atkreipti viduje šią funkciją.
Arba, jei jūs jau veikia, galite naudoti S žingsnis į priekį vieną eilutę kodo.
>> Taigi, tai bus žingsnis ir pasinerti į funkcijas,
o ne tik turėti vykdyti ir tęsiant į funkciją
kad esate už derinti.
Jei kada nors norėsite žinoti kintamųjų vertės,
galite įvesti p, arba spausdinti, ir tada kintamasis, pavadinimas.
Tai ir bus išspausdinti jums, viduje GDB aplinkoje,
kintamojo vardas, kad you-- dovanokite me-- kintamojo vertę
kad jūs pavadinimu.
Jei norite žinoti, kas vertybes vietos kintamasis prieinamas iš kur
Jūs šiuo metu yra jūsų programa, galite įvesti info gyventojais.
Tai daug greičiau nei rašyti P ir tada kas,
sąrašą įgyvendinti visus kintamieji, kad jūs žinote egzistuoja.
Galite įvesti info vietiniai, ir jis bus išspausdinti viską už jus.
Toliau, BT, kuri yra trumpas Atgal pėdsakų.
Dabar, paprastai, ypač anksti CS50,
jūs ne iš tikrųjų turėti proga naudoti BT, arba Atgal, Trace,
nes jūs neturi funkcijos kad skambinti kitas funkcijas.
>> Jums gali tekti pagrindinis paskambinti funkcija, bet tai tikriausiai jis.
Jūs neturite tą kitą funkciją paskambinę kitą funkciją, kuri
prašo kitą funkciją, ir taip toliau.
Bet kaip jūsų programas gauti daugiau kompleksas, o ypač
kai pradėsite dirbti su rekursijos, nugaros pėdsakų
gali būti tikrai naudingas būdas jums rūšies kažkiek už kur kontekstą
Aš esu savo programą.
Taigi sakau jums parašiau savo kodą, ir jūs žinote, kad pagrindinis ragina funkciją
f, kurioje raginama funkciją g, kurioje raginama funkciją h.
Taigi, mes turime keletą sluoksnių ilsėtųsi vyksta čia.
>> Jei esate viduje Jūsų GDB aplinka,
ir jūs žinote savo vidų iš H, tačiau pamiršote
apie tai, ką turiu jums, kur jūs are-- galite įvesti bt ar nugaros pėdsakų,
ir ji bus atspausdinti h, G, f pagrindinis, kartu su kitu informacijos, kuri
suteikia jums clue, kad Gerai pagrindinis vadinamas, f, g, f, vadinamą, g vadinamas h greičiu,
ir tai, kur aš Šiuo metu esu savo programą.
Taigi ji gali būti tikrai naudinga, ypač kaip paslaptingas-ness iš GDB
tampa šiek tiek absoliuti, kad sužinoti, kur tiksliai viskas yra.
Galiausiai, kai jūsų programa yra padaryta, arba kai baigsite derinti ją
ir norite žingsnį iš GDB aplinkoje,
ji padeda sužinoti, kaip gauti iš jo.
Galite įvesti q, arba Baigti, išeiti.
Dabar, prieš šiandienos video Aš parengė Buggy programą
vadinamas buggy1, kurį aš sudarytas iš failo žinomas kaip buggy1.c.
Kaip galima tikėtis, šis Programa yra iš tikrųjų Buggy.
Kažkas negerai kai bandau ir paleisti jį.
Dabar, deja, aš netyčia ištrinti savo buggy1.c failą,
taip, kad man išsiaiškinti, kas vyksta negerai su šia programa,
Aš ruošiuosi naudoti GDB rūšies aklai, bando
Norėdami naršyti šią programą išsiaiškinti tiksliai, kas vyksta negerai.
Tačiau naudojant tik tuos įrankius mes jau sužinojau apie,
mes galime gana daug skaičių tiksliai kas tai yra.
Taigi leiskite per galvą CS50 IDE ir turėti išvaizdą.
Gerai, kad mes čia mano CS50 IDE aplinka,
ir aš priartinti trupučiu todėl jūs galite pamatyti šiek tiek daugiau.
Mano terminalo langą, jei aš sąrašą Į mano dabartinis direktorius turinys
su LS, matysime, kad aš turėti šaltinio failus pora
čia, įskaitant aptarta anksčiau buggy1.
Kas tiksliai vyksta, kai Aš stengiuosi ir paleisti buggy1.
Na tegul sužinoti.
I tipo dot velniop, Buggy, ir aš paspauskite Enter.
>> Segmentavimas gedimus.
Tai nėra gerai.
Jei prisimenate A segmentavimo kaltės paprastai
atsiranda tada, kai mes Access Memory kad mes negali paliesti.
Mes kažkaip pasiekė ne iš ribų
kas programą, kompiliatorius, davė mums.
Ir taip jau tai yra raktas išlaikyti rinkinio
kaip mes pradėti derinimo procesą.
Kažkas nuėjo šiek tiek negerai čia.
>> Visos teisės, todėl pradėkime Up GDB aplinkoje
ir pamatyti, jei mes galime išsiaiškinti, kas tiksliai yra problema.
Aš ruošiuosi išvalyti ekraną, ir aš ruošiuosi rašyti GDB
vėl patekti į GDB aplinką, ir programos pavadinimas
kad aš noriu derinti, buggy1.
Mes gauname mažai pranešimą, skaitymas simboliai iš buggy1, padaryta.
Visa tai reiškia, tai ištraukti kartu visų kodą,
ir dabar jis buvo pakrautas į GDB, ir jis yra pasirengęs eiti.
>> Dabar, ką noriu daryti?
Ar prisimenate ką Pirmasis žingsnis paprastai yra
Po Aš viduje šioje aplinkoje?
Tikimės, kad Jūs sakėte, nustatyti pertrauka taškas, nes
Iš tikrųjų tai, ką noriu daryti.
Dabar aš neturite kodo tai
priešais mane, kuris yra tikriausiai nėra tipiškas naudojimo atveju, beje.
Jūs tikriausiai.
Taigi, kad gerai.
Bet jei jūs neturite, kas viena funkcija, kad žinote,
egzistuoja kiekvieno C programa?
Nesvarbu, kaip didelis ar kaip sudėtinga tai, ši funkcija tikrai egzistuoja.
Pagrindinė, tiesa?
>> Taigi jei visa kita, mes galime nustatyti pertraukos tašką pagrindinis.
Ir vėl, galėčiau tiesiog įveskite pertrauka pagrindinis, vietoj to, b.
Ir jei įdomu, jei jūs nors tipo iš ilgą komandą
ir tada suprasite, kad jums įvedėte neteisingą dalyką,
ir norite atsikratyti Visų kaip aš ką tik padariau,
galite Imkis U, kuris bus ištrinti viską ir atneš jums atgal
su žymeklio linijų pradžioje.
Daug greičiau nei tiesiog laikykite nuspaudę ištrinti ar pataikyti krūva kartus
daugiau.
>> Taigi, mes nustatysime pertraukos tašką pagrindinis.
Ir, kaip matote, ji sako, mes nustatyti pertraukos tašką failo buggy1.c,
ir, matyt, pirmoji eilutė kodo pagrindinių yra linija septyni.
Kartą, mes neturi šaltinio failas čia
bet aš manyti, kad tai pasakojo tiesą.
Ir tada, aš tiesiog bando ir paleisti programą, r.
Pradedant programą.
Visos teisės, todėl šis pranešimas yra šiek tiek paslaptingas.
Tačiau iš esmės tai, kas vyksta čia yra tai tik
pasakojo, aš nukentėjo mano pertraukos taškas, pertrauka punkto numeris 1.
>> Ir tada, kad kodo eilutę, Nėra tokio failo ar katalogo.
Vienintelė priežastis, dėl kurios Matau, kad pranešimą
nes aš netyčia ištrinti savo buggy.c failą.
Jei mano buggy1.c failas egzistavo dabartiniame kataloge
kad linijos tiesiai ten iš tikrųjų pasakykite man, ką kodo eilutę
tiesiog skaito.
Deja, aš ištrynė jį.
Mes ketiname turite rūšies navigate per tai šiek tiek daugiau aklai.
>> Gerai, kad pažiūrėkime, ką aš noriu padaryti čia?
Na, aš norėčiau žinoti, ką vietos kintamieji gal galima man.
Aš pradėjau savo programą.
Pažiūrėkime, kas gali būti jau inicializuoti už mus.
I tipo Info vietiniai, ne vietiniai.
Gerai, taip, kad nėra duok man informacijos toną.
Galėčiau pabandyti ir atsispausdinti kintamąjį, bet aš nežinau jokių kintamųjų vardai.
Galėčiau pabandyti atgal pėdsakų, bet aš viduje pagrindinis,
todėl aš žinau, aš nepadariau kita skambinimo funkcijos dabar.
>> Taigi atrodo, kad mano vienintelis pasirinkimas yra naudoti n ar taip ir pradėti pasinerti.
Aš ruošiuosi naudoti n.
Taigi aš Type n.
Oh my GOSH, kas vyksta čia.
Programa gavo signalus, SIGSEGV segmentavimo kaltės,
ir tada visa krūva daiktų.
Aš jau priblokšti.
Na, ten tikrai daug reikia išmokti čia.
Taigi, ką mums tai sako?
Ką tai mums sako, yra, ši programa yra apie, bet vis dar nėra, SEG kaltė.
Ir visų pirma, aš ruošiuosi priartinti dar čia
tai yra apie SEG gedimą apie kažkas vadinamas strcmp.
>> Dabar, mes negali būti svarstomas Ši funkcija plačiai.
Bet tai is--, nes mes neketiname kalbėti apie kiekvieną funkciją, kuri
egzistuoja C standarto library-- bet jie visi prieinami jums,
ypač jei vartojate pažvelgti reference.cs50.net.
Ir strcmp yra tikrai galingas funkcija, kuri egzistuoja viduje
iš string.h antraštės failas, kuris yra galva
failas, kuris yra skirtas funkcijas kad darbas su ir manipuliuoti eilutes.
>> Ir visų pirma, ką daro, yra strcmp ji lygina dviejų stygos reikšmes.
Taigi aš apie segmentavimo kaltės ant kvietimą strcmp atrodo.
I hit n, o iš tiesų gaunu pranešimą, Programa baigiama signalo SIGSEGV
segmentavimo kaltės. Taigi dabar Aš iš tikrųjų jau SEG yda,
ir mano programa yra gana daug veiksmingiau atsisakė.
Tai yra programos pabaigoje.
Jis sugedo, tai sudužo.
Taigi nebuvo daug, bet aš iš tikrųjų sužinoti gana didelis
iš šio mažai patirties.
Ką aš sužinojau?
Na, mano programa sugenda gana daug iš karto.
Mano programa sugenda nuo kvietimas strcmp, bet aš
neturiu jokių vietinių kintamųjų Mano programa tuo metu, kai ji sugenda.
Taigi, kas seka, arba įsipareigojimų, galėčiau galbūt būtų palyginti.
Jei aš neturiu bet vietos kintamieji, jums gali
spėti, kad aš ten have-- gal yra pasaulio kintamasis, kuris galėtų būti tiesa.
>> Bet apskritai, atrodo, kaip aš lyginant
į kažką, kad neegzistuoja.
Taigi leiskite išsiaiškinti kad šiek tiek toliau.
Taigi, aš ruošiuosi išvalyti ekraną.
Aš ruošiuosi mesti iš GDB aplinka sekundę.
Ir aš galvoju, Gerai, kad ten nėra vietos kintamieji mano programa.
Įdomu, jei gal aš turėjo praeiti string'e kaip komandinės eilutės argumentas.
Taigi tegul tiesiog išbandyti tai iš.
Aš to dar nepadarėte anksčiau.
>> Leiskite pamatyti, jei gal jei aš paleisti šią programą su komandinės eilutės argumentas ji veikia.
Huh, ne segmentavimo kaltės nėra.
Jis tiesiog pasakė man, kad aš raštuotas jį.
Taigi gal tai pataisymas čia.
Ir iš tiesų, jei aš einu atgal ir pažvelgti į tikrasis šaltinis kodas buggy1.c,
atrodo taip, tarsi ką darau yra Aš skambindami į strcmp be
patikrinti, ar iš tikrųjų argv [1] egzistuoja.
Tai iš tikrųjų šaltinis kodas buggy1.c.
Taigi, ką aš tikrai reikia padaryti čia norėdami nustatyti mano programa,
darant prielaidą, kad aš turėti byla prieš mane, yra
tiesiog pridėti patikrinkite, Įsitikinkite, kad argc yra lygus 2.
Taigi šis pavyzdys, vėl, kaip jau sakiau, yra šiek tiek nenatūralu, tiesa?
Jūs paprastai nesiruošia netyčia ištrinti savo kodą
ir tada jau bandyti ir derinti programą.
Bet tikiuosi, jis davė Jūs iliustracija
iš rūšių dalykų, kad jums gali būti galvoja apie
kaip jūs derinti savo programą.
>> Kokia reikalus čia valstybė?
Kokie kintamieji padaryti I turi prieinama su manimi?
Kur tiksliai yra mano programa kritimo, kokiu linija,
ką kvietimas kokią funkciją?
Kokios įkalčiais ar tai duos man?
Ir tai tiksliai rūšies mąstyseną, kad jus
Reikėtų patekti į kai esate galvoju apie derinti savo programas.
>> Aš Doug Lloyd.
Tai CS50.