1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, GNU Project Debugger, ay isang napakalakas na tool sa pag-debug para sa C, 2 00:00:12,630 --> 00:00:14,300 kasama ng maraming iba pang mga wika. 3 00:00:14,300 --> 00:00:17,440 Ay nagbibigay-daan sa iyo upang sundutin sa paligid sa loob ng iyong mga programa sa C habang sila execute, 4 00:00:17,440 --> 00:00:20,880 at ito rin ay nagbibigay sa iyo ng pagkakataon upang makita ang eksaktong kung ano ang mangyayari 5 00:00:20,880 --> 00:00:22,490 kapag nag-crash ng iyong programa. 6 00:00:22,490 --> 00:00:24,690 Medyo nakakatawang, i-right? 7 00:00:24,690 --> 00:00:27,980 GDB libreng software, at ito ay tumatakbo sa maraming popular na UNIX at 8 00:00:27,980 --> 00:00:31,840 Windows-based operating system, kaya laganap tool. 9 00:00:31,840 --> 00:00:33,560 >> Dapat mong malaman upang ibigin ito. 10 00:00:33,560 --> 00:00:36,800 GDB pros ay may isang mas madali na oras tracking down na mga bug 11 00:00:36,800 --> 00:00:39,150 kaysa sa mga na tuaranta sa pamamagitan ng paggamit ng guesses 12 00:00:39,150 --> 00:00:41,420 at walang katapusan na bilang ng mga pahayag sa printout. 13 00:00:41,420 --> 00:00:45,810 GDB ay isang command-line tool, na nangangahulugan na maaari kang makipag-ugnayan sa mga ito sa isang terminal 14 00:00:45,810 --> 00:00:49,720 nagbigay ng mga utos sa pamamagitan ng keyboard sa halip ng pag-click sa pindutan gamit ang iyong mouse. 15 00:00:49,720 --> 00:00:54,960 >> Upang simulan GDB, literal lamang uri gdb sa prompt at pindutin ang enter. 16 00:00:54,960 --> 00:00:58,230 Makikita mo ang ilang mga linya na naka-print sa screen 17 00:00:58,230 --> 00:01:00,810 ipinapakita sa iyo ang bersyon ng GDB na nagpapatakbo ka, 18 00:01:00,810 --> 00:01:07,890 ang impormasyon ng copyright nito, at sa dulo makikita mo ang GDB prompt: (gdb). 19 00:01:07,890 --> 00:01:10,770 Ito ay nagbibigay-daan sa alam mo na GDB ay handa na para sa command. 20 00:01:10,770 --> 00:01:15,400 Sa puntong ito, ang pinaka-mahalagang bagay upang malaman kung paano gawin ay mag-quit. 21 00:01:15,400 --> 00:01:17,790 Kabutihang palad, ito ay medyo simple. 22 00:01:17,790 --> 00:01:19,840 Ang huminto utos ay ginagawa lamang na. 23 00:01:19,840 --> 00:01:23,090 Bilang isang shortcut, maaari mo lamang gamitin ang q. 24 00:01:23,090 --> 00:01:27,410 Bilang masaya bilang booting up GDB at pagkatapos ay agad na mag-quit, 25 00:01:27,410 --> 00:01:30,800 sabihin ngayon makipag-usap tungkol sa paggamit ng GDB upang makatulong na i-debug ang isang programa. 26 00:01:30,800 --> 00:01:34,630 >> Upang magsimula, Mayroon akong isang programa dito sa factorial.c 27 00:01:34,630 --> 00:01:37,380 na nakakakuha ng isang int at sumusubok upang makalkula ang factorial. 28 00:01:37,380 --> 00:01:41,270 Sa kaso hindi mo nakita factorials bago o hindi maalalang sa kanila, 29 00:01:41,270 --> 00:01:47,840 Ang factorial ng ang bilang n katumbas sa produkto ng n - (n - 1), (n - 2), at iba pa - 30 00:01:47,840 --> 00:01:49,230 hanggang maabot ang 1. 31 00:01:49,230 --> 00:01:54,550 Samakatuwid, ang factorial ng 3 3 * 2 * 1, o 6, 32 00:01:54,550 --> 00:02:00,180 at ang factorial ng 4 4 * 3 * 2 * 1, o 24. 33 00:02:00,180 --> 00:02:03,970 Ang factorial ng zero ay isang kakaibang kaso, 1, 34 00:02:03,970 --> 00:02:06,970 at ang factorials ng mga negatibong integer ay hindi tinukoy. 35 00:02:06,970 --> 00:02:10,280 Pa Rin, ang isang bagay tungkol sa aking factorial programa ay funky. 36 00:02:10,280 --> 00:02:15,410 Kapag nagpatakbo ako, mga Kopya kakaiba ang mga numero na may walang gawin sa factorials. 37 00:02:15,410 --> 00:02:19,030 >> Kaya, maaari naming gamitin ang GDB upang makatulong na malaman kung ano ang nangyayari sa. 38 00:02:19,030 --> 00:02:21,720 GDB ay nagpapatakbo ng sa mga maipapatupad na file, 39 00:02:21,720 --> 00:02:24,910 na ang mga binary file na ginawa sa pamamagitan ng proseso ng compilation. 40 00:02:24,910 --> 00:02:30,940 Iyon ay, hindi namin maaaring tumakbo GDB sa aming. C o. H pinagmulan file code tulad factorial.c. 41 00:02:30,940 --> 00:02:34,650 Gusto naming patakbuhin ito lamang factorial sa halip. 42 00:02:34,650 --> 00:02:38,340 Kung ang programa ay kinakailangan anumang command-line argumento, 43 00:02:38,340 --> 00:02:40,230 ito ay kung saan namin tukuyin ang mga ito. 44 00:02:40,230 --> 00:02:44,050 Sa kasong ito, factorial ay hindi nangangailangan ng anumang command-line argumento, 45 00:02:44,050 --> 00:02:46,410 upang i-type lamang namin ang run o r para sa maikling. 46 00:02:46,410 --> 00:02:50,440 >> Ito ay simulan ang factorial programa tumatakbo. 47 00:02:50,440 --> 00:02:53,940 Kapag Humihinto ang programa tumatakbo, ako makakakuha ng aking GDB prompt pabalik. 48 00:02:53,940 --> 00:02:58,130 Okay, sabihin subukang muli ang parehong bagay, factorial ng 4. 49 00:02:58,130 --> 00:03:02,910 Karapatan lahat, nakikita namin na kami ay pagkuha ng parehong uri ng junk dito sa GDB. 50 00:03:02,910 --> 00:03:04,850 Ngayon na ang programa ay natapos, 51 00:03:04,850 --> 00:03:06,870 hindi namin maaaring pumunta sa at i-access ang anumang ng kanyang estado, 52 00:03:06,870 --> 00:03:09,870 kaya kailangan nating simulan ang mga ito sa pagtakbo muli bago namin makita kung ano ang nangyayari. 53 00:03:09,870 --> 00:03:13,570 Gayunpaman, kailangan namin ng isang paraan upang ihinto ito habang ito ay sa gitna ng mga run. 54 00:03:13,570 --> 00:03:16,970 >> Upang gawin iyon, hindi namin gamitin kung ano ang tinatawag na breakpoint. 55 00:03:16,970 --> 00:03:21,880 Breakpoints sabihin GDB i-pause ang programa sa isang partikular na function o linya ng source code 56 00:03:21,880 --> 00:03:24,070 upang maaari naming suriin ang estado ng programa, 57 00:03:24,070 --> 00:03:27,380 ang mga halaga ng variable, ang estado ng memorya at tulad, sa puntong iyon. 58 00:03:27,380 --> 00:03:30,750 Dahil hindi ko talaga alam kung saan ang mga bagay ay pagpunta mali, 59 00:03:30,750 --> 00:03:33,510 >> Gusto ko lang upang simulan ang pag-debug sa pinakadulo simula, 60 00:03:33,510 --> 00:03:36,510 kanan kapag pangunahing nagsisimula. 61 00:03:36,510 --> 00:03:39,260 Susubukan naming magtakda ng isang breakpoint sa simula ng pangunahing gamit ang utos ng pahinga. 62 00:03:39,260 --> 00:03:42,640 Maaari din naming gamitin b pagpapaiksi pahinga. 63 00:03:42,640 --> 00:03:45,000 Ngayon ay hayaan ang simulan ang programa muling tumakbo ang. 64 00:03:45,000 --> 00:03:48,140 Narito ang namin sa simula ng pangunahing, tulad ng nagsasabi sa amin ng GDB. 65 00:03:48,140 --> 00:03:51,970 Ang linya ng code na upang maisagawa ngunit hindi pa 66 00:03:51,970 --> 00:03:53,480 ang printf linya. 67 00:03:53,480 --> 00:03:57,200 Maaari naming sabihin sa GDB upang isakatuparan ang linya ng code at pumunta sa susunod na linya 68 00:03:57,200 --> 00:03:59,840 ang susunod o n utos. 69 00:03:59,840 --> 00:04:04,120 >> Karapatan lahat, na ngayon ay GDB Sinasabi sa amin na hindi namin sa linya ng GetInt. 70 00:04:04,120 --> 00:04:06,630 Alam ko na tila tulad ng printf linya ay hindi tumatakbo 71 00:04:06,630 --> 00:04:10,070 dahil hindi namin makita ang "Magpasok ng isang positibong integer" print out sa screen, 72 00:04:10,070 --> 00:04:12,040 pero sa totoo ay tumakbo. 73 00:04:12,040 --> 00:04:16,029 Kung ano ang nakikita namin ay ang operating system sugpuin ang anumang ng pagsulat sa screen 74 00:04:16,029 --> 00:04:19,649 hanggang sa ganap na ito ay, na kung bakit ang pag-debug na may Printout 75 00:04:19,649 --> 00:04:21,730 maaaring minsan tila hindi kapani-paniwala. 76 00:04:21,730 --> 00:04:26,240 Pa rin, sabihin muli pumunta sa susunod na linya ng code at ipasok sa isang int. 77 00:04:26,240 --> 00:04:30,070 Muli, sabihin uri 4. 78 00:04:30,070 --> 00:04:34,540 Kaya ito mukhang kakaiba. Humihingi kami sa linya 12 ayon sa GDB, 79 00:04:34,540 --> 00:04:37,660 ngunit sa susunod na linya na tungkol sa upang maisagawa lamang ng kulot suhay. 80 00:04:37,660 --> 00:04:42,110 >> Iyon ay nangangahulugan lamang kami sa dulo ng isang loop, ang aming gawin habang loop sa katunayan, 81 00:04:42,110 --> 00:04:46,710 at GDB ay nagsasabi sa amin na ang mga kondisyon ng pagwawakas, lalo wala na mas mababa sa zero, 82 00:04:46,710 --> 00:04:48,010 ay execute ang susunod. 83 00:04:48,010 --> 00:04:50,230 Kung ito man ay nakakakuha ng kaunti nakalilito, 84 00:04:50,230 --> 00:04:54,860 maaari naming makuha ang source code GDB may listahan o utos ng l. 85 00:04:54,860 --> 00:04:56,880 Ito ng mga Kopya ang source code 86 00:04:56,880 --> 00:04:59,010 na nakasentro sa paligid ng linya na hindi namin kasalukuyang nasa. 87 00:04:59,010 --> 00:05:03,590 Kung namin type muli ang listahan o l, makikita namin makita ang susunod na hanay ng mga linya i-print. 88 00:05:03,590 --> 00:05:06,070 Maaari naming gawin ito hanggang sa aming pindutin ang dulo ng file. 89 00:05:06,070 --> 00:05:11,210 >> Upang makabalik sa kung saan namin, maaari naming matustusan ang listahan na may isang numero ng linya, 90 00:05:11,210 --> 00:05:14,120 sa kasong ito, ang linya 12. 91 00:05:14,120 --> 00:05:16,040 Pa Rin, sabihin ilipat sa. 92 00:05:16,040 --> 00:05:18,240 Ngayon kami sa 4 loop. 93 00:05:18,240 --> 00:05:21,490 Sabihin tiyakin na ang aming num variable ay naglalaman ng 4. 94 00:05:21,490 --> 00:05:26,170 Ginagawa namin ito sa print, o p, utos. 95 00:05:26,170 --> 00:05:31,140 Kaya, GDB nagsasabi sa amin na num katunayan sa pag-iimbak ng 4, namin inaasahan. 96 00:05:31,140 --> 00:05:35,180 Ang $ 1 GDB na mga Kopya out ay isang espesyal na variable GDB 97 00:05:35,180 --> 00:05:37,720 na ngayon ang naka-set-imbak ang bilang 4 pati na rin. 98 00:05:37,720 --> 00:05:42,240 Maaari mong huwag pansinin ang sa ngayon, ngunit ang mga GDB variable ay sa sobrang madaling gamiting 99 00:05:42,240 --> 00:05:46,380 sa higit pang advanced na mga kaso kapag gusto mong isipin kung ano ang nagawa mo na sa nakaraan. 100 00:05:46,380 --> 00:05:50,970 Pa rin, ang paglipat sa may susunod, makikita namin na sisimulan namin ang paglipat sa pamamagitan ng para sa loop. 101 00:05:50,970 --> 00:05:54,790 Natin ang patuloy na pagdaan dito may n bit sa pamamagitan ng bit. 102 00:05:54,790 --> 00:05:58,280 Sa halip na mag-type n bawat oras, maaari mo ring lamang pindutin ang enter. 103 00:05:58,280 --> 00:06:03,710 Kapag pinindot ninyo ang magpasok nang walang pag-type ng anumang, GDB lamang uulit sa nakaraang utos. 104 00:06:03,710 --> 00:06:05,910 Kaya ngayon kami pindutin ang printf tawag. 105 00:06:05,910 --> 00:06:09,520 Mukhang katunayan namin na nawala sa pamamagitan ng aming para sa loop 4 na beses, 106 00:06:09,520 --> 00:06:13,750 na kung ano ang gusto naming gawin upang multiply sa pamamagitan ng 1, 2, 3, at 4. 107 00:06:13,750 --> 00:06:15,870 >> Lahat ay tila tulad ng ito ay gumagana, 108 00:06:15,870 --> 00:06:19,680 maliban kung namin pindutin susunod muli namin makuha ang malaking bilang sa halip na 24. 109 00:06:19,680 --> 00:06:23,100 Kung-print namin ang halaga ng factorial gamit p, 110 00:06:23,100 --> 00:06:26,120 nakikita namin na factorial ay ang napakalaking numero sa. 111 00:06:26,120 --> 00:06:28,740 Isang bagay ang tiyak pagpunta mali. 112 00:06:28,740 --> 00:06:31,960 Sa puntong ito, bagaman, kami ay halos sa dulo ng programa, 113 00:06:31,960 --> 00:06:34,610 at huli upang ayusin ang anumang bagay. 114 00:06:34,610 --> 00:06:39,750 >> Gayunpaman, maaari naming i-restart ang program sa pamamagitan ng pag-type ng r muli at pagkatapos y upang kumpirmahin. 115 00:06:39,750 --> 00:06:43,460 Ngayon ay hindi namin pabalik sa aming breakpoint sa simula ng pangunahing. 116 00:06:43,460 --> 00:06:46,600 Alam namin na ang lahat ay mukhang fine sa pagbabasa sa n. 117 00:06:46,600 --> 00:06:48,630 upang maaari naming tumalon magpatuloy sa n. 118 00:06:48,630 --> 00:06:52,280 Bilang kahalili, maaari kaming magtakda ng isang bagong breakpoint matapos ang gawin habang loop 119 00:06:52,280 --> 00:06:54,910 at tumalon doon. Natin gawin iyon. 120 00:06:54,910 --> 00:06:59,080 Mukhang linya 14 ay pagkatapos ng loop. 121 00:06:59,080 --> 00:07:01,070 Natin itakda ang isang breakpoint doon. 122 00:07:01,070 --> 00:07:05,220 Ito ay mahusay na kasanayan upang tukuyin ang pangalan ng file sa command na ito ng breakpoint 123 00:07:05,220 --> 00:07:08,480 dahil GDB maaaring makapag-lito kung nagtatrabaho ka na may maramihang mga file. 124 00:07:08,480 --> 00:07:13,230 Upang ilipat magpatuloy na ito breakpoint, gagamitin namin magpatuloy o c utos. 125 00:07:13,230 --> 00:07:16,570 >> Okay, dito ay namin sa para sa loop. 126 00:07:16,570 --> 00:07:19,060 Hana 1 pang linya sa para sa loop, 127 00:07:19,060 --> 00:07:21,630 at pagkatapos ay sisimulan namin ang mga variable ng pag-print upang makita kung ano ang nangyayari sa. 128 00:07:21,630 --> 00:07:26,410 Tiyakin nating na i ay sa katunayan 1, tulad ng inaasahan. 129 00:07:26,410 --> 00:07:28,300 Yup, na lahat ng magandang. 130 00:07:28,300 --> 00:07:30,270 Ano ang tungkol sa factorial bagaman? 131 00:07:30,270 --> 00:07:33,760 Whoa, na hindi magandang. 132 00:07:33,760 --> 00:07:35,800 Mayroon kaming isang malaking bilang ng mga negatibong dito. 133 00:07:35,800 --> 00:07:38,190 How'd na mangyayari? 134 00:07:38,190 --> 00:07:40,040 Well, kung tiningnan namin pabalik sa code, 135 00:07:40,040 --> 00:07:44,800 nakita namin na hindi namin nasimulan ito, kaya kami nakakuha ng basura doon. 136 00:07:44,800 --> 00:07:46,820 Na ay talagang magtapon-off ang aming mga kalkulasyon. 137 00:07:46,820 --> 00:07:49,930 >> Kabutihang palad, hindi namin na mag-iwan ng GDB upang ayusin ito. 138 00:07:49,930 --> 00:07:54,590 Initialize namin ito dito at ayusin ang mga ito sa code sa ibang pagkakataon gamit ang naka-print na utos. 139 00:07:54,590 --> 00:07:59,500 Initialize namin ito sa 1 dahil ang factorials ng zero at 1 parehong 1, 140 00:07:59,500 --> 00:08:03,940 at kung initialize namin ito sa zero, at pagkatapos ay nais naming laging magtapos na may mga zero ng aming resulta. 141 00:08:03,940 --> 00:08:08,370 Maaari mong itakda ang anumang mga variable na ito paraan, na kung saan ay sobrang madaling-gamiting. 142 00:08:08,370 --> 00:08:10,920 Ngayon, sabihin patuloy ang aming programa. 143 00:08:10,920 --> 00:08:14,040 Tiyakin nating ang lahat ng kung saan ito ay dapat na maging. 144 00:08:14,040 --> 00:08:19,090 Num dapat na 4, dapat i 1, at factorial ay dapat na 1 masyadong. 145 00:08:19,090 --> 00:08:23,990 Maaari naming shortcut ang prosesong ito at i-print ang lahat ng aming mga lokal na variable 146 00:08:23,990 --> 00:08:26,440 na may super-kapaki-pakinabang na utos ng lokal impormasyon, 147 00:08:26,440 --> 00:08:29,190 kung aling mga Kopya ang lahat ng aming in-saklaw lokal na variable. 148 00:08:29,190 --> 00:08:31,980 Pa Rin, mukhang lahat ng bagay handa na upang patakbuhin. 149 00:08:31,980 --> 00:08:34,700 >> Natin gawin ang isa pang go-sa paligid ng loop lang masiguradong. 150 00:08:34,700 --> 00:08:38,789 Okay, lahat mukhang mahusay. 151 00:08:38,789 --> 00:08:41,659 Ngayon ay maaari naming gamitin ang Magpatuloy command upang pumunta sa dulo. 152 00:08:41,659 --> 00:08:46,170 Magaling! 4 factorial print 24 tulad ng inaasahan. 153 00:08:46,170 --> 00:08:48,690 Ngayon ay maaari naming pumunta ayusin ito sa aming code. 154 00:08:48,690 --> 00:08:53,710 Sa halip na mag-quit ng GDB, gagamitin namin ang isa pang terminal na tab upang gawin ito. 155 00:08:53,710 --> 00:08:58,080 Pagpunta pabalik sa aming GDB tab, kailangan namin ngayon upang mag-recompile ang aming executable. 156 00:08:58,080 --> 00:09:03,180 Isa ng pinakamahusay na mga bagay tungkol sa GDB ay na hindi mo kailangang mag-iwan ng GDB upang mapatakbo ang gumawa. 157 00:09:03,180 --> 00:09:06,570 Kaya na hindi namin panatilihin ang pagpindot sa mga lumang breakpoints, 158 00:09:06,570 --> 00:09:10,440 sabihin paganahin ang mga ito kasama ang, nahulaan mo, huwag paganahin ang command. 159 00:09:10,440 --> 00:09:13,320 Hindi nito papaganahin ang lahat ng aming breakpoints. 160 00:09:13,320 --> 00:09:18,180 Ngayon, maaari naming i-restart ang program na may r at tiyakin na ang lahat okay lang. 161 00:09:18,180 --> 00:09:21,300 Mukhang ang lahat ng bagay handa na upang patakbuhin. 162 00:09:21,300 --> 00:09:24,410 Factorial ng 4 print out 24, tulad ng naisip namin. 163 00:09:24,410 --> 00:09:28,830 GDB ay isa ng ang pinaka-kapaki-pakinabang na tool na mayroon ka sa iyong toolbox. 164 00:09:28,830 --> 00:09:31,970 >> May isang tonelada higit pang mga bagay na maaari mong gawin sa GDB, 165 00:09:31,970 --> 00:09:34,030 malayo higit pa kaysa sa maaari mong gawin sa simpleng Printout. 166 00:09:34,030 --> 00:09:36,730 Susunod na pagkakataon na ang iyong programa ay hindi ginagawa kung ano ang gusto mo, 167 00:09:36,730 --> 00:09:39,740 subukan ang pagpapatakbo ng GDB upang malaman kung ano ang nangyayari sa loob. 168 00:09:39,740 --> 00:09:44,380 Gamit ng kaunting kasanayan, magagawa mong mag-drill down sa iyong bug ay hindi sa anumang oras. 169 00:09:44,380 --> 00:09:48,180 Ang pangalan ko ay Nate Hardison. Ito ay CS50.