1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Lahat ng karapatan GDB. 3 00:00:06,830 --> 00:00:08,480 Ano ang eksaktong ito? 4 00:00:08,480 --> 00:00:11,310 Kaya GDB, na ang ibig sabihin para sa GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 ay isang tunay na kahanga-hangang tool na maaari naming gamitin upang matulungan kaming i-debug ang aming programa, 6 00:00:15,040 --> 00:00:18,210 o malaman kung saan ang mga bagay ay pagpunta mali sa aming programa. 7 00:00:18,210 --> 00:00:22,590 GDB ay amazingly malakas na, ngunit ang output at pakikipag-ugnayan sa mga ito 8 00:00:22,590 --> 00:00:23,830 ay maaaring maging isang maliit na piraso cryptic. 9 00:00:23,830 --> 00:00:28,210 Ito ay karaniwang isang tool command line, at maaari itong itapon ang isang pulutong ng mga mensahe sa iyo. 10 00:00:28,210 --> 00:00:31,144 At ito ay maaaring uri ng mahirap na parse ang eksaktong kung ano ang nangyayari sa. 11 00:00:31,144 --> 00:00:33,560 Sa kabutihang palad, nagsagawa kami ng mga hakbang upang ayusin ang problemang ito para sa iyo 12 00:00:33,560 --> 00:00:36,281 habang nagtatrabaho ka sa pamamagitan ng CS50. 13 00:00:36,281 --> 00:00:39,030 Kung ikaw ay hindi gumagamit ng mga graphical debugger, na aking kasamahan Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse sinalita ng lubos ng kaunti tungkol sa isang video na 15 00:00:41,570 --> 00:00:44,740 ay dapat na higit dito sa ngayon, na maaaring kailangan mo 16 00:00:44,740 --> 00:00:48,270 na gamitin ang mga command line tool upang gumana sa GDB. 17 00:00:48,270 --> 00:00:51,250 Kung ikaw ay nagtatrabaho sa CS50 IDE, hindi mo na kailangan na gawin ito. 18 00:00:51,250 --> 00:00:53,550 Ngunit kung ikaw ay hindi nagtatrabaho sa CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 marahil gamit ang isang bersyon ng CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 o sa iba pang Linux operating system na may GDB-install sa mga ito, 21 00:00:58,860 --> 00:01:00,980 maaaring kailangan mong gamitin ang mga kasangkapan sa command line. 22 00:01:00,980 --> 00:01:02,860 >> At dahil maaari ka kailangang gawin iyan, 23 00:01:02,860 --> 00:01:06,280 kapaki-pakinabang upang maunawaan kung paano lamang GDB gumagana mula sa linya ng command. 24 00:01:06,280 --> 00:01:09,650 Ngunit muli, kung ikaw ay gamit ang CS50 IDE, ikaw 25 00:01:09,650 --> 00:01:15,400 maaaring gamitin ang mga graphical debugger na ay binuo sa mga IDE. 26 00:01:15,400 --> 00:01:18,750 Kaya upang makakuha ng mga bagay na nangyayari sa GDB, upang simulan ang pag-debug 27 00:01:18,750 --> 00:01:21,220 proseso ng isang partikular na programa, kailangan lahat ng gagawin mo 28 00:01:21,220 --> 00:01:23,810 ay i-type sinundan GDB sa pamamagitan ng pangalan ng programa. 29 00:01:23,810 --> 00:01:28,620 Kaya halimbawa, kung ang iyong programa ay hello, gusto mo type GDB hello. 30 00:01:28,620 --> 00:01:31,210 >> Kapag ginawa mo na, ikaw ay pagpunta upang hilahin pataas ang GDB kapaligiran. 31 00:01:31,210 --> 00:01:33,800 Ang iyong prompt ay magbabago, at sa halip ng pagiging kung ano ito ay karaniwang 32 00:01:33,800 --> 00:01:35,841 ay kapag nag-type ka ng mga bagay sa utos line-- ls, 33 00:01:35,841 --> 00:01:38,115 cd-- lahat ng iyong mga tipikal Linux command, ang iyong prompt 34 00:01:38,115 --> 00:01:42,200 ay magbabago sa, marahil, ang isang bagay tulad ng mga panaklong GDB panaklong. 35 00:01:42,200 --> 00:01:46,630 Iyan na ang iyong bagong GDB prompt, dahil ikaw ay nasa loob ng GDB kapaligiran. 36 00:01:46,630 --> 00:01:49,830 Kapag sa loob ng na kapaligiran, mayroong dalawang pangunahing utos 37 00:01:49,830 --> 00:01:52,290 na ikaw ay malamang na gamitin ang sa mga sumusunod na order. 38 00:01:52,290 --> 00:01:55,200 >> Ang una ay b, na kung saan ay maikli para sa break. 39 00:01:55,200 --> 00:01:58,690 At pagkatapos mong i-type b, karaniwan kang type ang pangalan ng isang function, 40 00:01:58,690 --> 00:02:01,040 o kung mangyari mong malaman sa paligid ng kung ano ang line number 41 00:02:01,040 --> 00:02:04,100 ang iyong programa ay nagsisimula kumikilos ang isang maliit na kakaiba, 42 00:02:04,100 --> 00:02:06,370 Maaari mong i-type ang isang linya number doon rin. 43 00:02:06,370 --> 00:02:09,660 Ano b, o break, ginagawa ay nagbibigay-daan ito sa iyong programa 44 00:02:09,660 --> 00:02:13,270 upang magpatakbo ng hanggang sa isang tiyak na punto, sa makatuwid baga'y ang pangalan ng function 45 00:02:13,270 --> 00:02:15,880 na tinukoy mo o ang linya number na iyong tinukoy. 46 00:02:15,880 --> 00:02:18,590 >> At sa puntong iyon, ito i-freeze ang pagpapatupad. 47 00:02:18,590 --> 00:02:21,670 Ito ay isang talagang magandang bagay, dahil minsan sa pagpapatupad ay frozen, 48 00:02:21,670 --> 00:02:25,214 maaari kang magsimula sa masyadong mabagal magbasa-basa sa inyong programa. 49 00:02:25,214 --> 00:02:28,130 Karaniwan, kung kayo ay tumatakbo iyong mga programa, ang mga ito ay medyo maikli. 50 00:02:28,130 --> 00:02:31,250 Karaniwan, nagta-type ka dot slash ano man ang pangalan ng iyong programa ay, pindutin ang Enter, 51 00:02:31,250 --> 00:02:33,470 at bago ka makakapag-blink, ang iyong programa ay naka-tapos na. 52 00:02:33,470 --> 00:02:36,620 Ito ay hindi tunay na isang pulutong ng mga oras upang subukan at malaman kung ano ang pagpunta mali. 53 00:02:36,620 --> 00:02:40,920 Kaya ito ay talagang para ma-mabagal bagay down sa pamamagitan ng pagtatakda ng isang break point na may b, 54 00:02:40,920 --> 00:02:43,040 at pagkatapos ay kumikilos. 55 00:02:43,040 --> 00:02:46,169 >> Pagkatapos ay sa sandaling naitakda mo na ang iyong mga break point, maaari mong patakbuhin ang program. 56 00:02:46,169 --> 00:02:47,960 At kung mayroon kang anumang mga argumento command line, 57 00:02:47,960 --> 00:02:51,610 na tinukoy mo ang mga ito dito, hindi kapag nagta-type ka GDB ang iyong pangalan ng program. 58 00:02:51,610 --> 00:02:55,980 Tukuyin mo ang lahat ng mga linya ng command argumento sa pamamagitan ng pagkuha r, o tumakbo, 59 00:02:55,980 --> 00:03:00,270 at pagkatapos ay kahit anong command line argument kailangan mo sa loob ng iyong programa. 60 00:03:00,270 --> 00:03:03,510 Mayroong isang bilang ng iba pang mga tunay na mahalaga at kapaki-pakinabang na mga utos 61 00:03:03,510 --> 00:03:04,970 sa loob ng kapaligiran ng GDP. 62 00:03:04,970 --> 00:03:07,540 Kaya ipaalam sa akin mabilis lang balikan ang ilan sa mga ito. 63 00:03:07,540 --> 00:03:11,320 >> Ang una ay n, na kung saan ay maikli para sa susunod, at maaari mong i-type susunod na sa halip ng n, 64 00:03:11,320 --> 00:03:12,304 parehong gumagana. 65 00:03:12,304 --> 00:03:13,470 At ito lang ang shorthand. 66 00:03:13,470 --> 00:03:17,540 At habang ikaw ay marahil mo na tapat na paraan ginagamit sa, kawalan ng kakayahang mag-type ng mga bagay 67 00:03:17,540 --> 00:03:20,520 mas maikli ay karaniwang mas mahusay. 68 00:03:20,520 --> 00:03:24,100 At kung ano ang gagawin nito ay ito makikita humakbang pasulong isang bloke ng code. 69 00:03:24,100 --> 00:03:26,170 Kaya ito ay sumulong hanggang ang isang function ng tawag. 70 00:03:26,170 --> 00:03:28,350 At pagkatapos ay sa halip ng diving sa na function na 71 00:03:28,350 --> 00:03:33,130 at pagpunta sa pamamagitan ng lahat ng na pag-andar code, ito lang ay ang function. 72 00:03:33,130 --> 00:03:34,400 >> Ang function na ay tinatawag na. 73 00:03:34,400 --> 00:03:35,733 Ito ay gawin ang anumang trabaho nito ay. 74 00:03:35,733 --> 00:03:38,870 Ito ay bumalik ng isang halaga sa ang function na tinatawag na ito. 75 00:03:38,870 --> 00:03:42,490 At pagkatapos ay makikita mo ilipat sa sa susunod na linya ng na function na pagtawag. 76 00:03:42,490 --> 00:03:44,555 Kung gusto mo sa hakbang sa loob ng function, 77 00:03:44,555 --> 00:03:46,430 sa halip ng pagkakaroon lamang ito execute, lalo na 78 00:03:46,430 --> 00:03:50,004 kung sa tingin mo na ang problema maaaring kasinungalingan sa loob ng na function, 79 00:03:50,004 --> 00:03:52,670 maaari mong, siyempre, i-set ng isang break point sa loob ng na function. 80 00:03:52,670 --> 00:03:57,820 O kung ikaw ay nagpapatakbo, maaari mong gamitin s sa hakbang pasulong sa isang linya ng code. 81 00:03:57,820 --> 00:04:01,170 >> Kaya ito ay hakbang sa at sumisid sa pag-andar, 82 00:04:01,170 --> 00:04:04,750 sa halip ng na lang ay ang maipatupad at patuloy sa sa pag-andar 83 00:04:04,750 --> 00:04:07,380 na ikaw ay para sa pag-debug. 84 00:04:07,380 --> 00:04:09,870 Kung gusto mo mang malaman sa halaga ng isang variable, 85 00:04:09,870 --> 00:04:12,507 Maaari mong i-type p, o I-print, at pagkatapos ay ang pangalan ng variable. 86 00:04:12,507 --> 00:04:15,090 At iyon ay i-print out sa inyo, sa loob ng GDB kapaligiran, 87 00:04:15,090 --> 00:04:19,110 ang pangalan ng variable, na you-- excuse me-- ang halaga ng variable 88 00:04:19,110 --> 00:04:20,064 na iyong na may pangalang. 89 00:04:20,064 --> 00:04:23,230 Kung nais mong malaman ang mga halaga ng bawat lokal na variable access mula sa kung saan 90 00:04:23,230 --> 00:04:25,970 kayo ay kasalukuyang nasa iyong programa, maaari mong i-type lokal na impormasyon. 91 00:04:25,970 --> 00:04:28,332 Ito ay isang pulutong ng mas mabilis kaysa pag-type p at pagkatapos ay kahit na ano, 92 00:04:28,332 --> 00:04:30,540 listahan ng lahat ng variable na alam mo umiiral. 93 00:04:30,540 --> 00:04:34,370 Maaari ninyong ilagay ang mga lokal na impormasyon, at ito ay i-print out ang lahat ng bagay para sa iyo. 94 00:04:34,370 --> 00:04:37,770 Susunod ay bt, na kung saan ay maikli para sa Back bakas. 95 00:04:37,770 --> 00:04:41,680 Ngayon, sa pangkalahatan, lalo na sa unang bahagi ng CS50, 96 00:04:41,680 --> 00:04:44,450 Hindi mo ba talagang ay magkakaroon ng pagkakataon gamitin bt, o Back bakas, 97 00:04:44,450 --> 00:04:47,860 dahil hindi nagkakaroon ka ng mga pag-andar na tumawag sa iba pang mga pag-andar. 98 00:04:47,860 --> 00:04:50,450 >> Maaari mong magkaroon ng pangunahing ng isang tawag function, ngunit iyan ay marahil ito. 99 00:04:50,450 --> 00:04:53,199 Wala kang na ang ibang mga function pagtawag sa ibang function, kung saan 100 00:04:53,199 --> 00:04:54,880 tawag sa isa pang pag-andar, at iba pa. 101 00:04:54,880 --> 00:04:57,550 Ngunit bilang makakuha ng mas maraming ng iyong mga programa mahirap unawain, at lalo 102 00:04:57,550 --> 00:05:00,290 kapag nagsimula ka nang magtrabaho may recursion, pabalik trace 103 00:05:00,290 --> 00:05:05,150 ay maaaring maging isang talagang kapaki-pakinabang na paraan upang ipaalam sa iyo uri ng makakuha ng ilang mga konteksto para sa kung saan 104 00:05:05,150 --> 00:05:06,460 Kasama ko sa aking programa. 105 00:05:06,460 --> 00:05:10,590 Kaya sabihin mo na nakasulat ang iyong code, at alam mo na ang mga pangunahing tawag sa isang function 106 00:05:10,590 --> 00:05:14,720 f, na tawag ng isang function g, na tawag ng isang function h. 107 00:05:14,720 --> 00:05:17,650 Kaya kami ay may ilang mga layer ng pugad ng pagpunta sa dito. 108 00:05:17,650 --> 00:05:19,440 >> Kung ikaw ay sa loob ng iyong GDB kapaligiran, 109 00:05:19,440 --> 00:05:21,640 at alam mo ang iyong loob ng h, ngunit nakalimutan mo 110 00:05:21,640 --> 00:05:27,210 tungkol sa kung ano ang nakuha mo sa kung saan mo are-- maaari mong i-type bt, o trace back, 111 00:05:27,210 --> 00:05:32,370 at ito ay i-print out h, g, f main, sa tabi ng ilang mga iba pang impormasyon, na 112 00:05:32,370 --> 00:05:35,984 nagbibigay sa iyo ng isang palatandaan na, OK main tinatawag na f, f tinatawag g, g tinatawag na h, 113 00:05:35,984 --> 00:05:37,900 at na kung saan ako kasalukuyang am sa aking programa. 114 00:05:37,900 --> 00:05:41,380 Kaya ito ay talagang kapaki-pakinabang, lalo na bilang ng misteryosong-Ness ng GDB 115 00:05:41,380 --> 00:05:45,667 nagiging isang maliit na napakalaki, upang alamin kung saan ang mga bagay ay. 116 00:05:45,667 --> 00:05:48,500 Panghuli, kapag ang iyong programa ay tapos na, o kapag tapos ka na sa pag-debug ito 117 00:05:48,500 --> 00:05:50,125 at gusto mo sa hakbang ang layo mula sa GDB kapaligiran, 118 00:05:50,125 --> 00:05:51,940 makakatulong ito upang malaman kung paano makakuha ng out ng mga ito. 119 00:05:51,940 --> 00:05:55,500 Maaari kang mag-type q, o tumigil, upang makakuha ng out. 120 00:05:55,500 --> 00:05:59,220 Ngayon, bago video ngayong araw Inihahanda ko ang isang programa sa maraming surot 121 00:05:59,220 --> 00:06:03,900 tinatawag buggy1, na aking naipon mula sa isang file na kilala bilang buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Bilang maaari mong asahan, ito programa ay sa katunayan maraming surot. 123 00:06:06,500 --> 00:06:08,990 Isang bagay na napupunta mali kapag sinusubukan kong at patakbuhin ito. 124 00:06:08,990 --> 00:06:13,014 Ngayon, sa kasamaang palad, hindi ko sinasadyang tinanggal ang aking buggy1.c file, 125 00:06:13,014 --> 00:06:15,930 kaya sa order para sa akin upang malaman kung kung ano ang nangyayari mali sa programang ito, 126 00:06:15,930 --> 00:06:18,770 Pupunta ako sa may upang gamitin ang GDB uri ng walang taros, sinusubukan 127 00:06:18,770 --> 00:06:22,372 upang mag-navigate sa pamamagitan ng programang ito sa malaman kung ano mismo ang pagpunta mali. 128 00:06:22,372 --> 00:06:24,580 Ngunit gamit lamang ang mga tool na aming natutunan tungkol sa, 129 00:06:24,580 --> 00:06:27,700 Maaari naming medyo marami figure kung ano mismo ang ito ay. 130 00:06:27,700 --> 00:06:30,740 Kaya ng tumuloy sa ipaalam CS50 IDE at may hitsura. 131 00:06:30,740 --> 00:06:33,155 OK, kaya kami dito sa aking CS50 IDE kapaligiran, 132 00:06:33,155 --> 00:06:35,697 at kukunin ko na mag-zoom in sa isang maliit na piraso upang maaari mong makita ang isang maliit na higit pa. 133 00:06:35,697 --> 00:06:38,530 Sa aking terminal na window, kung ako listahan ang mga nilalaman ng aking kasalukuyang director 134 00:06:38,530 --> 00:06:41,250 may ls, makikita namin makita na ako magkaroon ng isang pares ng mga mapagkukunan ng mga file 135 00:06:41,250 --> 00:06:44,982 dito, kabilang ang dati tinalakay buggy1. 136 00:06:44,982 --> 00:06:46,940 Ano ang eksaktong napupunta sa kapag Subukan ko at tumakbo buggy1. 137 00:06:46,940 --> 00:06:47,773 Ng malaman rin ipaalam. 138 00:06:47,773 --> 00:06:52,510 Nagta-type ako tuldok slash, maraming surot, at ako pindutin ang Enter. 139 00:06:52,510 --> 00:06:53,670 >> Segmentation pagkakamali. 140 00:06:53,670 --> 00:06:55,000 Iyan ay hindi mabuti. 141 00:06:55,000 --> 00:06:57,180 Kung isipin mo, isang segmentation fault karaniwang 142 00:06:57,180 --> 00:07:01,540 nangyayari kapag namin ma-access memory na hindi namin pinapayagan sa pagpindot. 143 00:07:01,540 --> 00:07:03,820 Kahit papaano naabot na namin ang sa labas ng hangganan 144 00:07:03,820 --> 00:07:05,995 ng kung ano ang mga programa, ang mga tagatala, ay nagbigay sa amin. 145 00:07:05,995 --> 00:07:08,310 At kaya na iyon ang isang bakas na panatilihin sa Toolbox 146 00:07:08,310 --> 00:07:10,660 habang sinisimulan namin ang proseso ng pag-debug. 147 00:07:10,660 --> 00:07:13,620 Mayroong nangyaring hindi isang maliit na mali dito. 148 00:07:13,620 --> 00:07:15,935 >> Lahat ng karapatan, kaya sabihin start up ang GDB kapaligiran 149 00:07:15,935 --> 00:07:19,030 at tingnan kung maaari naming malaman kung ano ang eksaktong ang problema ay. 150 00:07:19,030 --> 00:07:21,674 Pupunta ako upang i-clear ang aking screen, at pupuntahan ko upang i-type GDB 151 00:07:21,674 --> 00:07:24,340 muli, upang ipasok ang GDB kapaligiran, at ang pangalan ng programa 152 00:07:24,340 --> 00:07:27,450 na gusto kong i-debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Kumuha kami ng isang maliit na mensahe, pagbabasa simbolo mula buggy1, tapos na. 154 00:07:30,182 --> 00:07:32,390 Lahat ay nangangahulugan na ito ay nakuha sa sama ang lahat ng mga code, 155 00:07:32,390 --> 00:07:35,570 at ngayon itong ma-load sa GDB, at ito ay handa na upang patakbuhin. 156 00:07:35,570 --> 00:07:37,140 >> Ngayon, ano ang gusto kong gawin? 157 00:07:37,140 --> 00:07:39,130 Natatandaan mo pa ba kung ano ang mga unang hakbang ay karaniwang ay 158 00:07:39,130 --> 00:07:42,540 kapag ako'y loob ng environment na ito? 159 00:07:42,540 --> 00:07:44,540 Sana, sinabi mo i-set ng pahinga point, dahil 160 00:07:44,540 --> 00:07:46,240 sa katunayan na ito ay kung ano ang gusto kong gawin. 161 00:07:46,240 --> 00:07:47,990 Ngayon, hindi ko na kailangang ang source code para sa mga ito 162 00:07:47,990 --> 00:07:50,948 sa harap ko, na kung saan ay marahil hindi ang tipikal na kaso ng paggamit, sa pamamagitan ng ang paraan. 163 00:07:50,948 --> 00:07:52,055 Ikaw ay malamang. 164 00:07:52,055 --> 00:07:52,680 Kaya na mabuti. 165 00:07:52,680 --> 00:07:55,790 Ngunit sa pag-aakala na hindi mo, kung ano ang ang isang function na alam mo 166 00:07:55,790 --> 00:07:58,880 umiiral sa bawat solong programa C? 167 00:07:58,880 --> 00:08:04,420 Hindi mahalaga kung paano malaki o kung paano kumplikado ito ay, tiyak na ito ay umiiral na function. 168 00:08:04,420 --> 00:08:05,440 Main, di ba? 169 00:08:05,440 --> 00:08:08,870 >> Kaya hindi pagtupad sa lahat ng iba pa, maaari naming magtakda ng isang break point sa main. 170 00:08:08,870 --> 00:08:12,200 At muli, maaari lamang i-type ako masira pangunahing, sa halip ng b. 171 00:08:12,200 --> 00:08:14,650 At kung gusto mong malaman, kung ikaw kailanman-type ang isang mahabang utos 172 00:08:14,650 --> 00:08:16,800 at pagkatapos ay mapagtanto na kayo nai-type sa maling bagay, 173 00:08:16,800 --> 00:08:18,770 at nais mong makakuha ng alisan ng lahat bilang ko lang ginawa, 174 00:08:18,770 --> 00:08:22,029 maaari kang kumuha ng Control U, na kung saan ay tanggalin ang lahat ng bagay at dalhin mo sa likod 175 00:08:22,029 --> 00:08:23,570 sa simula ng cursor mga linya. 176 00:08:23,570 --> 00:08:26,569 Ang isang pulutong ng mas mabilis kaysa lamang hold down ang tanggalin, o sa pagpindot ito ng isang beses na bungkos 177 00:08:26,569 --> 00:08:27,080 over. 178 00:08:27,080 --> 00:08:28,740 >> Kaya makikita namin magtakda ng isang break point sa main. 179 00:08:28,740 --> 00:08:32,970 At tulad ng makikita mo, sinasabi nito na namin magtakda ng isang punto ng pahinga sa file buggy1.c, 180 00:08:32,970 --> 00:08:36,330 at tila ang unang linya ng code ng main ay pitong linya. 181 00:08:36,330 --> 00:08:38,080 Muli, wala tayong ang source file dito, 182 00:08:38,080 --> 00:08:40,429 ngunit kailangan ko ipinapalagay na ito ay na nagsasabi sa akin ang katotohanan. 183 00:08:40,429 --> 00:08:44,510 At pagkatapos, ako lamang sinusubukan at patakbuhin ang programa, r. 184 00:08:44,510 --> 00:08:45,360 Simula ng program. 185 00:08:45,360 --> 00:08:48,160 Lahat ng karapatan, kaya ang mensaheng ito ay isang maliit na misteriyoso. 186 00:08:48,160 --> 00:08:50,160 Pero talaga kung ano ang nangyayari dito ay ito lamang 187 00:08:50,160 --> 00:08:53,350 na nagsasabi sa akin hit ko na ang aking pahinga point, break point number 1. 188 00:08:53,350 --> 00:08:55,877 >> At pagkatapos ay, na ang linya ng code, walang ganitong file o direktoryo. 189 00:08:55,877 --> 00:08:57,710 Ang tanging dahilan na Nakakakita ako ng mensahe na 190 00:08:57,710 --> 00:09:00,800 ay dahil hindi ko sinasadyang tinanggal ang aking buggy.c file. 191 00:09:00,800 --> 00:09:04,050 Kung umiiral ang aking buggy1.c file sa kasalukuyang direktoryo, 192 00:09:04,050 --> 00:09:06,920 na line doon ay aktwal na sabihin sa akin kung ano ang linya ng code 193 00:09:06,920 --> 00:09:08,214 literal bumabasa. 194 00:09:08,214 --> 00:09:09,380 Sa kasamaang palad, tinanggal ko ito. 195 00:09:09,380 --> 00:09:14,790 Kami ay pagpunta sa may sa uri ng mag-navigate sa pamamagitan ng isang maliit na ito ng mas maraming walang taros. 196 00:09:14,790 --> 00:09:17,330 >> OK, ang makita kaya hayaan, kung ano ang gusto kong gawin dito? 197 00:09:17,330 --> 00:09:21,770 Well, Gusto kong malaman kung ano ang mga lokal na variable siguro ay makukuha sa akin. 198 00:09:21,770 --> 00:09:23,570 Sinimulan ko na ang aking programa. 199 00:09:23,570 --> 00:09:28,515 Tingnan natin kung ano ang maaaring maging Ipaalam nasimulan nang dahil sa atin. 200 00:09:28,515 --> 00:09:31,430 Nagta-type ako naninirahan ang Info, walang mga lokal. 201 00:09:31,430 --> 00:09:33,960 Lahat ng mga karapatan, sa gayon ay hindi bigyan ako ng isang tonelada ng mga impormasyon. 202 00:09:33,960 --> 00:09:37,600 Kaya kong subukan at i-print out ang isang variable, ngunit hindi ko alam ang anumang mga pangalan ng variable. 203 00:09:37,600 --> 00:09:39,930 Maaari ko bang subukan ang isang bakas sa likod, ngunit ako sa loob ng main, 204 00:09:39,930 --> 00:09:43,710 kaya alam ko na hindi ko ginawa ibang mga function ng tawag ngayon. 205 00:09:43,710 --> 00:09:47,710 >> Kaya ganito ang hitsura ng aking lamang na pagpipilian ay gamitin n o kaya at simulan sa sumisid in. 206 00:09:47,710 --> 00:09:49,630 Pupunta ako upang gamitin n. 207 00:09:49,630 --> 00:09:51,180 Kaya ko type n. 208 00:09:51,180 --> 00:09:53,060 Oh aking sus, kung ano ang nangyayari dito. 209 00:09:53,060 --> 00:09:56,260 Program natanggap signal, SIGSEGV segmentation fault, 210 00:09:56,260 --> 00:09:57,880 at pagkatapos ng buong bungkos ng mga bagay-bagay. 211 00:09:57,880 --> 00:09:58,880 Ako na bumagsak. 212 00:09:58,880 --> 00:10:00,980 Well, may tunay na isang pulutong na natutunan dito. 213 00:10:00,980 --> 00:10:02,520 Kaya kung ano ang ibig sabihin sa amin? 214 00:10:02,520 --> 00:10:09,180 Ano ito ay nagsasabi sa amin ay, ang program na ito ay tungkol sa, ngunit ay hindi pa, seg fault. 215 00:10:09,180 --> 00:10:12,550 At sa partikular, pupuntahan ko upang mag-zoom in kahit pa dito, 216 00:10:12,550 --> 00:10:18,980 ito ay tungkol sa seg fault tungkol isang bagay na tinatawag strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Ngayon, maaaring hindi namin napag-usapan mga function na ito nang husto. 218 00:10:22,705 --> 00:10:25,580 Ngunit ito is-- dahil hindi namin pagpunta makipag-usap tungkol sa bawat function na 219 00:10:25,580 --> 00:10:28,610 umiiral sa standard C library-- ngunit ang mga ito ay magagamit sa lahat ng sa iyo, 220 00:10:28,610 --> 00:10:32,110 lalo na kung ikaw ay kumuha ng isang tingnan reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 At strcmp ay isang talagang malakas function na ay umiiral sa loob 222 00:10:35,000 --> 00:10:38,070 ng string.h header file, na kung saan ay isang header 223 00:10:38,070 --> 00:10:41,970 file na ito ay nakatuon sa mga function na gumagana sa at paggamit ng mga string. 224 00:10:41,970 --> 00:10:49,830 >> At sa partikular, kung ano ang strcmp ay ay ikinukumpara ito sa mga halaga ng dalawang string. 225 00:10:49,830 --> 00:10:54,160 Kaya ako si segmentation fault sa isang tawag sa strcmp tila. 226 00:10:54,160 --> 00:10:58,530 Pindutin ko n, at sa katunayan na nakukuha ko ang mensahe, program tinapos sa SIGSEGV signal 227 00:10:58,530 --> 00:11:01,370 segmentation fault. At ngayon Ako ang tunay na may seg faulted, 228 00:11:01,370 --> 00:11:06,479 at ang aking mga programa ay may pretty marami mabisa ibinigay up. 229 00:11:06,479 --> 00:11:07,770 Ito ay ang dulo ng programa. 230 00:11:07,770 --> 00:11:10,370 Ito Nasira, nag-crash ito. 231 00:11:10,370 --> 00:11:14,740 Kaya ay hindi isang pulutong, ngunit ako talaga ay malaman ng lubos ng kaunti 232 00:11:14,740 --> 00:11:16,747 mula sa maliit na karanasan. 233 00:11:16,747 --> 00:11:17,580 Ano ang aking natutunan? 234 00:11:17,580 --> 00:11:22,020 Well, nag-crash ang aking programa medyo marami agad. 235 00:11:22,020 --> 00:11:26,300 Aking mga programa nag-crash sa isang call to strcmp, ngunit ako 236 00:11:26,300 --> 00:11:30,560 walang anumang lokal na mga variable sa aking programa sa oras na nag-crash ito. 237 00:11:30,560 --> 00:11:37,320 Kaya kung ano ang string, o mga string, kaya kong posibleng maging paghahambing. 238 00:11:37,320 --> 00:11:42,140 Kung hindi ko magkaroon ng anumang lokal na variable, maaari ka 239 00:11:42,140 --> 00:11:45,520 magpalagay na have-- ako doon siguro ay isang global variable, na maaaring maging totoo. 240 00:11:45,520 --> 00:11:47,670 >> Ngunit sa pangkalahatan, tila tulad ako ng paghahambing 241 00:11:47,670 --> 00:11:52,070 sa isang bagay na ay hindi umiiral. 242 00:11:52,070 --> 00:11:54,130 Kaya sabihin imbestigahan na ang isang maliit na karagdagang. 243 00:11:54,130 --> 00:11:55,120 Kaya ako pagpunta upang i-clear ang aking screen. 244 00:11:55,120 --> 00:11:57,536 Pupunta ako sa umalis sa labas ng GDB na kapaligiran para sa isang segundo. 245 00:11:57,536 --> 00:12:01,300 At ako ay nag-iisip, OK, kaya may walang lokal na mga variable sa aking programa. 246 00:12:01,300 --> 00:12:06,444 Siguro kung siguro ako dapat na ipasa ang sa isang string bilang isang argument command line. 247 00:12:06,444 --> 00:12:07,610 Kaya subukan lang ni this out ipaalam. 248 00:12:07,610 --> 00:12:09,020 Hindi ko pa tapos na ito bago. 249 00:12:09,020 --> 00:12:14,244 >> Tingnan natin kung siguro kung nagpatakbo ako ng programang ito may isang argument command line ito gumagana. 250 00:12:14,244 --> 00:12:16,140 Huh, walang segmentation fault doon. 251 00:12:16,140 --> 00:12:17,870 Sinabi lang sa akin na ang korte ito. 252 00:12:17,870 --> 00:12:19,170 Kaya marahil na ang fix dito. 253 00:12:19,170 --> 00:12:27,560 At sa katunayan, kung pumunta ako pabalik at tumingin sa ang aktwal na source code para sa buggy1.c, 254 00:12:27,560 --> 00:12:31,180 tila na parang ang ginagawa ko ay Ako sa paggawa ng isang tawag sa strcmp walang 255 00:12:31,180 --> 00:12:34,010 check kung sa katunayan argv [1] ay umiiral na. 256 00:12:34,010 --> 00:12:36,730 Ito ay talagang ang source code para buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Kaya kung ano ang tunay na kailangan upang gawin dito upang ayusin ang aking mga programa, 258 00:12:38,855 --> 00:12:40,835 ipagpapalagay na nakatanggap ako ng maghain sa harap ko, ay 259 00:12:40,835 --> 00:12:44,740 upang magdagdag lamang ng isang tseke upang gumawa ng siguraduhin na ang argc ay katumbas ng 2. 260 00:12:44,740 --> 00:12:47,780 Kaya halimbawa na ito, muli, tulad ng sinabi ko, Medyo contrived, di ba? 261 00:12:47,780 --> 00:12:49,840 Ikaw ay karaniwang ay hindi pagpunta sa sinasadyang tanggalin ang iyong source code 262 00:12:49,840 --> 00:12:51,820 at pagkatapos ay upang subukan ang at i-debug ang program. 263 00:12:51,820 --> 00:12:53,120 Ngunit sana, nagbigay ito ikaw ay isang paglalarawan ng halimbawa 264 00:12:53,120 --> 00:12:55,120 ng mga uri ng mga bagay-bagay na Maaaring ikaw ay nag-iisip tungkol 265 00:12:55,120 --> 00:12:56,610 bilang ka ng pag-debug ang iyong programa. 266 00:12:56,610 --> 00:12:58,760 >> Ano ang estado ng mga gawain dito? 267 00:12:58,760 --> 00:13:00,510 Ano variable gagawin ko Mayroon accessible sa akin? 268 00:13:00,510 --> 00:13:03,600 Saan eksakto ang aking programa pag-crash, sa kung ano ang line, 269 00:13:03,600 --> 00:13:05,240 sa kung ano ang tawag sa kung ano ang function? 270 00:13:05,240 --> 00:13:06,952 Anong uri ng mga pahiwatig ang na ibigay sa akin? 271 00:13:06,952 --> 00:13:08,910 At iyon mismo ang uri ng mindset na kayo 272 00:13:08,910 --> 00:13:12,820 dapat na pagkuha sa kapag ikaw ay nag-iisip tungkol sa pag-debug ang iyong programa. 273 00:13:12,820 --> 00:13:13,820 >> Ako Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ito ay CS50. 275 00:13:16,140 --> 00:15:08,642