1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, Proiectul GNU Debugger, este un instrument puternic pentru depanare C, 2 00:00:12,630 --> 00:00:14,300 împreună cu multe alte limbi. 3 00:00:14,300 --> 00:00:17,440 Acesta vă permite de a scormoni în jurul valorii de interiorul programelor C în timp ce acestea sunt de executare, 4 00:00:17,440 --> 00:00:20,880 și, de asemenea, vă oferă posibilitatea de a vedea exact ce se întâmplă 5 00:00:20,880 --> 00:00:22,490 atunci când se blochează de program. 6 00:00:22,490 --> 00:00:24,690 E destul de puturos, nu? 7 00:00:24,690 --> 00:00:27,980 GDB este software liber, și-l ruleaza pe mai multe populare UNIX și 8 00:00:27,980 --> 00:00:31,840 Bazate pe Windows sisteme de operare, asa ca este un instrument foarte răspândită. 9 00:00:31,840 --> 00:00:33,560 >> Tu ar trebui să învețe să-l iubească. 10 00:00:33,560 --> 00:00:36,800 Pro GDB au un timp mult mai usor de urmărire în jos bug-uri 11 00:00:36,800 --> 00:00:39,150 decât cei care au descurce prin utilizarea presupuneri 12 00:00:39,150 --> 00:00:41,420 și sumele infinite ale declarațiilor de printare. 13 00:00:41,420 --> 00:00:45,810 GDB este un instrument de linie de comandă, ceea ce înseamnă că aveți posibilitatea să interacționați cu el într-un terminal 14 00:00:45,810 --> 00:00:49,720 emiterea comenzilor prin intermediul tastaturii în loc de butoane click cu mouse-ul. 15 00:00:49,720 --> 00:00:54,960 >> Pentru a porni GDB, vă literalmente doar gdb tipul de la prompt și introduceți lovit. 16 00:00:54,960 --> 00:00:58,230 Veți vedea unele linii imprimate pe ecran 17 00:00:58,230 --> 00:01:00,810 arătându-vă versiunea de GDB pe care îl execută, 18 00:01:00,810 --> 00:01:07,890 informațiilor sale drepturile de autor, iar la sfârșitul veți vedea promptul GDB: (gdb). 19 00:01:07,890 --> 00:01:10,770 Acest lucru vă permite să știți că GDB este gata pentru comenzi. 20 00:01:10,770 --> 00:01:15,400 În acest moment, cel mai important lucru să știți cum să faceți este să renunțe. 21 00:01:15,400 --> 00:01:17,790 Din fericire, acest lucru este destul de simplu. 22 00:01:17,790 --> 00:01:19,840 Comanda renuntat face exact acest lucru. 23 00:01:19,840 --> 00:01:23,090 Ca o scurtătură, puteți folosi doar q prea. 24 00:01:23,090 --> 00:01:27,410 La fel de distractiv ca cizme sus GDB și apoi cu promptitudine renunti este, 25 00:01:27,410 --> 00:01:30,800 hai sa vorbim acum despre utilizarea GDB pentru a ajuta la depanarea unui program. 26 00:01:30,800 --> 00:01:34,630 >> Pentru a începe, am un program de aici, în factorial.c 27 00:01:34,630 --> 00:01:37,380 care devine un int și încearcă pentru a calcula factorială sa. 28 00:01:37,380 --> 00:01:41,270 În cazul în care nu ați văzut înainte de a factorialele sau nu le amintesc, 29 00:01:41,270 --> 00:01:47,840 Factorială a numărului n este egal cu produsul dintre n - (n - 1), (n - 2), și așa mai departe - 30 00:01:47,840 --> 00:01:49,230 până te-a lovit 1. 31 00:01:49,230 --> 00:01:54,550 De aceea, factorial de 3 este de 3 * 2 * 1, sau 6, 32 00:01:54,550 --> 00:02:00,180 și factorial al 4 este 4 * 3 * 2 * 1, sau 24. 33 00:02:00,180 --> 00:02:03,970 Factorial de zero, este un caz ciudat, e 1, 34 00:02:03,970 --> 00:02:06,970 și factorialele de numere întregi negative nu sunt definite. 35 00:02:06,970 --> 00:02:10,280 Oricum, ceva despre programul meu factorial este funky. 36 00:02:10,280 --> 00:02:15,410 Când l-am alerga, se imprimă numere ciudate, care nu au nimic de-a face cu factorialele. 37 00:02:15,410 --> 00:02:19,030 >> Deci, putem folosi pentru a ajuta la GDB dau seama ce se întâmplă. 38 00:02:19,030 --> 00:02:21,720 GDB operează pe fișiere executabile, 39 00:02:21,720 --> 00:02:24,910 care sunt fișierele binare produse de procesul de compilare. 40 00:02:24,910 --> 00:02:30,940 Asta este, nu ne putem rula pe GDB nostru. C sau H fișierele cod sursă, cum ar fi factorial.c.. 41 00:02:30,940 --> 00:02:34,650 Vrem să-l ruleze doar pe locul factoriale. 42 00:02:34,650 --> 00:02:38,340 Dacă programul este necesar nici un argument de linie de comandă, 43 00:02:38,340 --> 00:02:40,230 acest lucru este în cazul în care am să le specificați. 44 00:02:40,230 --> 00:02:44,050 În acest caz, factorială nu are nevoie de nici un argument de linie de comandă, 45 00:02:44,050 --> 00:02:46,410 asa ca am doar de tip run sau r pentru scurt. 46 00:02:46,410 --> 00:02:50,440 >> Aceasta va porni programul de funcționare factorială. 47 00:02:50,440 --> 00:02:53,940 Atunci când programul se oprește de rulare, voi primi GDB-mi cere înapoi. 48 00:02:53,940 --> 00:02:58,130 Bine, hai să încercăm același lucru din nou, de 4 factorial. 49 00:02:58,130 --> 00:03:02,910 În regulă, vom vedea că suntem obtinerea același tip de junk aici, în GDB. 50 00:03:02,910 --> 00:03:04,850 Acum, că programul sa terminat, 51 00:03:04,850 --> 00:03:06,870 nu putem merge în site și a accesa de starea sa, 52 00:03:06,870 --> 00:03:09,870 așa că va trebui să porniți-l înainte de a curge din nou, putem vedea ce se întâmplă. 53 00:03:09,870 --> 00:03:13,570 Cu toate acestea, avem nevoie de o modalitate de a opri în timp ce este în mijlocul alerga sale. 54 00:03:13,570 --> 00:03:16,970 >> Pentru a face acest lucru, vom folosi ceea ce se numește un punct de întrerupere. 55 00:03:16,970 --> 00:03:21,880 Valorile critice spun GDB pentru a întrerupe programul de la o anumită funcție sau linie de cod sursă 56 00:03:21,880 --> 00:03:24,070 astfel încât să putem examina starea programului, 57 00:03:24,070 --> 00:03:27,380 valorile variabilelor, starea de memorie și astfel, în acel moment. 58 00:03:27,380 --> 00:03:30,750 Din moment ce nu prea știu unde lucrurile merg rău, 59 00:03:30,750 --> 00:03:33,510 >> Vreau doar să înceapă chiar de la depanarea început, 60 00:03:33,510 --> 00:03:36,510 dreapta atunci când începe principal. 61 00:03:36,510 --> 00:03:39,260 Vom stabili un punct de control la începutul principal folosind comanda pauză. 62 00:03:39,260 --> 00:03:42,640 Putem folosi, de asemenea, pe b pentru a abrevierea pauză. 63 00:03:42,640 --> 00:03:45,000 Acum, haideți să începem programul de funcționare din nou. 64 00:03:45,000 --> 00:03:48,140 Aici suntem la începutul principal, la fel ca GDB ne spune. 65 00:03:48,140 --> 00:03:51,970 Linia de cod care e pe cale de a executa, dar nu a fost încă 66 00:03:51,970 --> 00:03:53,480 este linia printf. 67 00:03:53,480 --> 00:03:57,200 Putem spune GDB pentru a executa această linie de cod și du-te la linia următoare 68 00:03:57,200 --> 00:03:59,840 cu următoarea comandă sau n. 69 00:03:59,840 --> 00:04:04,120 >> În regulă, acum GDB ne spune că suntem pe linia GetInt. 70 00:04:04,120 --> 00:04:06,630 Știu că se pare ca linia printf nu a alerga 71 00:04:06,630 --> 00:04:10,070 deoarece nu vedem "Introduceți un număr întreg pozitiv" de imprimare pe ecran, 72 00:04:10,070 --> 00:04:12,040 dar a alerga, de fapt. 73 00:04:12,040 --> 00:04:16,029 Ceea ce vedem este sistemul de operare suprima nimic scris pentru ecran 74 00:04:16,029 --> 00:04:19,649 până când absolut trebuie să, care de ce depanare cu imprimatele 75 00:04:19,649 --> 00:04:21,730 poate părea, uneori, nesigure. 76 00:04:21,730 --> 00:04:26,240 Oricum, hai să mergem din nou la următoarea linie de cod și introduceți într-un int. 77 00:04:26,240 --> 00:04:30,070 Din nou, hai să tip 4. 78 00:04:30,070 --> 00:04:34,540 Deci, acest lucru pare ciudat. Suntem pe linia 12 în conformitate cu GDB, 79 00:04:34,540 --> 00:04:37,660 dar linia următoare, care e pe cale de a executa este doar o proteză cret. 80 00:04:37,660 --> 00:04:42,110 >> Asta înseamnă că suntem la sfârșitul unei bucle, ne face în timp ce bucla de fapt, 81 00:04:42,110 --> 00:04:46,710 GDB și ne spune că starea încetarea, și anume nu mai mică decât zero, 82 00:04:46,710 --> 00:04:48,010 va executa următoarea. 83 00:04:48,010 --> 00:04:50,230 Dacă această vreodată devine un pic confuz, 84 00:04:50,230 --> 00:04:54,860 putem trage în sus codul sursă în GDB cu listă sau comanda l.. 85 00:04:54,860 --> 00:04:56,880 Aceasta imprimă codul sursă 86 00:04:56,880 --> 00:04:59,010 care este centrat în jurul valorii de linia pe care suntem în prezent. 87 00:04:59,010 --> 00:05:03,590 Dacă ne scrieți lista sau L din nou, vom vedea următorul set de linii imprima. 88 00:05:03,590 --> 00:05:06,070 Putem face acest lucru până când ne-am lovit la sfârșitul fișierului. 89 00:05:06,070 --> 00:05:11,210 >> Pentru a ajunge inapoi de unde am fost, putem furniza lista cu un număr de linie, 90 00:05:11,210 --> 00:05:14,120 în acest caz, linia 12. 91 00:05:14,120 --> 00:05:16,040 Oricum, hai să mergem mai departe. 92 00:05:16,040 --> 00:05:18,240 Acum suntem pe bucla 4. 93 00:05:18,240 --> 00:05:21,490 Să ne asigurăm că variabila noastră cu num conține 4. 94 00:05:21,490 --> 00:05:26,170 Noi facem acest lucru cu imprimare, sau P, comanda. 95 00:05:26,170 --> 00:05:31,140 Deci, GDB ne spune că, într-adevăr cu num este stocarea 4, așa cum ne-am așteptat. 96 00:05:31,140 --> 00:05:35,180 1 dolar pe care GDB tipărește este o variabilă specială GDB 97 00:05:35,180 --> 00:05:37,720 care este acum setat pentru a stoca numărul 4, precum și. 98 00:05:37,720 --> 00:05:42,240 Puteți ignora acest lucru pentru acum, dar aceste variabile GDB vin în super-îndemână 99 00:05:42,240 --> 00:05:46,380 în cazurile mai avansate, atunci când doriți să reamintesc ceea ce ați făcut în trecut. 100 00:05:46,380 --> 00:05:50,970 Oricum, se deplasează pe cu viitor, vom vedea că vom începe să se deplasează prin bucla for. 101 00:05:50,970 --> 00:05:54,790 Să continuăm pe aici cu n biți de biți. 102 00:05:54,790 --> 00:05:58,280 , Mai degrabă decât tastarea n fiecare dată, puteți, de asemenea, doar să apăsați enter. 103 00:05:58,280 --> 00:06:03,710 Când te-a lovit intra fără tastarea nimic, GDB repetă doar comenzii anterioare. 104 00:06:03,710 --> 00:06:05,910 Deci, acum ne-am lovit apel printf. 105 00:06:05,910 --> 00:06:09,520 Se pare ca am trecut într-adevăr prin intermediul nostru pentru bucla de 4 ori, 106 00:06:09,520 --> 00:06:13,750 care este ceea ce vrem să facem, în scopul de a multiplica cu 1, 2, 3, și 4. 107 00:06:13,750 --> 00:06:15,870 >> Totul pare ca este de lucru, 108 00:06:15,870 --> 00:06:19,680 cu excepția cazului când ne-am lovit din nou lângă noi obține acest număr imens in loc de 24. 109 00:06:19,680 --> 00:06:23,100 Dacă vom tipări valoarea lui p factorial folosind, 110 00:06:23,100 --> 00:06:26,120 vom vedea că factorială are acest număr masiv în ea. 111 00:06:26,120 --> 00:06:28,740 Ceva se întâmplă cu siguranta gresit. 112 00:06:28,740 --> 00:06:31,960 În acest moment, însă, suntem aproape la sfârșitul programului, 113 00:06:31,960 --> 00:06:34,610 și e prea târziu pentru a repara nimic. 114 00:06:34,610 --> 00:06:39,750 >> Cu toate acestea, putem reporni programul prin tastarea r din nou și atunci y pentru a confirma. 115 00:06:39,750 --> 00:06:43,460 Acum ne-am întors la punct de întrerupere nostru de la începutul anului principal. 116 00:06:43,460 --> 00:06:46,600 Stim ca totul pare a fi bine cu citirea în nr. 117 00:06:46,600 --> 00:06:48,630 astfel încât să putem sări mai departe cu nr. 118 00:06:48,630 --> 00:06:52,280 Alternativ, se poate seta un punct de întrerupere nou după ce face în timp ce bucla 119 00:06:52,280 --> 00:06:54,910 și să sară acolo. Să facem asta. 120 00:06:54,910 --> 00:06:59,080 Se pare ca linia 14 vine doar după bucla. 121 00:06:59,080 --> 00:07:01,070 Să stabilim un punct de întrerupere acolo. 122 00:07:01,070 --> 00:07:05,220 E bună practică pentru a specifica numele fișierului în această comandă breakpoint 123 00:07:05,220 --> 00:07:08,480 deoarece GDB poate fi confuz, dacă lucrați cu mai multe fișiere. 124 00:07:08,480 --> 00:07:13,230 Pentru a muta înainte de acest punct de întrerupere, vom utiliza continua sau comanda c.. 125 00:07:13,230 --> 00:07:16,570 >> Bine, aici suntem la bucla for. 126 00:07:16,570 --> 00:07:19,060 Să mergem mai mult în linia 1 pentru bucla, 127 00:07:19,060 --> 00:07:21,630 și apoi vom începe variabile de imprimare pentru a vedea ce se întâmplă. 128 00:07:21,630 --> 00:07:26,410 Să ne asigurăm că i este într-adevăr 1, cum era de asteptat. 129 00:07:26,410 --> 00:07:28,300 Da, asta e bine. 130 00:07:28,300 --> 00:07:30,270 Ce zici de factorial, deși? 131 00:07:30,270 --> 00:07:33,760 Uau, asta nu e bine. 132 00:07:33,760 --> 00:07:35,800 Avem un număr mare negativ aici. 133 00:07:35,800 --> 00:07:38,190 Cum sa întâmplat asta? 134 00:07:38,190 --> 00:07:40,040 Ei bine, dacă ne uităm înapoi la codul, 135 00:07:40,040 --> 00:07:44,800 vedem că niciodată nu l-am initializat, deci ne-am luat doar un gunoi acolo. 136 00:07:44,800 --> 00:07:46,820 Care cu siguranta va arunca de pe calculul nostru. 137 00:07:46,820 --> 00:07:49,930 >> Din fericire, noi nu trebuie să părăsească GDB pentru a rezolva această. 138 00:07:49,930 --> 00:07:54,590 Ne putem inițializa chiar aici și fixați-l în codul de mai târziu folosind comanda de imprimare. 139 00:07:54,590 --> 00:07:59,500 Ne vom inițializa cu 1, deoarece factorialele de la zero și 1 sunt ambele 1, 140 00:07:59,500 --> 00:08:03,940 si daca l-am inițializa cu zero, atunci vom termina întotdeauna cu zero, ca urmare nostru. 141 00:08:03,940 --> 00:08:08,370 Puteți seta orice variabilă în acest fel, care este super la îndemână. 142 00:08:08,370 --> 00:08:10,920 Acum, sa continuam programul nostru. 143 00:08:10,920 --> 00:08:14,040 Să ne asigurăm că totul e în cazul în care aceasta ar trebui sa fie. 144 00:08:14,040 --> 00:08:19,090 Num ar trebui să fie 4, i ar trebui să fie de 1, și factorială trebuie să fie 1 prea. 145 00:08:19,090 --> 00:08:23,990 Noi putem comenzi rapide acest proces și imprima toate variabilele locale 146 00:08:23,990 --> 00:08:26,440 cu super-utile localnici comanda info, 147 00:08:26,440 --> 00:08:29,190 care imprimă toate noastre în domeniul de aplicare-variabile locale. 148 00:08:29,190 --> 00:08:31,980 Oricum, se pare ca totul e bine să plec. 149 00:08:31,980 --> 00:08:34,700 >> Să face o altă ratare a buclei pentru a fi siguri. 150 00:08:34,700 --> 00:08:38,789 Bine, totul pare minunat. 151 00:08:38,789 --> 00:08:41,659 Acum putem folosi comanda continua să meargă până la capăt. 152 00:08:41,659 --> 00:08:46,170 Dulce! 4 factorială imprimat 24 cum era de asteptat. 153 00:08:46,170 --> 00:08:48,690 Acum putem merge rezolva această problemă în codul nostru. 154 00:08:48,690 --> 00:08:53,710 Mai degrabă decât demisia din PIB, vom folosi un alt tab terminal pentru a face acest lucru. 155 00:08:53,710 --> 00:08:58,080 Revenind la fila GDB nostru, acum trebuie să recompilați executabil nostru. 156 00:08:58,080 --> 00:09:03,180 Una dintre cele mai bune lucruri despre GDB este că nu aveți nevoie să plece GDB pentru a rula face. 157 00:09:03,180 --> 00:09:06,570 Așa că nu ne ține lovind pragurile de vechi, 158 00:09:06,570 --> 00:09:10,440 să le dezactivați cu, ați ghicit, dezactivați comanda. 159 00:09:10,440 --> 00:09:13,320 Acest lucru va dezactiva toate punctele de întrerupere noastre. 160 00:09:13,320 --> 00:09:18,180 Acum, putem reporni programul, cu r și asigurați-vă că totul e în regulă. 161 00:09:18,180 --> 00:09:21,300 Se pare ca totul e bine să plec. 162 00:09:21,300 --> 00:09:24,410 Factorial de 4 printuri din 24, la fel ca ne-am gandit. 163 00:09:24,410 --> 00:09:28,830 GDB este unul dintre instrumentele cele mai utile pe care le-ați primit în caseta de instrumente. 164 00:09:28,830 --> 00:09:31,970 >> Există lucruri o tona mai mult vă puteți face cu GDB, 165 00:09:31,970 --> 00:09:34,030 mult mai mult decât vă puteți face cu documentele imprimate simple. 166 00:09:34,030 --> 00:09:36,730 Data viitoare programul nu este de a face ceea ce dorești, 167 00:09:36,730 --> 00:09:39,740 încercați să rulați GDB să ne dăm seama ce se întâmplă înăuntru. 168 00:09:39,740 --> 00:09:44,380 Cu un pic de practică, veți fi în măsură să detaliați dreapta pe bug-ul dvs. în cel mai scurt timp. 169 00:09:44,380 --> 00:09:48,180 Numele meu este Nate Hardison. Acest lucru este CS50.