1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, GNU projekti siluri on võimas silumine vahend C, 2 00:00:12,630 --> 00:00:14,300 koos paljude teiste keelte. 3 00:00:14,300 --> 00:00:17,440 See võimaldab teil tuhnima sees C programme samas nad täidesaatva, 4 00:00:17,440 --> 00:00:20,880 ja see annab teile võimaluse täpselt näha, mis juhtub 5 00:00:20,880 --> 00:00:22,490 kui teie programm jookseb kokku. 6 00:00:22,490 --> 00:00:24,690 See on päris vahva, eks? 7 00:00:24,690 --> 00:00:27,980 GDB on vaba tarkvara, ja see töötab palju tuntud UNIX ja 8 00:00:27,980 --> 00:00:31,840 Windows-põhiste operatsioonisüsteemidega, nii et see on väga levinud vahend. 9 00:00:31,840 --> 00:00:33,560 >> Sa peaksid õppima armastama seda. 10 00:00:33,560 --> 00:00:36,800 GDB plusse on palju lihtsam aega tabada vead 11 00:00:36,800 --> 00:00:39,150 kui need, kes korralagedus kaudu kasutades arvailtaisiin 12 00:00:39,150 --> 00:00:41,420 ja lõpmatu hulga Väljatrüki avaldustega. 13 00:00:41,420 --> 00:00:45,810 GDB on käsurea tööriista, mis tähendab, et saate suhelda see terminal 14 00:00:45,810 --> 00:00:49,720 väljastamise käske klaviatuuri abil asemel klõpsates nuppe hiirega. 15 00:00:49,720 --> 00:00:54,960 >> Et alustada GDB, siis sõna otseses mõttes lihtsalt tüüp gdb käsureale ja vajuta enter. 16 00:00:54,960 --> 00:00:58,230 Näete mõned read välja printida kuni ekraanile 17 00:00:58,230 --> 00:01:00,810 näidates teile versioon GDB et näed, 18 00:01:00,810 --> 00:01:07,890 selle autoriõiguse info, ja lõpus näete GDB kiire: (GDB). 19 00:01:07,890 --> 00:01:10,770 See annab teile teada, et GDB on valmis käske. 20 00:01:10,770 --> 00:01:15,400 Sel hetkel, kõige tähtsam on teada, kuidas seda teha on quit. 21 00:01:15,400 --> 00:01:17,790 Õnneks on see üsna lihtne. 22 00:01:17,790 --> 00:01:19,840 Quit käsk teeb just seda. 23 00:01:19,840 --> 00:01:23,090 Kuna otsetee, võid lihtsalt kasutada q liiga. 24 00:01:23,090 --> 00:01:27,410 Lõbus, kui käivitamist kuni GDB ja siis kohe suitsetamisest ei, 25 00:01:27,410 --> 00:01:30,800 olgem nüüd rääkida kasutades GDB aidata siluda programm. 26 00:01:30,800 --> 00:01:34,630 >> Et alustada, mul on programm siin factorial.c 27 00:01:34,630 --> 00:01:37,380 et saab int ja üritab arvutada selle faktoriaali. 28 00:01:37,380 --> 00:01:41,270 Kui sa ei ole näinud factorials enne või ei mäleta neid, 29 00:01:41,270 --> 00:01:47,840 Faktoriaali arv n on võrdne toote n - (n - 1), (n - 2), ja nii edasi - 30 00:01:47,840 --> 00:01:49,230 kuni vajutad 1. 31 00:01:49,230 --> 00:01:54,550 Seetõttu faktoriaali 3 on 3 * 2 * 1 ehk 6, 32 00:01:54,550 --> 00:02:00,180 ja faktoriaali 4 on 4 * 3 * 2 * 1 või 24. 33 00:02:00,180 --> 00:02:03,970 Faktoriaali null on veider juhtum, see on 1, 34 00:02:03,970 --> 00:02:06,970 ja factorials negatiivsete täisarvude ei ole määratletud. 35 00:02:06,970 --> 00:02:10,280 Igatahes, midagi minu faktoriaali programmi on funky. 36 00:02:10,280 --> 00:02:15,410 Kui ma käivitada, siis prindib välja imelik numbreid, mis on midagi pistmist factorials. 37 00:02:15,410 --> 00:02:19,030 >> Niisiis, saame kasutada GDB aidata aru saada, mis toimub. 38 00:02:19,030 --> 00:02:21,720 GDB tegutseb käivitatava faili, 39 00:02:21,720 --> 00:02:24,910 mis on binaarfailidega toodetud koostamise protsessist. 40 00:02:24,910 --> 00:02:30,940 See tähendab, et me ei saa joosta GDB meie. C või. H lähtekoodi faile nagu factorial.c. 41 00:02:30,940 --> 00:02:34,650 Me tahame kasutada seda lihtsalt faktoriaal asemel. 42 00:02:34,650 --> 00:02:38,340 Kui programm nõudnud käsurea argumendid, 43 00:02:38,340 --> 00:02:40,230 see on koht, kus me tahaks täpsustada neid. 44 00:02:40,230 --> 00:02:44,050 Sel juhul faktoriaal ei vaja käsurea argumendid, 45 00:02:44,050 --> 00:02:46,410 nii me lihtsalt kirjuta run või r lühikeseks. 46 00:02:46,410 --> 00:02:50,440 >> See algab faktoriaali programmi algust. 47 00:02:50,440 --> 00:02:53,940 Kui programm peatub, ma toon oma GDB küsib tagasi. 48 00:02:53,940 --> 00:02:58,130 Okei, proovime sama asja uuesti, faktoriaal 4. 49 00:02:58,130 --> 00:03:02,910 Hea küll, me näeme, et me saada samasugune rämps siin GDB. 50 00:03:02,910 --> 00:03:04,850 Nüüd, kui programm on lõppenud, 51 00:03:04,850 --> 00:03:06,870 me ei saa minna sisse ja pääseda mistahes oma riigi, 52 00:03:06,870 --> 00:03:09,870 nii me peame hakkama seda uuesti näitama enne kui saame näha, mis toimub. 53 00:03:09,870 --> 00:03:13,570 Kuid peame mõtlema, kuidas vältida seda kuni see on keset oma perspektiivis. 54 00:03:13,570 --> 00:03:16,970 >> Selleks, et me kasutame, mida nimetatakse murdepunkti. 55 00:03:16,970 --> 00:03:21,880 Murdepunktid öelda GDB peatamiseks programmi teatud funktsiooni või lähtekoodi rida 56 00:03:21,880 --> 00:03:24,070 et saaksime olukorra hindamisel programmi 57 00:03:24,070 --> 00:03:27,380 väärtused muutujatele, riik mälu ja selline, selles punktis. 58 00:03:27,380 --> 00:03:30,750 Kuna ma tõesti ei tea, kus asjad lähevad valesti, 59 00:03:30,750 --> 00:03:33,510 >> Ma tahan alustada silumine õigus alguses, 60 00:03:33,510 --> 00:03:36,510 õigus, kui peamine algab. 61 00:03:36,510 --> 00:03:39,260 Me määrata murdepunkti alguses peamine kasutades pausi käsk. 62 00:03:39,260 --> 00:03:42,640 Saame kasutada ka b lühendada vaheaega. 63 00:03:42,640 --> 00:03:45,000 Nüüd alustame programm töötab jälle. 64 00:03:45,000 --> 00:03:48,140 Siin me oleme alguses peamine, nagu GDB ütleb. 65 00:03:48,140 --> 00:03:51,970 Rida koodi, mis on umbes täita, kuid ei ole veel 66 00:03:51,970 --> 00:03:53,480 on printf rida. 67 00:03:53,480 --> 00:03:57,200 Me ei saa öelda GDB täita seda rida koodi ja minna järgmisele reale 68 00:03:57,200 --> 00:03:59,840 koos järgmise või n käsk. 69 00:03:59,840 --> 00:04:04,120 >> Olgu, nüüd GDB ütleb meile, et me oleme GetInt rida. 70 00:04:04,120 --> 00:04:06,630 Ma tean, et see tundub printf liin ei jooksnud 71 00:04:06,630 --> 00:04:10,070 kuna me ei näe "Sisesta positiivne täisarv" välja printida ekraanil 72 00:04:10,070 --> 00:04:12,040 kuid see reaalselt sõita. 73 00:04:12,040 --> 00:04:16,029 Mida me näeme on operatsioonisüsteemi suruda kirjalikult midagi ekraanil 74 00:04:16,029 --> 00:04:19,649 kuni see täiesti kindlasti, mis miks silumiseks väljatrükiga 75 00:04:19,649 --> 00:04:21,730 Vahel võib tunduda ebausaldusväärne. 76 00:04:21,730 --> 00:04:26,240 Igatahes, olgem taas minna järgmisele rida koodi ja sisestada int. 77 00:04:26,240 --> 00:04:30,070 Jällegi, olgem tüüp 4. 78 00:04:30,070 --> 00:04:34,540 Nii et see näeb imelik. Oleme real 12 vastavalt GDB, 79 00:04:34,540 --> 00:04:37,660 aga järgmisel real, mis on umbes täita on lihtsalt lokkis traksidega. 80 00:04:37,660 --> 00:04:42,110 >> See tähendab lihtsalt, et me lõpus silmus, meie teeme samas silmus tegelikult 81 00:04:42,110 --> 00:04:46,710 ja GDB ütleb meile, et lõpetamise tingimus, nimelt ükski väiksem kui null, 82 00:04:46,710 --> 00:04:48,010 täidab kõrval. 83 00:04:48,010 --> 00:04:50,230 Kui see kunagi muutub veidi segadusse, 84 00:04:50,230 --> 00:04:54,860 saame tõmba lähtekoodi GDB koos nimekirja või l käsk. 85 00:04:54,860 --> 00:04:56,880 See prindib välja lähtekoodi 86 00:04:56,880 --> 00:04:59,010 mis on koondunud rida, et me oleme praegu. 87 00:04:59,010 --> 00:05:03,590 Kui me loendis või l jälle näeme järgmise komplekti read välja printida. 88 00:05:03,590 --> 00:05:06,070 Me saame seda teha enne, kui oleme tabanud faili lõppu. 89 00:05:06,070 --> 00:05:11,210 >> Et saada tagasi sinna, kus me olime, saame pakkumise nimekiri koos rea number, 90 00:05:11,210 --> 00:05:14,120 sel juhul, rida 12. 91 00:05:14,120 --> 00:05:16,040 Igatahes, liigume edasi. 92 00:05:16,040 --> 00:05:18,240 Nüüd oleme 4 silmuse. 93 00:05:18,240 --> 00:05:21,490 Teeme kindlaks, et meie arv muutuja sisaldab 4. 94 00:05:21,490 --> 00:05:26,170 Me teeme seda printida või p, käsk. 95 00:05:26,170 --> 00:05:31,140 Niisiis, GDB ütleb meile, et arv on tõepoolest ladustamiseks 4, kui lootsime. 96 00:05:31,140 --> 00:05:35,180 1 $, et GDB prindib välja on eriline GDB muutuja 97 00:05:35,180 --> 00:05:37,720 et on nüüd seatud salvestada number 4 ka. 98 00:05:37,720 --> 00:05:42,240 Sa ei saa eirata seda nüüd, aga need GDB muutujad tulevad super mugav 99 00:05:42,240 --> 00:05:46,380 rohkem arenenud juhtudel, kui soovite meenutada, mida olete teinud minevikus. 100 00:05:46,380 --> 00:05:50,970 Igatahes, liigub edasi järgmise näeme, et hakkame liikuma läbi jaoks silmus. 101 00:05:50,970 --> 00:05:54,790 Hoidkem läbimas siin n vähehaaval. 102 00:05:54,790 --> 00:05:58,280 Mitte kirjutades n iga kord, saate ka lihtsalt Enter. 103 00:05:58,280 --> 00:06:03,710 Kui oled tabanud siseneda ilma kirjutades midagi, GDB lihtsalt kordab eelmise käsu. 104 00:06:03,710 --> 00:06:05,910 Nii et nüüd oleme tabanud printf kõne. 105 00:06:05,910 --> 00:06:09,520 Tundub, et me oleme tõepoolest läbi käinud meie jaoks silmus 4 korda, 106 00:06:09,520 --> 00:06:13,750 mis on see, mida me tahame teha, et korrutada 1, 2, 3, ja 4. 107 00:06:13,750 --> 00:06:15,870 >> Kõik tundub nagu see toimib, 108 00:06:15,870 --> 00:06:19,680 välja arvatud siis, kui me lüüa järgmisel jälle me seda väga palju, mitte 24. 109 00:06:19,680 --> 00:06:23,100 Kui me välja printida väärtus faktoriaali kasutades p, 110 00:06:23,100 --> 00:06:26,120 näeme, et faktoriaal ei ole see suur arv selles. 111 00:06:26,120 --> 00:06:28,740 Midagi on kindlasti valesti. 112 00:06:28,740 --> 00:06:31,960 Sel hetkel, kuigi oleme peaaegu lõpus programm, 113 00:06:31,960 --> 00:06:34,610 ja kui on liiga hilja määrata midagi. 114 00:06:34,610 --> 00:06:39,750 >> Kuid me saame uuesti programmi kirjutades r uuesti ja siis y kinnitada. 115 00:06:39,750 --> 00:06:43,460 Nüüd oleme tagasi meie murdepunkti alguses peamine. 116 00:06:43,460 --> 00:06:46,600 Me teame, et kõik tundub olevat trahvi lugemist n. 117 00:06:46,600 --> 00:06:48,630 et saaksime hüpata n. 118 00:06:48,630 --> 00:06:52,280 Alternatiivina saame uue murdepunkti pärast seda samas loop 119 00:06:52,280 --> 00:06:54,910 ja hüpata seal. Teeme seda. 120 00:06:54,910 --> 00:06:59,080 Paistab, rida 14 tuleb just pärast silmus. 121 00:06:59,080 --> 00:07:01,070 Laseme murdepunkti seal. 122 00:07:01,070 --> 00:07:05,220 See on hea tava, et määrata faili nimi selle murdepunkti käsk 123 00:07:05,220 --> 00:07:08,480 alates GDB võite segaduses kui te töötate mitme failiga. 124 00:07:08,480 --> 00:07:13,230 Edasi liikuda see murdepunkt, me kasutame jätkata või c käsk. 125 00:07:13,230 --> 00:07:16,570 >> Okei, siin me oleme jaoks silmus. 126 00:07:16,570 --> 00:07:19,060 Lähme veel 1 rida arvesse jaoks silmus, 127 00:07:19,060 --> 00:07:21,630 ja siis hakkame trükkimine muutujad näha, mis toimub. 128 00:07:21,630 --> 00:07:26,410 Teeme kindlaks, et ma tõepoolest 1 ootuspäraselt. 129 00:07:26,410 --> 00:07:28,300 Jah, see on kõik hea. 130 00:07:28,300 --> 00:07:30,270 Aga faktoriaal küll? 131 00:07:30,270 --> 00:07:33,760 Vau, see pole hea. 132 00:07:33,760 --> 00:07:35,800 Meil on suur negatiivne arv siin. 133 00:07:35,800 --> 00:07:38,190 Kuidas see juhtus? 134 00:07:38,190 --> 00:07:40,040 Noh, kui me vaatame tagasi kood, 135 00:07:40,040 --> 00:07:44,800 me näeme, et me ei lähtestatud, nii et me oleme just prügikast seal. 136 00:07:44,800 --> 00:07:46,820 See on kindlasti viskama meie arvutamisel. 137 00:07:46,820 --> 00:07:49,930 >> Õnneks me ei pea lahkuma GDB määrata see. 138 00:07:49,930 --> 00:07:54,590 Me saame initsialiseerida ta siinsamas ja määrata selle koodi hiljem kasutades trükkimiskäsku. 139 00:07:54,590 --> 00:07:59,500 Me algväärtustamiseks 1 alates factorials nulli ja 1 on mõlemad 1 140 00:07:59,500 --> 00:08:03,940 ja kui me initsialiseerida ta nulli, siis olime alati lõpuks null, kuna meie tulemus. 141 00:08:03,940 --> 00:08:08,370 Võite seada mis tahes muutuja sel viisil, mis on super mugav. 142 00:08:08,370 --> 00:08:10,920 Nüüd saab jätkata programmi. 143 00:08:10,920 --> 00:08:14,040 Olgem veendumaks, et kõik on kui see peaks olema. 144 00:08:14,040 --> 00:08:19,090 Num peaks olema 4, i peaks olema 1 ja faktoriaal peaks olema 1 liiga. 145 00:08:19,090 --> 00:08:23,990 Me võime otsetee sellesse protsessi ja printida kõik meie kohalikud muutujad 146 00:08:23,990 --> 00:08:26,440 koos super-kasulik käsk info kohalikega, 147 00:08:26,440 --> 00:08:29,190 mis prindib välja kõik meie in-ulatus lokaalsed muutujad. 148 00:08:29,190 --> 00:08:31,980 Igatahes, tundub, et kõik on hea minna. 149 00:08:31,980 --> 00:08:34,700 >> Teeme teise minna ümber selle silmuse lihtsalt veenduda. 150 00:08:34,700 --> 00:08:38,789 Okei, kõik tundub hea. 151 00:08:38,789 --> 00:08:41,659 Nüüd saame kasutada jätkuvad käsu minna lõpuni. 152 00:08:41,659 --> 00:08:46,170 Sweet! 4 faktoriaal välja printida 24 ootuspäraselt. 153 00:08:46,170 --> 00:08:48,690 Nüüd saame minna seda parandada meie kood. 154 00:08:48,690 --> 00:08:53,710 Selle asemel, et loobuda välja GDB, me kasutame teise terminali lingile teha. 155 00:08:53,710 --> 00:08:58,080 Tulles tagasi meie GDB lingile, nüüd vaja kompileeri meie käivitatav. 156 00:08:58,080 --> 00:09:03,180 Üks parimaid asju GDB on see, et sa ei pea lahkuma GDB joosta teha. 157 00:09:03,180 --> 00:09:06,570 Nii et me ei pea lööb vana murdepunktid, 158 00:09:06,570 --> 00:09:10,440 olgem keelata neid, sa arvasid, keelake käsk. 159 00:09:10,440 --> 00:09:13,320 See keelab kõik meie murdepunktid. 160 00:09:13,320 --> 00:09:18,180 Nüüd saame uuesti programmi r ja veenduge, et kõik on korras. 161 00:09:18,180 --> 00:09:21,300 Paistab, kõik on hea minna. 162 00:09:21,300 --> 00:09:24,410 Faktoriaal 4 trükib 24, nagu me arvasime. 163 00:09:24,410 --> 00:09:28,830 GDB on üks kõige kasulikud vahendid sul oma tööriistakasti. 164 00:09:28,830 --> 00:09:31,970 >> On ton rohkem asju saab teha koos GDB, 165 00:09:31,970 --> 00:09:34,030 palju rohkem kui saate teha lihtne väljatrükke. 166 00:09:34,030 --> 00:09:36,730 Järgmine kord, kui teie programm ei tee seda, mida soovite, 167 00:09:36,730 --> 00:09:39,740 proovige GDB aru saada, mis toimub sees. 168 00:09:39,740 --> 00:09:44,380 Mis natuke tava, on sul võimalik puurida ette õigus oma viga ei aja. 169 00:09:44,380 --> 00:09:48,180 Minu nimi on Nate Hardison. See on CS50.