[Powered by Google Translate] GDB, Proiectul GNU Debugger, este un instrument puternic pentru depanare C,
împreună cu multe alte limbi.
Acesta vă permite de a scormoni în jurul valorii de interiorul programelor C în timp ce acestea sunt de executare,
și, de asemenea, vă oferă posibilitatea de a vedea exact ce se întâmplă
atunci când se blochează de program.
E destul de puturos, nu?
GDB este software liber, și-l ruleaza pe mai multe populare UNIX și
Bazate pe Windows sisteme de operare, asa ca este un instrument foarte răspândită.
>> Tu ar trebui să învețe să-l iubească.
Pro GDB au un timp mult mai usor de urmărire în jos bug-uri
decât cei care au descurce prin utilizarea presupuneri
și sumele infinite ale declarațiilor de printare.
GDB este un instrument de linie de comandă, ceea ce înseamnă că aveți posibilitatea să interacționați cu el într-un terminal
emiterea comenzilor prin intermediul tastaturii în loc de butoane click cu mouse-ul.
>> Pentru a porni GDB, vă literalmente doar gdb tipul de la prompt și introduceți lovit.
Veți vedea unele linii imprimate pe ecran
arătându-vă versiunea de GDB pe care îl execută,
informațiilor sale drepturile de autor, iar la sfârșitul veți vedea promptul GDB: (gdb).
Acest lucru vă permite să știți că GDB este gata pentru comenzi.
În acest moment, cel mai important lucru să știți cum să faceți este să renunțe.
Din fericire, acest lucru este destul de simplu.
Comanda renuntat face exact acest lucru.
Ca o scurtătură, puteți folosi doar q prea.
La fel de distractiv ca cizme sus GDB și apoi cu promptitudine renunti este,
hai sa vorbim acum despre utilizarea GDB pentru a ajuta la depanarea unui program.
>> Pentru a începe, am un program de aici, în factorial.c
care devine un int și încearcă pentru a calcula factorială sa.
În cazul în care nu ați văzut înainte de a factorialele sau nu le amintesc,
Factorială a numărului n este egal cu produsul dintre n - (n - 1), (n - 2), și așa mai departe -
până te-a lovit 1.
De aceea, factorial de 3 este de 3 * 2 * 1, sau 6,
și factorial al 4 este 4 * 3 * 2 * 1, sau 24.
Factorial de zero, este un caz ciudat, e 1,
și factorialele de numere întregi negative nu sunt definite.
Oricum, ceva despre programul meu factorial este funky.
Când l-am alerga, se imprimă numere ciudate, care nu au nimic de-a face cu factorialele.
>> Deci, putem folosi pentru a ajuta la GDB dau seama ce se întâmplă.
GDB operează pe fișiere executabile,
care sunt fișierele binare produse de procesul de compilare.
Asta este, nu ne putem rula pe GDB nostru. C sau H fișierele cod sursă, cum ar fi factorial.c..
Vrem să-l ruleze doar pe locul factoriale.
Dacă programul este necesar nici un argument de linie de comandă,
acest lucru este în cazul în care am să le specificați.
În acest caz, factorială nu are nevoie de nici un argument de linie de comandă,
asa ca am doar de tip run sau r pentru scurt.
>> Aceasta va porni programul de funcționare factorială.
Atunci când programul se oprește de rulare, voi primi GDB-mi cere înapoi.
Bine, hai să încercăm același lucru din nou, de 4 factorial.
În regulă, vom vedea că suntem obtinerea același tip de junk aici, în GDB.
Acum, că programul sa terminat,
nu putem merge în site și a accesa de starea sa,
așa că va trebui să porniți-l înainte de a curge din nou, putem vedea ce se întâmplă.
Cu toate acestea, avem nevoie de o modalitate de a opri în timp ce este în mijlocul alerga sale.
>> Pentru a face acest lucru, vom folosi ceea ce se numește un punct de întrerupere.
Valorile critice spun GDB pentru a întrerupe programul de la o anumită funcție sau linie de cod sursă
astfel încât să putem examina starea programului,
valorile variabilelor, starea de memorie și astfel, în acel moment.
Din moment ce nu prea știu unde lucrurile merg rău,
>> Vreau doar să înceapă chiar de la depanarea început,
dreapta atunci când începe principal.
Vom stabili un punct de control la începutul principal folosind comanda pauză.
Putem folosi, de asemenea, pe b pentru a abrevierea pauză.
Acum, haideți să începem programul de funcționare din nou.
Aici suntem la începutul principal, la fel ca GDB ne spune.
Linia de cod care e pe cale de a executa, dar nu a fost încă
este linia printf.
Putem spune GDB pentru a executa această linie de cod și du-te la linia următoare
cu următoarea comandă sau n.
>> În regulă, acum GDB ne spune că suntem pe linia GetInt.
Știu că se pare ca linia printf nu a alerga
deoarece nu vedem "Introduceți un număr întreg pozitiv" de imprimare pe ecran,
dar a alerga, de fapt.
Ceea ce vedem este sistemul de operare suprima nimic scris pentru ecran
până când absolut trebuie să, care de ce depanare cu imprimatele
poate părea, uneori, nesigure.
Oricum, hai să mergem din nou la următoarea linie de cod și introduceți într-un int.
Din nou, hai să tip 4.
Deci, acest lucru pare ciudat. Suntem pe linia 12 în conformitate cu GDB,
dar linia următoare, care e pe cale de a executa este doar o proteză cret.
>> Asta înseamnă că suntem la sfârșitul unei bucle, ne face în timp ce bucla de fapt,
GDB și ne spune că starea încetarea, și anume nu mai mică decât zero,
va executa următoarea.
Dacă această vreodată devine un pic confuz,
putem trage în sus codul sursă în GDB cu listă sau comanda l..
Aceasta imprimă codul sursă
care este centrat în jurul valorii de linia pe care suntem în prezent.
Dacă ne scrieți lista sau L din nou, vom vedea următorul set de linii imprima.
Putem face acest lucru până când ne-am lovit la sfârșitul fișierului.
>> Pentru a ajunge inapoi de unde am fost, putem furniza lista cu un număr de linie,
în acest caz, linia 12.
Oricum, hai să mergem mai departe.
Acum suntem pe bucla 4.
Să ne asigurăm că variabila noastră cu num conține 4.
Noi facem acest lucru cu imprimare, sau P, comanda.
Deci, GDB ne spune că, într-adevăr cu num este stocarea 4, așa cum ne-am așteptat.
1 dolar pe care GDB tipărește este o variabilă specială GDB
care este acum setat pentru a stoca numărul 4, precum și.
Puteți ignora acest lucru pentru acum, dar aceste variabile GDB vin în super-îndemână
în cazurile mai avansate, atunci când doriți să reamintesc ceea ce ați făcut în trecut.
Oricum, se deplasează pe cu viitor, vom vedea că vom începe să se deplasează prin bucla for.
Să continuăm pe aici cu n biți de biți.
, Mai degrabă decât tastarea n fiecare dată, puteți, de asemenea, doar să apăsați enter.
Când te-a lovit intra fără tastarea nimic, GDB repetă doar comenzii anterioare.
Deci, acum ne-am lovit apel printf.
Se pare ca am trecut într-adevăr prin intermediul nostru pentru bucla de 4 ori,
care este ceea ce vrem să facem, în scopul de a multiplica cu 1, 2, 3, și 4.
>> Totul pare ca este de lucru,
cu excepția cazului când ne-am lovit din nou lângă noi obține acest număr imens in loc de 24.
Dacă vom tipări valoarea lui p factorial folosind,
vom vedea că factorială are acest număr masiv în ea.
Ceva se întâmplă cu siguranta gresit.
În acest moment, însă, suntem aproape la sfârșitul programului,
și e prea târziu pentru a repara nimic.
>> Cu toate acestea, putem reporni programul prin tastarea r din nou și atunci y pentru a confirma.
Acum ne-am întors la punct de întrerupere nostru de la începutul anului principal.
Stim ca totul pare a fi bine cu citirea în nr.
astfel încât să putem sări mai departe cu nr.
Alternativ, se poate seta un punct de întrerupere nou după ce face în timp ce bucla
și să sară acolo. Să facem asta.
Se pare ca linia 14 vine doar după bucla.
Să stabilim un punct de întrerupere acolo.
E bună practică pentru a specifica numele fișierului în această comandă breakpoint
deoarece GDB poate fi confuz, dacă lucrați cu mai multe fișiere.
Pentru a muta înainte de acest punct de întrerupere, vom utiliza continua sau comanda c..
>> Bine, aici suntem la bucla for.
Să mergem mai mult în linia 1 pentru bucla,
și apoi vom începe variabile de imprimare pentru a vedea ce se întâmplă.
Să ne asigurăm că i este într-adevăr 1, cum era de asteptat.
Da, asta e bine.
Ce zici de factorial, deși?
Uau, asta nu e bine.
Avem un număr mare negativ aici.
Cum sa întâmplat asta?
Ei bine, dacă ne uităm înapoi la codul,
vedem că niciodată nu l-am initializat, deci ne-am luat doar un gunoi acolo.
Care cu siguranta va arunca de pe calculul nostru.
>> Din fericire, noi nu trebuie să părăsească GDB pentru a rezolva această.
Ne putem inițializa chiar aici și fixați-l în codul de mai târziu folosind comanda de imprimare.
Ne vom inițializa cu 1, deoarece factorialele de la zero și 1 sunt ambele 1,
si daca l-am inițializa cu zero, atunci vom termina întotdeauna cu zero, ca urmare nostru.
Puteți seta orice variabilă în acest fel, care este super la îndemână.
Acum, sa continuam programul nostru.
Să ne asigurăm că totul e în cazul în care aceasta ar trebui sa fie.
Num ar trebui să fie 4, i ar trebui să fie de 1, și factorială trebuie să fie 1 prea.
Noi putem comenzi rapide acest proces și imprima toate variabilele locale
cu super-utile localnici comanda info,
care imprimă toate noastre în domeniul de aplicare-variabile locale.
Oricum, se pare ca totul e bine să plec.
>> Să face o altă ratare a buclei pentru a fi siguri.
Bine, totul pare minunat.
Acum putem folosi comanda continua să meargă până la capăt.
Dulce! 4 factorială imprimat 24 cum era de asteptat.
Acum putem merge rezolva această problemă în codul nostru.
Mai degrabă decât demisia din PIB, vom folosi un alt tab terminal pentru a face acest lucru.
Revenind la fila GDB nostru, acum trebuie să recompilați executabil nostru.
Una dintre cele mai bune lucruri despre GDB este că nu aveți nevoie să plece GDB pentru a rula face.
Așa că nu ne ține lovind pragurile de vechi,
să le dezactivați cu, ați ghicit, dezactivați comanda.
Acest lucru va dezactiva toate punctele de întrerupere noastre.
Acum, putem reporni programul, cu r și asigurați-vă că totul e în regulă.
Se pare ca totul e bine să plec.
Factorial de 4 printuri din 24, la fel ca ne-am gandit.
GDB este unul dintre instrumentele cele mai utile pe care le-ați primit în caseta de instrumente.
>> Există lucruri o tona mai mult vă puteți face cu GDB,
mult mai mult decât vă puteți face cu documentele imprimate simple.
Data viitoare programul nu este de a face ceea ce dorești,
încercați să rulați GDB să ne dăm seama ce se întâmplă înăuntru.
Cu un pic de practică, veți fi în măsură să detaliați dreapta pe bug-ul dvs. în cel mai scurt timp.
Numele meu este Nate Hardison. Acest lucru este CS50.