1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, GNU Debugger projekta, je močan debugging orodje za C 2 00:00:12,630 --> 00:00:14,300 skupaj s številnimi drugimi jeziki. 3 00:00:14,300 --> 00:00:17,440 To vam omogoča, da suniti okrog znotraj svojih programov C, medtem ko oni izvršujejo 4 00:00:17,440 --> 00:00:20,880 prav tako pa vam daje priložnost, da vidijo, kaj se dogaja 5 00:00:20,880 --> 00:00:22,490 ko se program sesuje. 6 00:00:22,490 --> 00:00:24,690 To je zelo eleganten, kajne? 7 00:00:24,690 --> 00:00:27,980 GDB je brezplačna programska oprema, in ga zažene na številnih priljubljenih UNIX in 8 00:00:27,980 --> 00:00:31,840 Operacijski sistem Windows operacijskih sistemih, tako da je zelo razširjena orodje. 9 00:00:31,840 --> 00:00:33,560 >> Če bi izvedeli, da ga ljubim. 10 00:00:33,560 --> 00:00:36,800 GDB profesionalci imajo veliko laže izslediti napake 11 00:00:36,800 --> 00:00:39,150 kot tisti, ki zmešnjave s pomočjo ugibanja 12 00:00:39,150 --> 00:00:41,420 in neskončne količine izpisov izkazov. 13 00:00:41,420 --> 00:00:45,810 GDB je orodje ukazne vrstice, kar pomeni, da lahko delajo z njim v terminalu 14 00:00:45,810 --> 00:00:49,720 ukazov preko tipkovnice, namesto da kliknete gumbe z miško. 15 00:00:49,720 --> 00:00:54,960 >> Za zagon GDB, dobesedno samo tip gdb na poziv in pritisnite tipko Enter. 16 00:00:54,960 --> 00:00:58,230 Videli boste nekaj vrstic izpisal na zaslon 17 00:00:58,230 --> 00:01:00,810 prikazuje različico gdb, da ste tekmovanje v teku, 18 00:01:00,810 --> 00:01:07,890 svoje informacije o avtorskih pravicah, in na koncu boste videli GDB poziv: (gdb). 19 00:01:07,890 --> 00:01:10,770 To vam pove, da je pripravljena za GDB ukazov. 20 00:01:10,770 --> 00:01:15,400 Na tej točki, je nehal najbolj pomembna stvar, da vem, kako to storiti. 21 00:01:15,400 --> 00:01:17,790 Na srečo, to je zelo preprosta. 22 00:01:17,790 --> 00:01:19,840 Opustitvi kajenja ukaz ne samo to. 23 00:01:19,840 --> 00:01:23,090 Kot bližnjice lahko preprosto uporabite q preveč. 24 00:01:23,090 --> 00:01:27,410 Kot je zabavno, kot škorenj ki gre gor GDB in nato takoj odnehal je, 25 00:01:27,410 --> 00:01:30,800 kaj je zdaj govoriti o uporabi GDB pomaga debug program. 26 00:01:30,800 --> 00:01:34,630 >> Za začetek, imam program, tukaj v factorial.c 27 00:01:34,630 --> 00:01:37,380 da dobi int in poskuša izračunati svojo fakulteto. 28 00:01:37,380 --> 00:01:41,270 V primeru, da še niste videli factorials pred ali jih ne spomnim, 29 00:01:41,270 --> 00:01:47,840 Fakulteto števila n je enaka zmnožku n - (n - 1), (n - 2), in tako naprej - 30 00:01:47,840 --> 00:01:49,230 dokler ne dosežete 1. 31 00:01:49,230 --> 00:01:54,550 Zato fakulteto 3 je 3 * 2 * 1 ali 6, 32 00:01:54,550 --> 00:02:00,180 in fakulteto 4 je 4 * 3 * 2 * 1, ali 24. 33 00:02:00,180 --> 00:02:03,970 Fakulteto je nič čudno, tako, da je 1, 34 00:02:03,970 --> 00:02:06,970 in se factorials negativnih števil ni opredeljen. 35 00:02:06,970 --> 00:02:10,280 Kakorkoli že, nekaj o moji faktorski programa je funky. 36 00:02:10,280 --> 00:02:15,410 Ko sem teči, se natisne čudne številke, ki nimajo nič skupnega z factorials. 37 00:02:15,410 --> 00:02:19,030 >> Torej, lahko uporabite GDB pomaga ugotoviti, kaj se dogaja. 38 00:02:19,030 --> 00:02:21,720 GDB deluje na izvedljivih datotek, 39 00:02:21,720 --> 00:02:24,910 ki so binarne datoteke, ki jih je urejanje procesa. 40 00:02:24,910 --> 00:02:30,940 To pomeni, da ne moremo teči GDB na naši. C oz. H datoteke izvorne kode, kot factorial.c. 41 00:02:30,940 --> 00:02:34,650 Želimo, da bi sistem deloval na samo fakulteto namesto tega. 42 00:02:34,650 --> 00:02:38,340 Če program zahteva nobenih ukazni vrstici nekaj argumentov, 43 00:02:38,340 --> 00:02:40,230 to je, če bi se jih določi. 44 00:02:40,230 --> 00:02:44,050 V tem primeru fakulteta ne zahteva nobenih ukazni vrstici nekaj argumentov, 45 00:02:44,050 --> 00:02:46,410 tako da smo šele stavek tek ali r na kratko. 46 00:02:46,410 --> 00:02:50,440 >> To se bo začelo fakulteto delovanje programa. 47 00:02:50,440 --> 00:02:53,940 Ko se program ne deluje, bom moj GDB poziv nazaj. 48 00:02:53,940 --> 00:02:58,130 Prav, poskusimo še enkrat isto stvar, Fakulteta 4. 49 00:02:58,130 --> 00:03:02,910 V redu, vidimo, da smo dobili enake smeti tukaj v gdb. 50 00:03:02,910 --> 00:03:04,850 Zdaj, ko se je program končal, 51 00:03:04,850 --> 00:03:06,870 ne moremo iti in dostop do katerega koli od svoje države, 52 00:03:06,870 --> 00:03:09,870 tako da bomo morali začeti znova teče, preden bomo lahko videli, kaj se dogaja. 53 00:03:09,870 --> 00:03:13,570 Vendar pa moramo način, kako ga ustaviti, medtem ko je v sredini svojega rok. 54 00:03:13,570 --> 00:03:16,970 >> Da bi to dosegli, bomo uporabili, kar se imenuje prekinitveno točko. 55 00:03:16,970 --> 00:03:21,880 Mejne vrednosti povedal GDB, da prekinete program na določene funkcije ali liniji izvorne kode 56 00:03:21,880 --> 00:03:24,070 tako da lahko proučujemo stanje programa, 57 00:03:24,070 --> 00:03:27,380 vrednosti spremenljivk, stanje pomnilnika in tako, na tej točki. 58 00:03:27,380 --> 00:03:30,750 Ker res ne vem, kje gredo stvari narobe, 59 00:03:30,750 --> 00:03:33,510 >> Hočem, da začnete iskanje in odpravljanje napak prav na samem začetku, 60 00:03:33,510 --> 00:03:36,510 prav, ko se začne glavna. 61 00:03:36,510 --> 00:03:39,260 Bomo nastavite prekinitveno točko na začetku glavni odmor z uporabo ukaza. 62 00:03:39,260 --> 00:03:42,640 Mi lahko uporabite tudi b Skrajšati odmor. 63 00:03:42,640 --> 00:03:45,000 Zdaj pa začnimo program teče znova. 64 00:03:45,000 --> 00:03:48,140 Tukaj smo na začetku glavni, tako kot GDB pove. 65 00:03:48,140 --> 00:03:51,970 Linija kode, ki je tik pred izvedbo, vendar še ni 66 00:03:51,970 --> 00:03:53,480 je printf line. 67 00:03:53,480 --> 00:03:57,200 Mi lahko poveste gdb za izvajanje te kode in pojdite na naslednjo vrstico 68 00:03:57,200 --> 00:03:59,840 z naslednjo ali n ukaz. 69 00:03:59,840 --> 00:04:04,120 >> V redu, zdaj GDB nam pove, da smo na liniji GetInt. 70 00:04:04,120 --> 00:04:06,630 Vem, da se zdi, kot printf linija ni tekla 71 00:04:06,630 --> 00:04:10,070 saj ne vidimo "Vnesite pozitivno celo število" print out na zaslonu, 72 00:04:10,070 --> 00:04:12,040 vendar se je to dejansko deluje. 73 00:04:12,040 --> 00:04:16,029 Kaj smo videli, je operacijski sistem zatiranje pisanje ničesar na zaslonu 74 00:04:16,029 --> 00:04:19,649 dokler ni absolutno je, kar zakaj debugging z izpisi 75 00:04:19,649 --> 00:04:21,730 Včasih se zdi nezanesljiva. 76 00:04:21,730 --> 00:04:26,240 Kakorkoli že, dajmo še enkrat šel v naslednjo vrstico kode in vstopiti v notr. 77 00:04:26,240 --> 00:04:30,070 Še enkrat, kaj je tip 4. 78 00:04:30,070 --> 00:04:34,540 Tako to izgleda čudno. Mi smo na liniji 12 v skladu z gdb, 79 00:04:34,540 --> 00:04:37,660 toda naslednja vrstica, ki je približno za izvršitev le kodrasti brace. 80 00:04:37,660 --> 00:04:42,110 >> To samo pomeni, da smo na koncu zanke, naša storiti, medtem ko zanke v resnici, 81 00:04:42,110 --> 00:04:46,710 GDB in nam pravi, da je odpoved pogoj, in sicer kljub manjši od nič, 82 00:04:46,710 --> 00:04:48,010 bodo izvajale naslednji. 83 00:04:48,010 --> 00:04:50,230 Če se to kdaj postane malo zmedeno, 84 00:04:50,230 --> 00:04:54,860 lahko potegnite do izvorne kode v gdb s seznama ali l ukaz. 85 00:04:54,860 --> 00:04:56,880 To natisne izvorno kodo 86 00:04:56,880 --> 00:04:59,010 , ki je osredotočeno na progi, da smo trenutno. 87 00:04:59,010 --> 00:05:03,590 Če vpišemo seznam ali litrov enkrat, bomo videli naslednji nabor vrstic natisniti. 88 00:05:03,590 --> 00:05:06,070 To lahko storimo tako, dokler ne bomo zadeli konec datoteke. 89 00:05:06,070 --> 00:05:11,210 >> Da bi dobili nazaj, kjer smo bili, smo lahko dobavi seznama s številko vrstice, 90 00:05:11,210 --> 00:05:14,120 v tem primeru postavka 12. 91 00:05:14,120 --> 00:05:16,040 Kakorkoli že, gremo naprej. 92 00:05:16,040 --> 00:05:18,240 Zdaj smo na 4 zanke. 93 00:05:18,240 --> 00:05:21,490 Naj se prepričajte, da je naša spremenljivka vsebuje 4 cilindrov. 94 00:05:21,490 --> 00:05:26,170 To počnemo s tiskanim ali p, ukaz. 95 00:05:26,170 --> 00:05:31,140 Torej, GDB nam pove, da je res cilindrov shranjevanje 4, kot smo pričakovali. 96 00:05:31,140 --> 00:05:35,180 Na $ 1, da GDB natisne, je posebna spremenljivka GDB 97 00:05:35,180 --> 00:05:37,720 , ki je nastavljen za shranjevanje številka 4, kot tudi. 98 00:05:37,720 --> 00:05:42,240 Lahko prezreti to za zdaj, vendar so te spremenljivke GDB prišel prav super 99 00:05:42,240 --> 00:05:46,380 v bolj napredovalih primerih, ko želite, da se spomni, kaj si storil v preteklosti. 100 00:05:46,380 --> 00:05:50,970 Kakorkoli že, gremo naprej z drugo, vidimo, da smo začeli gibljejo skozi zanke for. 101 00:05:50,970 --> 00:05:54,790 Nadaljujmo z tukaj z n bitov za korakom. 102 00:05:54,790 --> 00:05:58,280 Namesto tipkanja n vsakokrat, lahko tudi samo zadeti nastopiti. 103 00:05:58,280 --> 00:06:03,710 Ko zadeti nastopiti brez tipkanja ničesar, GDB samo ponavlja prejšnji ukaz. 104 00:06:03,710 --> 00:06:05,910 Torej, zdaj smo zadeli printf klic. 105 00:06:05,910 --> 00:06:09,520 Izgleda, da smo dejansko šli skozi naše zanka 4-krat, 106 00:06:09,520 --> 00:06:13,750 , ki je tisto, kar želimo narediti, da bi se pomnoži z 1, 2, 3 in 4. 107 00:06:13,750 --> 00:06:15,870 >> Vse, kar se zdi, kot da deluje, 108 00:06:15,870 --> 00:06:19,680 razen če naletimo na naslednji spet smo dobili to ogromno število namesto 24. 109 00:06:19,680 --> 00:06:23,100 Če želimo izpisati vrednost faktorski z p, 110 00:06:23,100 --> 00:06:26,120 vidimo, da fakulteta ne da je to veliko več v njej. 111 00:06:26,120 --> 00:06:28,740 Nekaj ​​je definitivno narobe. 112 00:06:28,740 --> 00:06:31,960 Na tej točki, čeprav smo skoraj na koncu programa, 113 00:06:31,960 --> 00:06:34,610 in da je prepozno, da ničesar popraviti. 114 00:06:34,610 --> 00:06:39,750 >> Vendar pa lahko ponovno zagnati programa z vnosom r še enkrat in potem y za potrditev. 115 00:06:39,750 --> 00:06:43,460 Zdaj smo spet na naši mejnimi vrednostmi na začetku glavni. 116 00:06:43,460 --> 00:06:46,600 Vemo, da je vse, kar se zdi v redu z branjem v n. 117 00:06:46,600 --> 00:06:48,630 tako da bomo lahko preskočite s n. 118 00:06:48,630 --> 00:06:52,280 Lahko pa smo postavili novo odmerka po, medtem ko je zanka 119 00:06:52,280 --> 00:06:54,910 in skok tam. Naredimo to. 120 00:06:54,910 --> 00:06:59,080 Izgleda, vrstica 14 pride samo po zanki. 121 00:06:59,080 --> 00:07:01,070 Naj nastavite prekinitveno točko tam. 122 00:07:01,070 --> 00:07:05,220 To je dobra praksa, da določite ime datoteke v tem ukazu prelomne točke 123 00:07:05,220 --> 00:07:08,480 saj se GDB zmeden, če delate z več datotekami. 124 00:07:08,480 --> 00:07:13,230 Če želite premakniti naprej to mejnimi vrednostmi, bomo uporabili continue ali C ukaz. 125 00:07:13,230 --> 00:07:16,570 >> No, pa smo na za zanko. 126 00:07:16,570 --> 00:07:19,060 Pojdimo 1 več za linijo v zanki, 127 00:07:19,060 --> 00:07:21,630 in potem bomo začeli tiskanje spremenljivk, da vidim, kaj se dogaja. 128 00:07:21,630 --> 00:07:26,410 Naj se prepričajte, da sem res 1, kot je bilo pričakovano. 129 00:07:26,410 --> 00:07:28,300 Ja, to je vse v redu. 130 00:07:28,300 --> 00:07:30,270 Kaj pa fakulteto, čeprav? 131 00:07:30,270 --> 00:07:33,760 Vau, to pa ni dobro. 132 00:07:33,760 --> 00:07:35,800 Imamo veliko negativno število tukaj. 133 00:07:35,800 --> 00:07:38,190 Kako se je to zgodilo? 134 00:07:38,190 --> 00:07:40,040 No, če pogledamo nazaj na kodo, 135 00:07:40,040 --> 00:07:44,800 vidimo, da nismo nikoli začeto, tako da smo pravkar smeti tam. 136 00:07:44,800 --> 00:07:46,820 To bo zagotovo vrgel svoj izračun. 137 00:07:46,820 --> 00:07:49,930 >> Na srečo nimamo zapustiti GDB popraviti to. 138 00:07:49,930 --> 00:07:54,590 Mi lahko zažene tukaj in jo pritrdite v kodeksu kasneje s pomočjo ukaza za tiskanje. 139 00:07:54,590 --> 00:07:59,500 Mi bomo za inicializacijo 1, saj so factorials iz nič in 1 sta 1, 140 00:07:59,500 --> 00:08:03,940 in če jo inicializirati na nič, potem pa smo vedno na koncu z nič, kot je naš rezultat. 141 00:08:03,940 --> 00:08:08,370 Nastavite lahko vse spremenljivke na ta način, ki je zelo priročen. 142 00:08:08,370 --> 00:08:10,920 Zdaj pa še naš program. 143 00:08:10,920 --> 00:08:14,040 Naj bo vse je tam, kjer je moral biti. 144 00:08:14,040 --> 00:08:19,090 Št mora biti 4, bi moral biti 1 in fakulteto mora biti 1 preveč. 145 00:08:19,090 --> 00:08:23,990 Mi lahko bližnjico ta proces in tiskanje vseh naših lokalnih spremenljivk 146 00:08:23,990 --> 00:08:26,440 z izjemno koristne domačini info ukaz, 147 00:08:26,440 --> 00:08:29,190 ki natisne vse naše in-področje lokalnih spremenljivk. 148 00:08:29,190 --> 00:08:31,980 Kakorkoli že, izgleda, da je vse v redu, da gredo. 149 00:08:31,980 --> 00:08:34,700 >> Naredimo še en neuspeli prilet z zanko samo prepričati. 150 00:08:34,700 --> 00:08:38,789 Ok, vse izgleda super. 151 00:08:38,789 --> 00:08:41,659 Sedaj lahko uporabite še naprej ukaz, da gredo do konca. 152 00:08:41,659 --> 00:08:46,170 Sweet! 4 fakulteto natisne 24 kot je bilo pričakovano. 153 00:08:46,170 --> 00:08:48,690 Zdaj gremo lahko to popravimo v naši kodi. 154 00:08:48,690 --> 00:08:53,710 Namesto da bi nehal iz gdb, bomo uporabili drug terminal kartico za to. 155 00:08:53,710 --> 00:08:58,080 Če se vrnemo k GDB kartici moramo zdaj prevedem našo izvedljivo. 156 00:08:58,080 --> 00:09:03,180 Ena izmed najboljših stvari približno gdb je, da vam ni treba zapustiti GDB teči narediti. 157 00:09:03,180 --> 00:09:06,570 Tako, da ne vodijo hitting stare prelomnih točk, 158 00:09:06,570 --> 00:09:10,440 dajmo jim onemogočiti z, uganili ste, onemogočiti ukaz. 159 00:09:10,440 --> 00:09:13,320 S tem boste onemogočili vse naše prelomnih točk. 160 00:09:13,320 --> 00:09:18,180 Sedaj lahko ponovno program z r in da bo vse v redu. 161 00:09:18,180 --> 00:09:21,300 Izgleda, da je vse v redu, da gredo. 162 00:09:21,300 --> 00:09:24,410 Fakulteta 4 natisne 24, tako kot smo si mislili. 163 00:09:24,410 --> 00:09:28,830 GDB je eden izmed najbolj koristnih orodij, ki ste jih dobili v vašem orodjarni. 164 00:09:28,830 --> 00:09:31,970 >> Obstajajo ton več stvari, ki jih lahko storite z gdb, 165 00:09:31,970 --> 00:09:34,030 veliko več, kot lahko to storite s preprostimi izpisov. 166 00:09:34,030 --> 00:09:36,730 Naslednjič, ko se program ne to, kar želite, 167 00:09:36,730 --> 00:09:39,740 poskusite zagnati GDB, da ugotovimo, kaj se dogaja v notranjosti. 168 00:09:39,740 --> 00:09:44,380 Z malo vaje boste mogli vrtanje navzdol na vašem bug v nobenem trenutku. 169 00:09:44,380 --> 00:09:48,180 Moje ime je Nate Hardison. To je CS50.