1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [Nate Hardison, Harvard University] 3 00:00:05,000 --> 00:00:07,000 Ito ay CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Ang ilan ng ang pinaka-mahirap bug sa C programa 5 00:00:10,000 --> 00:00:13,000 darating mula sa masamang pamamahala ng memorya. 6 00:00:13,000 --> 00:00:15,000 Mayroong isang malaking bilang ng mga paraan sa magroskas ang mga bagay up, 7 00:00:15,000 --> 00:00:17,000 kabilang ang paglaan ng maling halaga ng memorya, 8 00:00:17,000 --> 00:00:20,000 forgetting upang simulan ang variable, 9 00:00:20,000 --> 00:00:23,000 nakasulat bago o pagkatapos ng dulo ng isang buffer, 10 00:00:23,000 --> 00:00:25,000 at pagbabakante panatilihin ang memorya maraming beses. 11 00:00:25,000 --> 00:00:28,000 Ang mga sintomas ay mula sa mga pasulput-sulpot na nag-crash 12 00:00:28,000 --> 00:00:30,000 sa mysteriously mapapatungan halaga, 13 00:00:30,000 --> 00:00:34,000 madalas sa lugar at oras na malayo inalis mula sa orihinal na error. 14 00:00:34,000 --> 00:00:37,000 Ang pagsunod sa naobserbahang problema pabalik sa ang kalakip na sanhi ng ugat 15 00:00:37,000 --> 00:00:39,000 maaaring hamon, 16 00:00:39,000 --> 00:00:42,000 ngunit masuwerte mayroong isang kapaki-pakinabang na programa na tinatawag na Valgrind 17 00:00:42,000 --> 00:00:44,000 na maaaring gawin ng maraming upang matulungan. 18 00:00:44,000 --> 00:00:47,000 >> Patakbuhin mo ang isang programa sa ilalim ng Valgrind upang paganahin 19 00:00:47,000 --> 00:00:50,000 malawak checking magbunton memory nakalaang at ina-access. 20 00:00:50,000 --> 00:00:53,000 Kapag nakita ng Valgrind isang problema, ay nagbibigay sa iyo ng agarang, 21 00:00:53,000 --> 00:00:56,000 direktang impormasyon na nagbibigay-daan sa iyo upang 22 00:00:56,000 --> 00:00:58,000 mas madaling mahanap at ayusin ang problema. 23 00:00:58,000 --> 00:01:01,000 Valgrind ding mga ulat sa mga mas mababa ang nakamamatay na mga isyu sa memory, 24 00:01:01,000 --> 00:01:04,000 tulad ng mga memory paglabas, paglaan ng magbunton memory, 25 00:01:04,000 --> 00:01:07,000 at forgetting magbakante ito. 26 00:01:07,000 --> 00:01:10,000 Gusto aming tagatala, kumalatong, sa aming debugger, GDB, 27 00:01:10,000 --> 00:01:14,000 Ang Valgrind ay libreng software, at ito ay naka-install sa appliance. 28 00:01:14,000 --> 00:01:16,000 Tumatakbo ang Valgrind sa iyong binary executable, 29 00:01:16,000 --> 00:01:20,000 hindi ang iyong. c o. h source code file, 30 00:01:20,000 --> 00:01:23,000 kaya siguraduhin na pinagsama-sama mo ang isang up-to-date na kopya ng iyong programa 31 00:01:23,000 --> 00:01:25,000 gamit kumalatong o Magsagawa. 32 00:01:25,000 --> 00:01:28,000 Pagkatapos, patakbuhin ang iyong mga programa sa ilalim Valgrind 33 00:01:28,000 --> 00:01:32,000 bilang simpleng bilang lamang prefixing ang standard na utos ng programa na may salita ang Valgrind, 34 00:01:32,000 --> 00:01:35,000 na nagsisimula hanggang Valgrind at nagpapatakbo ng programa sa loob nito. 35 00:01:35,000 --> 00:01:38,000 Kapag simula, ginagawa ng Valgrind ilang complex 36 00:01:38,000 --> 00:01:41,000 jiggering upang i-configure ang executable para sa mga tseke ng memory, 37 00:01:41,000 --> 00:01:44,000 sa gayon ay maaari itong tumagal ng isang bit upang makakuha ng up at pagpapatakbo. 38 00:01:44,000 --> 00:01:48,000 Ang programa ay isakatuparan normal, mas mabagal, 39 00:01:48,000 --> 00:01:52,000 at kapag natapos, Valgrind i-print ang isang buod ng paggamit ng memory nito. 40 00:01:52,000 --> 00:01:58,000 Kung lahat ng napupunta na rin, ito ay tumingin ng isang bagay tulad nito: 41 00:01:58,000 --> 00:02:01,000 Sa kasong ito,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 ay ang path sa programa Gusto kong patakbuhin. 43 00:02:04,000 --> 00:02:06,000 At habang ang isang ito ay hindi gumawa ng anumang mga argumento, 44 00:02:06,000 --> 00:02:09,000 kung ito ginawa gusto ko lang tak ito sa dulo ng command gaya ng dati. 45 00:02:09,000 --> 00:02:12,000 Malinis na programa lamang ulok maliit na programa ko nilikha 46 00:02:12,000 --> 00:02:15,000 na allocates ng puwang para sa isang bloke ng mga ints sa magbunton, 47 00:02:15,000 --> 00:02:19,000 ilagay ang ilang mga halaga sa loob ng mga ito, at frees ang buong block. 48 00:02:19,000 --> 00:02:23,000 Ito ay kung ano ang iyong pagbaril para sa, walang mga error at hindi paglabas. 49 00:02:23,000 --> 00:02:27,000 >> Ang isa pang mahalagang panukat ay ang kabuuang bilang ng mga bytes na inilalaan. 50 00:02:27,000 --> 00:02:32,000 Depende sa programa, kung ang iyong mga nakalaang sa megabytes o mas mataas, 51 00:02:32,000 --> 00:02:34,000 marahil ikaw ay gumagawa ng mali. 52 00:02:34,000 --> 00:02:37,000 Mo ay hindi kinakailangan sa pag-iimbak ng mga nauulit? 53 00:02:37,000 --> 00:02:40,000 Ginagamit mo ba ang magbunton imbakan, kapag ito ay mas mahusay na gamitin ang stack? 54 00:02:40,000 --> 00:02:43,000 Kaya, ang mga error sa memorya ay maaaring maging tunay na kasamaan. 55 00:02:43,000 --> 00:02:46,000 Mas pantao na mga maging sanhi ng mga kamangha-manghang-crash, 56 00:02:46,000 --> 00:02:49,000 ngunit kahit na pagkatapos maaari pa rin itong maging mahirap upang matukoy 57 00:02:49,000 --> 00:02:51,000 kung ano ang eksaktong humantong sa pag-crash. 58 00:02:51,000 --> 00:02:54,000 Mas insidiously, isang programa na may isang error sa memorya 59 00:02:54,000 --> 00:02:56,000 Maaari pa rin makatipon nang malinis 60 00:02:56,000 --> 00:02:58,000 at maaari pa ring tila upang gumana nang tama 61 00:02:58,000 --> 00:03:01,000 dahil iyong mga pinamamahalaang upang makakuha ng masuwerteng karamihan ng oras. 62 00:03:01,000 --> 00:03:04,000 Pagkatapos ng ilang mga "matagumpay na mga kinalabasan," 63 00:03:04,000 --> 00:03:07,000 maaari mong isipin na ang pag-crash ay isang parasitiko ng computer, 64 00:03:07,000 --> 00:03:10,000 ngunit ang computer ay hindi kailanman mali. 65 00:03:10,000 --> 00:03:13,000 >> Pagpapatakbo ng Valgrind ay maaaring makatulong sa iyo na subaybayan ang sanhi ng nakikita memory error 66 00:03:13,000 --> 00:03:18,000 pati na rin makita nagkukubli error hindi mo pa alam tungkol sa. 67 00:03:18,000 --> 00:03:22,000 Sa bawat oras na nakita ng Valgrind isang problema, mga Kopya ng impormasyon tungkol sa kung ano ang obserbahan. 68 00:03:22,000 --> 00:03:24,000 Medyo maikli at makahulugan ang bawat item ay - 69 00:03:24,000 --> 00:03:27,000 ang source linya ng pagtuturo ang nakakahamak na, ano ang isyu, 70 00:03:27,000 --> 00:03:30,000 at isang maliit na impormasyon tungkol sa memory kasangkot - 71 00:03:30,000 --> 00:03:34,000 ngunit madalas itong sapat na impormasyon upang idirekta ang iyong pansin sa tamang lugar. 72 00:03:34,000 --> 00:03:37,000 Narito ang isang halimbawa ng Valgrind na tumatakbo sa isang programang maraming surot 73 00:03:37,000 --> 00:03:40,000 na ang isang di-wastong read ng magbunton memory. 74 00:03:40,000 --> 00:03:49,000 Nakikita namin walang mga error o babala sa compilation. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, ang buod ng error sabi na may dalawang error - 76 00:03:53,000 --> 00:03:56,000 dalawang di-wastong bumabasa ng laki 4 - bytes, na. 77 00:03:56,000 --> 00:04:01,000 Parehong masamang bumabasa naganap sa pangunahing pag-andar ng invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 ang unang sa linya 16 at ang pangalawang sa linya 19. 79 00:04:04,000 --> 00:04:06,000 Tingnan natin sa code. 80 00:04:06,000 --> 00:04:11,000 Mukhang ang unang tawag sa printf sinusubukang upang basahin ang isang int lagpas sa pagtatapos ng aming bloke ng memorya. 81 00:04:11,000 --> 00:04:13,000 Kung titingnan namin pabalik sa ng output ng Valgrind, 82 00:04:13,000 --> 00:04:16,000 nakikita namin na ang Valgrind Sinabi sa amin ng eksakto na. 83 00:04:16,000 --> 00:04:19,000 Ang address na sinusubukan naming basahin nagsisimula 0 bytes 84 00:04:19,000 --> 00:04:22,000 lagpas sa pagtatapos ng mga bloke ng mga bytes ng 16 laki - 85 00:04:22,000 --> 00:04:25,000 apat na 32-bit ints na inilalaan namin. 86 00:04:25,000 --> 00:04:29,000 Iyon ay, ang address namin sinusubukang basahin ay nagsisimula sa dulo ng aming block, 87 00:04:29,000 --> 00:04:32,000 tulad ng nakikita namin sa aming masamang printf tawag. 88 00:04:32,000 --> 00:04:36,000 Ngayon, di-wasto bumabasa ay hindi maaaring mukhang tulad na malaki ng isang pakikitungo, 89 00:04:36,000 --> 00:04:39,000 ngunit kung gumagamit ka ng data na iyon upang kontrolin ang daloy ng iyong programa - 90 00:04:39,000 --> 00:04:42,000 halimbawa, bilang bahagi ng isang kung pahayag o loop - 91 00:04:42,000 --> 00:04:45,000 pagkatapos ay mga bagay na maaari tahimik na pumunta masamang. 92 00:04:45,000 --> 00:04:47,000 Panoorin kung paano ang maaari kong patakbuhin ang invalid_read programa 93 00:04:47,000 --> 00:04:50,000 at walang pambihira mangyayari. 94 00:04:50,000 --> 00:04:52,000 Nakakatakot, huh? 95 00:04:52,000 --> 00:04:56,000 >> Ngayon, tingnan natin sa ilang higit pang mga uri ng mga error na maaaring nakatagpo ka sa iyong code, 96 00:04:56,000 --> 00:04:59,000 at kami na makita kung gaano Valgrind nakita sa kanila. 97 00:04:59,000 --> 00:05:01,000 Lang namin nakita ang isang halimbawa ng isang invalid_read, 98 00:05:01,000 --> 00:05:04,000 kaya ngayon sabihin tingnan ng invalid_write. 99 00:05:04,000 --> 00:05:09,000 Muli, walang mga error o babala sa compilation. 100 00:05:09,000 --> 00:05:12,000 Okay, Valgrind sabi na may dalawang error sa programang ito - 101 00:05:12,000 --> 00:05:15,000 at invalid_write at isang invalid_read. 102 00:05:15,000 --> 00:05:18,000 Natin tingnan ang code na ito. 103 00:05:18,000 --> 00:05:21,000 Mukhang kami nakakuha ng isang halimbawa ng klasikong strlen plus isang bug. 104 00:05:21,000 --> 00:05:24,000 Ang code ay hindi malloc ng dagdag na byte ng puwang 105 00:05:24,000 --> 00:05:26,000 para sa / 0 karakter, 106 00:05:26,000 --> 00:05:30,000 kaya kapag ang kopya STR nagpunta upang isulat ang mga ito sa ssubstrlen "cs50 bato!" 107 00:05:30,000 --> 00:05:33,000 sinulat ni ito ng 1 byte nakaraan ang dulo ng aming block. 108 00:05:33,000 --> 00:05:36,000 Invalid_read Ang na ito ay kapag ang aming tawag sa printf. 109 00:05:36,000 --> 00:05:40,000 Printf nagtatapos sa pagbabasa ng di-wastong memory kapag bumabasa ng / 0 character 110 00:05:40,000 --> 00:05:43,000 bilang ito mukhang sa dulo ang string na ito ng E-print. 111 00:05:43,000 --> 00:05:45,000 Ngunit wala sa mga ito ang escaped Valgrind. 112 00:05:45,000 --> 00:05:48,000 Nakita namin na ito nahuli ang invalid_write bilang bahagi ng kopya ng STR 113 00:05:48,000 --> 00:05:51,000 sa linya 11 ng pangunahing, at ang invalid_read ang bahagi ng printf. 114 00:05:51,000 --> 00:05:54,000 Rock sa, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Muli, ito ay hindi maaaring mukhang tulad ng isang malaking deal. 116 00:05:57,000 --> 00:06:00,000 Maaari naming patakbuhin ang program na ito paulit-ulit sa labas ng Valgrind 117 00:06:00,000 --> 00:06:03,000 at hindi makita ang anumang mga sintomas ng error. 118 00:06:03,000 --> 00:06:06,000 >> Gayunpaman, tingnan natin sa isang bahagyang pagkakaiba-iba ng mga ito upang makita ang 119 00:06:06,000 --> 00:06:09,000 kung paano ang mga bagay ay maaaring makakuha ng ganap na hindi maayos. 120 00:06:09,000 --> 00:06:14,000 Kaya, ipinagkaloob, kami ay inaabuso bagay higit pa pa sa isang bit sa ang code na ito. 121 00:06:14,000 --> 00:06:17,000 Lamang namin ang paglaan ng espasyo sa magbunton para sa dalawang string 122 00:06:17,000 --> 00:06:19,000 ang haba ng cs50 bato, 123 00:06:19,000 --> 00:06:22,000 oras na ito, pagtanda / 0 character. 124 00:06:22,000 --> 00:06:25,000 Ngunit pagkatapos namin magtapon sa isang napaka-mahabang string sa memory block 125 00:06:25,000 --> 00:06:27,000 na S ay tumuturo sa. 126 00:06:27,000 --> 00:06:30,000 Anong effect na na may sa memory block na T punto upang? 127 00:06:30,000 --> 00:06:34,000 Well, kung ang T puntos sa memory na katabi lang sa S, 128 00:06:34,000 --> 00:06:37,000 nagmumula lamang matapos itong, 129 00:06:37,000 --> 00:06:39,000 maaari naming nakasulat sa paglipas ng bahagi ng T. 130 00:06:39,000 --> 00:06:41,000 Natin patakbuhin ang code na ito. 131 00:06:41,000 --> 00:06:43,000 Hanapin sa kung ano ang nangyari. 132 00:06:43,000 --> 00:06:47,000 Ang mga string namin na naka-imbak sa aming mga bloke ng magbunton parehong lumitaw ang na-print mo nang tama. 133 00:06:47,000 --> 00:06:49,000 Walang Mukhang mali sa lahat. 134 00:06:49,000 --> 00:06:52,000 Gayunpaman, sabihin bumalik sa aming code at 135 00:06:52,000 --> 00:06:55,000 magkomento ang linya kung saan kopyahin namin cs50 bato 136 00:06:55,000 --> 00:06:59,000 sa ikalawang bloke ng memorya, tulis sa pamamagitan ng t. 137 00:06:59,000 --> 00:07:02,000 Ngayon, kapag nagpatakbo namin ang code na ito ay dapat namin 138 00:07:02,000 --> 00:07:06,000 lamang makita ang mga nilalaman ng unang bloke ng memorya i-print. 139 00:07:06,000 --> 00:07:09,000 Whoa, kahit na hindi namin ginawa STR kopya 140 00:07:09,000 --> 00:07:12,000 anumang mga character sa ikalawang magbunton bloke, ang isang tulis sa pamamagitan ng T, 141 00:07:12,000 --> 00:07:15,000 makakakuha tayo ng isang print out. 142 00:07:15,000 --> 00:07:18,000 Sa katunayan, ang string pinalamanan namin sa aming unang bloke 143 00:07:18,000 --> 00:07:21,000 overran ang unang bloke at sa pangalawang block, 144 00:07:21,000 --> 00:07:23,000 paggawa ng lahat ng mukhang normal. 145 00:07:23,000 --> 00:07:26,000 Valgrind, bagaman, Sinasabi sa amin ang tunay na kuwento. 146 00:07:26,000 --> 00:07:28,000 Doon kami. 147 00:07:28,000 --> 00:07:32,000 Ang lahat ng mga di-wastong bumabasa at nagsusulat. 148 00:07:32,000 --> 00:07:36,000 >> Tingnan natin sa isang halimbawa ng isa pang uri ng error. 149 00:07:36,000 --> 00:07:39,000 Narito ang ginagawa namin ng isang bagay na sa halip kapus-palad. 150 00:07:39,000 --> 00:07:41,000 Grab namin ng espasyo para sa isang int sa magbunton, 151 00:07:41,000 --> 00:07:45,000 at hindi na namin simulan ang isang int pointer - p - upang tumuro sa puwang na iyon. 152 00:07:45,000 --> 00:07:48,000 Gayunpaman, habang ang aming pointer ay nasimulan, 153 00:07:48,000 --> 00:07:52,000 ang data na ito na tumuturo sa ang anumang junk ay sa na bahagi ng magbunton. 154 00:07:52,000 --> 00:07:55,000 Kaya kapag kami-load ang data na iyon sa int i, 155 00:07:55,000 --> 00:07:57,000 namin technically i initialize, 156 00:07:57,000 --> 00:08:00,000 ngunit ginagawa namin ito sa data ng junk. 157 00:08:00,000 --> 00:08:03,000 Ang tawag sa igiit, kung saan ay isang madaling-magamit na macro sa pag-debug 158 00:08:03,000 --> 00:08:06,000 tinukoy sa aptly na may pangalang igiit ang library, 159 00:08:06,000 --> 00:08:09,000 Ititigil nito ang programa kung nabigo ang pagsubok kundisyon nito. 160 00:08:09,000 --> 00:08:11,000 Iyon ay, kung i ay hindi 0. 161 00:08:11,000 --> 00:08:14,000 Depende sa kung ano ang sa espasyo magbunton, tulis sa pamamagitan ng p, 162 00:08:14,000 --> 00:08:18,000 Ang program na ito ay maaaring gumana minsan at mabigo sa iba pang mga oras. 163 00:08:18,000 --> 00:08:20,000 Kung ito gumagana, lang kami nakakakuha ng masuwerteng. 164 00:08:20,000 --> 00:08:24,000 Tagatala ay hindi mahuli ang error na ito, ngunit Valgrind bang kalooban. 165 00:08:24,000 --> 00:08:28,000 Doon namin makita ang mga error na stemming mula sa aming paggamit ng data na iyon sa junk. 166 00:08:28,000 --> 00:08:32,000 >> Kapag maglaan ka ng magbunton memory ngunit hindi ito deallocate o magbakante ito, 167 00:08:32,000 --> 00:08:34,000 na tinatawag na mahayag. 168 00:08:34,000 --> 00:08:37,000 Para sa isang maliit, maikli ang buhay na programa na tumatakbo at agad labasan, 169 00:08:37,000 --> 00:08:39,000 paglabas medyo hindi nakakapinsala, 170 00:08:39,000 --> 00:08:42,000 ngunit para sa isang proyekto ng mas malaki laki at / o kahabaan ng buhay, 171 00:08:42,000 --> 00:08:46,000 kahit na isang maliit na mahayag Compound sa isang bagay pangunahing. 172 00:08:46,000 --> 00:08:49,000 Para sa CS50, namin inaasahan mong 173 00:08:49,000 --> 00:08:51,000 alagaan ng pagbabakante lahat ng magbunton memory na magtalaga, 174 00:08:51,000 --> 00:08:54,000 dahil gusto namin sa iyo na bumuo ng mga kakayahan sa maayos na pangasiwaan ang mano-manong proseso 175 00:08:54,000 --> 00:08:56,000 kinakailangan ng C. 176 00:08:56,000 --> 00:08:59,000 Upang gawin ito, ang iyong programa ay dapat magkaroon ng isang eksaktong 177 00:08:59,000 --> 00:09:03,000 isa-sa-isa pagsusulatan sa pagitan ng malloc at libreng tawag. 178 00:09:03,000 --> 00:09:06,000 Kabutihang palad, Valgrind ay maaaring makatulong sa iyo ng mga paglabas ng memorya. 179 00:09:06,000 --> 00:09:09,000 Narito ang isang tumutulo na programa na tinatawag na leak.c na allocates 180 00:09:09,000 --> 00:09:13,000 espasyo sa magbunton, nagsusulat dito, ngunit hindi magbakante ito. 181 00:09:13,000 --> 00:09:16,000 Makatipon namin ito Magsagawa at patakbuhin ang mga ito sa ilalim ng Valgrind, 182 00:09:16,000 --> 00:09:18,000 at nakita namin na, habang wala kaming mga error sa memorya, 183 00:09:18,000 --> 00:09:20,000 namin ay isang mahayag. 184 00:09:20,000 --> 00:09:23,000 May 16 bytes talagang nawala, 185 00:09:23,000 --> 00:09:27,000 na nangangahulugan na ang pointer na memory ay hindi sa saklaw na kapag ang programa lumabas. 186 00:09:27,000 --> 00:09:30,000 Ngayon, Valgrind ay hindi nagbibigay sa amin ng isang tonelada ng impormasyon tungkol sa mahayag, 187 00:09:30,000 --> 00:09:35,000 ngunit kung namin sundin ang maliit na tandaan na ito ay nagbibigay patungo sa ilalim ng mga ulat 188 00:09:35,000 --> 00:09:38,000 sa muling palabas ng pelikula - mahayag-check = buong 189 00:09:38,000 --> 00:09:41,000 upang makita ang buong detalye ng leaked memory, 190 00:09:41,000 --> 00:09:44,000 kami makakuha ng karagdagang impormasyon. 191 00:09:44,000 --> 00:09:46,000 Ngayon, sa ang magbunton ng buod, 192 00:09:46,000 --> 00:09:50,000 Valgrind ay nagsasabi sa amin kung saan ay simula inilalaan ang memory na nawala. 193 00:09:50,000 --> 00:09:52,000 Tulad ng alam namin mula sa pagtingin sa source code, 194 00:09:52,000 --> 00:09:55,000 Informs sa amin ng Valgrind na leaked namin ang memorya 195 00:09:55,000 --> 00:09:58,000 inilalaan sa isang tawag sa malloc sa linya 8 ng leak.c 196 00:09:58,000 --> 00:10:00,000 sa pangunahing function na. 197 00:10:00,000 --> 00:10:02,000 Medyo nakakatawang. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind kategorya paglabas paggamit ng mga term na ito: 199 00:10:04,000 --> 00:10:07,000 Talagang nawala - ito ay magbunton inilalaan memory 200 00:10:07,000 --> 00:10:10,000 na sa programa ay hindi na isang pointer. 201 00:10:10,000 --> 00:10:14,000 Valgrind alam na kayo kapag may pointer ngunit dahil nawala track nito. 202 00:10:14,000 --> 00:10:17,000 Memorya na ito ay talagang leaked. 203 00:10:17,000 --> 00:10:20,000 Hindi direkta nawala - ito ay magbunton inilalaan memory 204 00:10:20,000 --> 00:10:24,000 na lamang ang pointer dito ay mawawala. 205 00:10:24,000 --> 00:10:27,000 Halimbawa, kung nawala mo ang iyong pointer sa unang node ng isang naka-link na listahan, 206 00:10:27,000 --> 00:10:30,000 pagkatapos ang unang node mismo ay talagang nawala, 207 00:10:30,000 --> 00:10:34,000 habang ang anumang kasunod na node ay hindi direktang nawala. 208 00:10:34,000 --> 00:10:37,000 Posibleng nawala - ito ay magbunton inilalaan memory 209 00:10:37,000 --> 00:10:41,000 kung saan ang Valgrind hindi maaaring maging sigurado kung may isang pointer o hindi. 210 00:10:41,000 --> 00:10:44,000 Pa rin mapupuntahan magbunton inilalaan memory 211 00:10:44,000 --> 00:10:47,000 na programa ay mayroon pa ring isang pointer sa exit, 212 00:10:47,000 --> 00:10:50,000 na karaniwan itong nangangahulugan na ang global variable puntos dito. 213 00:10:50,000 --> 00:10:53,000 Upang suriin para sa mga paglabas, mayroon ka ring isama ang pagpipilian 214 00:10:53,000 --> 00:10:55,000 - Pa rin-mapupuntahan = yes 215 00:10:55,000 --> 00:10:58,000 sa iyong pananalangin ng Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Mga iba't ibang mga kaso na maaaring mangailangan ng ibang mga estratehiya para sa paglilinis up ang mga ito, 217 00:11:01,000 --> 00:11:05,000 ngunit paglabas ay dapat na eliminated. 218 00:11:05,000 --> 00:11:08,000 Sa kasamaang palad, ang pag-aayos ng paglabas ay maaaring maging mahirap na gawin, 219 00:11:08,000 --> 00:11:11,000 dahil ang mga tawag hindi tama sa libreng maaaring sumabog ang iyong programa. 220 00:11:11,000 --> 00:11:14,000 Halimbawa, kung tiningnan namin sa invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 makita namin ang isang halimbawa ng masamang memory deallocation. 222 00:11:18,000 --> 00:11:21,000 Ano ang dapat ng isang tawag sa magbakante ang buong block 223 00:11:21,000 --> 00:11:24,000 ng memorya tulis sa pamamagitan ng int_block, 224 00:11:24,000 --> 00:11:27,000 sa halip ay naging isang pagtatangka upang magbakante bawat int-sized na seksyon 225 00:11:27,000 --> 00:11:29,000 ng memory indibidwal. 226 00:11:29,000 --> 00:11:32,000 Ito ay mabibigo catastrophically. 227 00:11:32,000 --> 00:11:34,000 Boom! Ano ang isang error. 228 00:11:34,000 --> 00:11:36,000 Ito ay tiyak na hindi mabuti. 229 00:11:36,000 --> 00:11:39,000 Kung ikaw ay natigil na may ganitong uri ng error, bagaman, at hindi mo alam kung saan upang tumingin, 230 00:11:39,000 --> 00:11:41,000 umasa sa iyong bagong pinakamatalik na kaibigan. 231 00:11:41,000 --> 00:11:44,000 Nahulaan mo - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, gaya ng lagi, alam eksakto kung ano ang up. 233 00:11:47,000 --> 00:11:50,000 Ang alloc at libreng bilang ay hindi tumutugma. 234 00:11:50,000 --> 00:11:52,000 Mayroon kaming 1 alloc at 4 frees. 235 00:11:52,000 --> 00:11:55,000 At Valgrind din nagsasabi sa amin kung saan ang unang masamang libreng tawag - 236 00:11:55,000 --> 00:11:58,000 ang isa na nag-trigger sa blowup - ay nagmumula sa - 237 00:11:58,000 --> 00:12:00,000 linya 16. 238 00:12:00,000 --> 00:12:03,000 Tulad ng iyong nakikita, masamang tawag sa magbakante ay ganap na hindi maayos, 239 00:12:03,000 --> 00:12:05,000 kaya inirerekomenda namin ang pagpapaalam ng iyong programa mahayag 240 00:12:05,000 --> 00:12:08,000 habang nagtatrabaho ka sa pagkuha-andar ang tamang. 241 00:12:08,000 --> 00:12:12,000 Simulan ang naghahanap para sa paglabas lamang pagkatapos ang iyong programa ay gumagana nang maayos, 242 00:12:12,000 --> 00:12:14,000 nang walang anumang iba pang mga error. 243 00:12:14,000 --> 00:12:16,000 >> At na ang lahat na nakuha namin para sa video na ito. 244 00:12:16,000 --> 00:12:18,000 Ngayon ano pa ang hinihintay mo? 245 00:12:18,000 --> 00:12:21,000 Pumunta patakbuhin Valgrind sa iyong mga programa sa ngayon. 246 00:12:21,000 --> 00:12:25,000 Ang pangalan ko ay Nate Hardison. Ito ay CS50. [CS50.TV]