>> DOUG LLOYD: Bine GDB.
Ce este mai exact?
Deci GDB, care se afla pentru GNU Debugger,
este un instrument cu adevărat minunat că putem folosi pentru a ne ajuta depana programele noastre,
sau afli de unde lucrurile sunt merge greșit în programele noastre.
GDB este uimitor de puternic, dar de ieșire și interacțiunea cu ea
poate fi un pic criptic.
Este, de obicei, un instrument de linie de comandă, și se poate arunca o mulțime de mesaje de la tine.
Și se poate cam greu să analiza exact ce se întâmplă.
Pași fericire, ne-am luat pentru a rezolva această problemă pentru tine
în timp ce lucrați prin CS50.
Dacă nu utilizați grafică debugger, care colegul meu Dan
Armandarse a vorbit destul de un pic despre într-un video care
ar trebui să fie aici acum, s-ar putea nevoie de
de a utiliza aceste linie de comandă instrumente pentru a lucra cu GDB.
Dacă lucrați în CS50 IDE, nu aveți nevoie pentru a face acest lucru.
Dar dacă nu ești care lucrează în IDE CS50,
probabil folosind o versiune de CS50 Appliance,
sau operarea unei alte Linux Sistem cu GDB instalat pe el,
posibil să aveți nevoie pentru a utiliza aceste instrumente linie de comandă.
>> Si din moment ce s-ar putea trebuie să faci asta, e
util doar pentru a înțelege cum GDB funcționează din linia de comandă.
Dar, din nou, dacă ești folosind IDE CS50, tu
pot folosi debugger grafic care este construit în IDE.
Deci, pentru a obține lucrurile merg cu GDB, pentru a începe depanare
proces de o anumită Programul, tot ce trebuie să faceți
este de tip GDB urmat de numele programului.
Deci, de exemplu, în cazul în care programul este Bună ziua, trebuie să tastați GDB salut.
>> Când faci asta, te duci pentru a trage în sus mediul GDB.
Promptă ta se va schimba, și în loc de a fi ceea ce, de obicei,
este atunci când tastați lucruri la line-- comanda ls,
cd-- toate tipic dvs. Comenzi Linux, prompta ta
se va schimba în, probabil, ceva ca paranteze GDB paranteze.
Asta e noua ta promptă GDB, deoarece tu ești în interiorul mediului GDB.
Odata ajunsi acestui mediu, există două comenzi mari
pe care le veți folosi, probabil, în următoarea ordine.
>> Primul este b, care este prescurtarea de la pauză.
Și după ce tastați b, tu de obicei, tastați numele unei funcții,
sau dacă se întâmplă să știi în jurul valorii de ce numărul liniei
programul începe să se comporte un pic ciudat,
aveți posibilitatea să tastați o linie Numărul acolo, de asemenea.
Ce b, sau pauza, nu este permite programul
pentru a rula până la un anumit punct, și anume, numele funcției
pe care le specificați sau linia Numărul pe care îl specificați.
>> Și în acel moment el, va îngheța execuție.
Acesta este un lucru foarte bun, pentru că odată executare a fost congelat,
puteți începe să foarte lent pas prin programul tău.
De obicei, în cazul în care ați fost difuzate programele, acestea sunt destul de scurt.
De obicei, tastați slash punct indiferent numele programului dumneavoastră este, lovit Enter,
și înainte de a putea clipi, dvs. Programul este deja terminat.
Nu este într-adevăr o mulțime de timp pentru a încerca și dau seama ce se întâmplă greșit.
Deci, într-adevăr să fie în măsură să încetinească lucruri în funcție de stabilirea unui punct de pauză cu b,
și apoi pas cu pas în.
>> Apoi, după ce ați setat pauză punct, puteți rula programul.
Și dacă aveți orice argumente în linia de comandă,
le specificați aici, nu atunci când tastați numele GDB program.
Specificați toate linia de comandă argumente prin luarea R, sau a alerga,
și apoi argumente în linia de comandă, indiferent de aveți nevoie în interiorul programului.
Există o serie de alte adevărat comenzi importante și utile
în interiorul mediului PIB.
Deci, lasă-mă să rapid du-te peste unele dintre ele.
>> Primul este N, care este prescurtarea de la următoarea, și aveți posibilitatea să tastați următoarea loc de n,
ambele ar funcționa.
Și e doar scurtătura.
Și, după cum probabil ați ajuns deja folosit pentru a, fiind capabil de tip lucruri
mai scurt este, în general, mai bine.
Și ce va face este să un pas înainte un bloc de cod.
Deci, va merge mai departe până la un apel de funcție.
Și apoi în loc de scufundări în această funcție
și trece prin toate astea funcții cod, acesta va avea doar functia.
>> Funcția va fi numit.
Se va face tot ce activitatea sa este.
Acesta va reveni la o valoare funcția pe care a numit-o.
Și apoi veți trece la următoarea linie de această funcție de asteptare.
Dacă doriți să-și intensifice în interiorul a funcției,
în loc de a avea doar executa, mai ales
dacă credeți că problema s-ar putea minți în interiorul acestei funcții,
ai putea, desigur, stabilit o pauză punct în interiorul acestei funcții.
Sau dacă sunteți deja în execuție, puteți utilizați de a pas înainte cu o linie de cod.
>> Deci, acest lucru va pas în și se arunca cu capul în funcții,
în loc de a avea doar executa și continuând pe în funcția de
ca esti in pentru depanare.
Dacă doriți vreodată să știți valoarea unei variabile,
aveți posibilitatea să tastați p, sau Print, și apoi numele variabilei.
Și care va imprima la tine, în interiorul mediului GDB,
numele variabilei, care Tu-- scuzați mine-- valoarea variabilei
care le-ați numit.
Dacă doriți să știți valorile fiecare locală variabilă accesibil de unde
te în prezent se află în dumneavoastră Programul, aveți posibilitatea să tastați informații localnici.
E mult mai repede decât tastarea p și apoi orice,
Listing toate din variabile ca stii există.
Aveți posibilitatea să tastați informații localnici, și va imprima totul pentru tine.
Următorul este bt, care este scurt pentru spate Trace.
Acum, în general, în special la începutul CS50,
nu veți avea într-adevăr ocazia de a utiliza bt, sau Back Trace,
pentru că nu te cu funcții care numesc alte funcții.
>> S-ar putea avea un apel principal funcție, dar asta e, probabil,.
Nu aveți că alte funcții apelarea altă funcție, care
solicită o altă funcție, și așa mai departe.
Dar, așa cum programele obține mai multe complex, și în special
atunci când începe lucrul cu recursivitate, urme înapoi
poate fi un mod foarte util să te las un fel de a lua niște context în care
Sunt în programul meu.
Deci spun ai scris codul, și știți că principala numește funcție
f, prin care se solicită o funcție g, prin care se solicită o funcție h.
Deci, avem mai multe straturi de cuiburi se întâmplă aici.
>> Dacă sunteți în interiorul mediul de GDB,
și știi în interiorul tău de h, dar uitați
despre ceea ce ai de unde ai are-- aveți posibilitatea să tastați bt, sau urme înapoi,
și se va tipări h, g, f principal, alături de unele alte informații, care
vă oferă un indiciu că, principala OK numit f, f numit g, g numit h,
și asta e în cazul în care am Sunt în prezent în programul meu.
Astfel că poate fi foarte util, mai ales ca criptic-Ness a GDB
devine un pic coplesitoare, la afla exact unde lucrurile sunt.
În cele din urmă, atunci când programul se face, sau atunci când ați făcut-o de depanare
si doriti sa pas departe din mediul GDB,
ajută să știe cum să iasă din ea.
Aveți posibilitatea să tastați q, sau Quit, să iasă.
Acum, înainte de film de azi Am pregătit un program de buggy
numit buggy1, pe care am compilat dintr-un fișier cunoscut sub numele de buggy1.c.
După cum s-ar putea aștepta, acest Programul este, de fapt buggy.
Ceva nu merge bine când am încerca și a alerga it.
Acum, din păcate, am neatenție eliminat dosarul meu buggy1.c,
astfel încât, în scopul de a-mi dau seama ce se întâmplă în neregulă cu acest program,
Am de gând să aibă de a utiliza GDB fel de orbește, încercând
pentru a naviga prin acest program pentru a dau seama exact ce se întâmplă greșit.
Dar folosind doar instrumentele am învățat deja despre,
putem destul de mult figura exact ceea ce este.
Deci, haideți să peste cap de la CS50 IDE și au o privire.
OK, asa ca suntem aici, în meu CS50 IDE mediu,
și voi mări un pic astfel încât să puteți vedea un pic mai mult.
În fereastra mea terminale, dacă aș enumera conținutul directorului meu actual
cu ls, vom vedea că am o pereche de fișiere sursă
aici, inclusiv discutat anterior buggy1.
Ce anume se întâmplă atunci când Încerc și a alerga buggy1.
Ei bine, hai să aflăm.
Am tip slash dot, buggy, și l-am lovit Enter.
>> Defecte de segmentare.
Asta nu este bine.
Dacă vă amintiți, un eroare de segmentare de obicei
apare atunci când accesăm memorie că nu avem voie să atingă.
Am ajuns într-un fel ne- în afara limitelor
din ceea ce a programului, compilator, ne-a dat.
Și astfel deja că este un indiciu pentru a păstra în caseta de instrumente
cum vom începe procesul de depanare.
Ceva a mers un pic greșit aici.
>> Bine, așa că să începem mediului de GDB
și a vedea dacă ne putem da seama exact ceea ce este problema.
Am de gând să îndepărteze ecranul meu, și am de gând să tastați GDB
din nou, pentru a intra în mediul GDB, și numele programului
pe care vreau pentru a depana, buggy1.
Vom obține un mesaj scurt, citind simboluri din buggy1, făcut.
Tot ceea ce înseamnă este tras împreună toate din cod,
iar acum a fost încărcate în GDB, și este gata să meargă.
>> Acum, ce vreau să fac?
Îți amintești Ce Primul pas este de obicei
după ce sunt in interiorul acestui mediu?
Sperăm că, ai spus setați un punct de pauză, pentru că
De fapt, asta este ceea ce vreau să fac.
Acum, eu nu am codul sursă pentru acest
în fața mea, care este, probabil, nu este cazul utilizării tipic, apropo.
Probabil, va.
Așa că e bine.
Dar presupunând că nu, ceea ce este funcția unul care știi
există în fiecare program unic C?
Nu contează cât de mare sau cât de complicat este, această funcție cu siguranta exista.
Principal, nu?
>> Deci, lipsa de toate, ne putem stabilit un punct de pauză la principal.
Și din nou, aș putea chiar tip rupe principal, în loc de b.
Și dacă ești curios, dacă vreodată tip o comandă lung
și apoi dau seama că te tastat ceva gresit,
si doriti sa scapi de toate ca am facut-o,
puteți prelua controlul U, care va șterge totul și să vă aducă înapoi
la începutul liniilor cursor.
Mult mai repede decât țineți doar în jos pe șterge, sau lovind-l ori buchet
peste.
>> Deci vom stabili un punct de pauză la principal.
Și, după cum puteți vedea, se spune ne-am stabilit un punct de pauză la dosar buggy1.c,
și se pare că prima linie de Codul de principal este linia de șapte.
Din nou, nu avem fișierul sursă aici,
dar voi presupune că este mi-a spus adevărul.
Și apoi, eu doar încerc și executați programul, r.
Programul de pornire.
Bine, deci acest mesaj este un pic criptic.
Dar în esență ceea ce este se întâmplă aici este doar
spunându-mi-am lovit pauză am mea punct, pauza numărul punctul 1.
>> Și apoi, ca linie de cod, Nu există un astfel de fișier sau director.
Singurul motiv pentru care Văd că mesajul
este pentru că am accidental eliminat dosarul meu buggy.c.
Dacă fișierul meu buggy1.c existat în directorul curent,
acest drept linie acolo ar fapt spune-mi ce linia de cod
literalmente citește.
Din păcate, l-am șters.
Vom avea la fel de navigare prin această un pic mai mult orbește.
>> OK, deci să vedem, ce Nu vreau să fac aici?
Ei bine, aș vrea să știu ce locale variabile poate sunt disponibile pentru mine.
Am început programul meu.
Să vedem care ar putea fi deja inițializat pentru noi.
Am tip localnici Info, nu localnici.
Bine, pentru ca nu da-mi o tona de informații.
Am putea încerca și imprima o variabilă, dar nu știu nici un nume de variabile.
Am putea încerca o urmă înapoi, dar eu sunt în interiorul principal,
așa că știu că nu am făcut o altă funcție de apel chiar acum.
>> Deci, se pare ca doar mele opțiuni sunt de a utiliza n sau așa și începe să se scufunde în.
Am de gând să utilizeze n.
Așa că am de tip n.
Oh Doamne, ce se întâmplă aici.
Programul a primit semnale, SIGSEGV eroare de segmentare,
și apoi o grămadă de lucruri.
Sunt deja copleșit.
Ei bine, există de fapt o multe de învățat aici.
Deci, ce ne spune aceasta?
Ceea ce ne spune este, acest program este pe cale de a, dar nu a fost încă, vina SEG.
Și în special, am de gând pentru a mări și mai mult aici,
este pe cale de a Seg vina despre ceva numit strcmp.
>> Acum, noi nu am discutat această funcție pe larg.
Dar este-- că nu mergem pentru a vorbi despre fiecare funcție care
există în standardul C library-- dar toate acestea sunt disponibile pentru tine,
mai ales dacă luați o uita-te la reference.cs50.net.
Si strcmp este un foarte puternic funcție care există în interiorul
din antetul string.h fișier, care este un antet
fișier care este dedicat funcțiilor care lucrează cu și manipula siruri de caractere.
>> Și în special, ceea ce face este strcmp compară valorile două șiruri.
Așa că sunt pe cale de a segmentare vina pe un apel la strcmp se pare.
Am lovit n, și, de fapt, am primit mesajul, Programul terminat cu semnal SIGSEGV
eroare de segmentare. Asa ca acum Eu de fapt am acuzat SEG,
și programul meu are destul de mult dat în mod eficient.
Acesta este sfârșitul programului.
A rupt în jos, sa prăbușit.
Deci, nu a fost mult, dar eu de fapt, a făcut să învețe destul de un pic
din această puțină experiență.
Ce am învățat?
Ei bine, programul meu se blochează destul de mult imediat.
Programul meu se blochează pe Un apel la strcmp, dar am
Nu are nici un variabile locale în mea Programul în momentul în care se avariază.
Deci, ceea ce string sau siruri de caractere, aș putea fi, eventual, compararea.
Dacă nu am nici o locală variabile, s-ar putea
presupun că există have-- poate este o variabilă globală, care ar putea fi adevărat.
>> Dar, în general, se pare ca și cum aș compara
la ceva ce nu există.
Deci, haideți să investigheze că un pic mai departe.
Deci, am de gând să îndepărteze ecranul meu.
Am de gând să renunț afară din Mediu GDB pentru un al doilea.
Și mă gândesc, OK, deci nu e nu variabile locale în programul meu.
Mă întreb dacă nu cumva eu ​​ar trebui să treacă într-un șir ca un argument în linia de comandă.
Deci, hai să testa acest lucru.
Eu nu am făcut acest lucru înainte.
>> Să vedem dacă poate dacă am rula acest program cu un argument linie de comandă funcționează.
Nu-i asa, nici o vină segmentare acolo.
Pur și simplu mi-a spus că l-am dat seama.
Poate că e fix aici.
Și într-adevăr, dacă mă duc înapoi și uita-te la codul actual sursă pentru buggy1.c,
se pare ca și cum ceea ce fac este Fac un apel la strcmp fără
a verifica dacă, de fapt, argv [1] există.
Aceasta este de fapt codul sursă pentru buggy1.c.
Deci, ceea ce într-adevăr am nevoie pentru a face aici pentru a repara programul meu,
presupunând Am fișier în fața mea, este
pentru a adăuga doar un cec pentru a face sigur că argc este egal cu 2.
Deci acest exemplu, din nou, cum am spus, este un pic contrived, nu?
Te general, nu de gând să ștergeți accidental codul sursă
și apoi trebuie să încercați și depanare a programului.
Dar sperăm, le-a dat ai o ilustrație
de tipuri de lucruri pe care ai putea să te gândești
ca esti depanarea programului.
>> Care este starea de lucruri aici?
Ce variabile fac eu trebuie accesibile pentru mine?
În cazul în care este exact programul meu crashing, pe ce linie,
asupra a ceea ce apel la ce funcție?
Ce fel de indicii nu care dau mine?
Și asta este exact un fel de stare de spirit pe care le
ar trebui să fie obținerea în când ești gândindu-debugging programele dumneavoastră.
>> Sunt Doug Lloyd.
Acest lucru este CS50.