[Powered by Google Translate] [Valgrind] [Nate Hardison, Università ta 'Harvard] Dan huwa CS50, CS50.TV] Uħud mill-bugs aktar diffiċli fil-programmi C ġejjin mill-ġestjoni ħażina tal-memorja. Hemm numru kbir ta 'modi biex screw affarijiet up, inkluż allokat l-ammont ħażin ta 'memorja, jinsa li initialize-varjabbli, miktub qabel jew wara t-tmiem ta 'buffer, u tillibera jżommu ħinijiet memorja multipli. Is-sintomi jvarjaw minn ħabtiet intermittenti għall-valuri mysteriously miktub fuq xulxin, spiss fil-postijiet u l-ħinijiet bogħod mill-iżball oriġinali. Tracing-problema osservata lura lill-għerq sottostanti jista 'jkun sfida, iżda fortunatament hemm programm utli imsejjaħ Valgrind li jistgħu jagħmlu ħafna biex jgħinu. Inti tmexxi programm taħt Valgrind biex verifika estensiva tal-allokazzjonijiet tal-memorja borġ u aċċessi. Meta Valgrind jiskopri problema, li tagħtik immedjat, informazzjoni diretta li jippermetti li inti aktar faċilment isibu u tiffissa l-problema. Valgrind wkoll rapporti dwar kwistjonijiet memorja inqas fatali, bħal tnixxijiet memorja, l-allokazzjoni tal-memorja borġ, u jinsa biex ħielsa minnha. Bħal kompilatur, tagħna clang, fil-debugger tagħna, GDB, Valgrind huwa softwer b'xejn, u huwa installat fuq il-appliance. Valgrind timxi fuq eżekutibbli binarju tiegħek, mhux tiegħek. c jew. fajls kodiċi h sors, sabiex ikun żgur li għandek miġbura kopja up-to-data tal-programm tiegħek użu clang jew Għamla. Imbagħad, ġiri program tiegħek taħt Valgrind jista 'jkun sempliċi kemm biss prefiss-kmand programm standard bl-Valgrind kelma, li jibda up Valgrind u jmexxi l-programm ġewwa ta 'dan. Meta jibdew, Valgrind ma xi kumpless jiggering biex jiġi kkonfigurat l-eżekutibbli għall-kontrolli tal-memorja, sabiex ikun jista 'jieħu ftit biex tikseb jibda jaħdem. Il-programm għandu mbagħad tesegwixxi normalment, ikun ferm aktar bil-mod, u meta jispiċċa, Valgrind se print sommarju ta 'użu tal-memorja tiegħu. Jekk kollox imur sew, se tfittex xi ħaġa bħal din: F'dan il-każ,. / Clean_program hija t-triq għall-programm Irrid jiddekorri. U filwaqt li dan wieħed ma jagħmel ebda argumenti, jekk hija ma I d biss tindi minnhom fuq sat-tmiem tal-kmand bħas-soltu. Programm Nadif huwa biss programm ftit iblah I maħluqa li jalloka spazju għal blokk ta 'ints fuq il-munzell, tpoġġi xi valuri ġewwa minnhom, u jillibera l-blokk kollu. Dan huwa dak li qed shooting għal, l-ebda żbalji u l-ebda tnixxijiet. Ieħor metrika importanti huwa n-numru totali ta 'bytes allokati. Jiddependi fuq il-programm, jekk allokazzjonijiet tiegħek huma fil-megabytes jew ogħla, int probabilment tagħmel xi ħaġa ħażina. Inti bla bżonn ħażna duplikati? Inti tuża l-borġ għall-ħażna, meta ikun aħjar li tuża l-munzell? Allura, żbalji memorja jista 'jkun verament ħażen. Dawk l-aktar evidenti jikkawżaw ħabtiet spettakolari, iżda anki allura xorta tista 'tkun diffiċli biex jiġu identifikati x'inhi eżattament wassal għall-tiġrifa. Aktar insidjuż, programm bi żball memorja xorta jistgħu jikkompilaw nadif u xorta jistgħu jidhru li qed jaħdmu b'mod korrett għaliex inti irnexxielhom jiksbu xortik tajba ħafna mill-ħin. Wara diversi "riżultati ta 'suċċess," inti tista 'biss taħseb li crash huwa fluke tal-kompjuter, iżda l-kompjuter huwa qatt żbaljata. Running Valgrind jistgħu jgħinuk jillokalizzaw l-kawża ta 'żbalji memorja viżibbli kif ukoll isibu lurking żbalji inti lanqas biss għadhom jafu dwar. Kull darba Valgrind jiskopri problema, stampi informazzjoni dwar dak li osservat. Kull oġġett huwa pjuttost konċiż - il-linja sors ta 'l-istruzzjoni toffendi, dak il-kwistjoni hija, u info ftit dwar il-memorja involuti - iżda ħafna drabi huwa biżżejjed informazzjoni sabiex jidderieġu l-attenzjoni tiegħek għall-post dritt. Hawn hu eżempju ta 'Valgrind taħdem fuq programm Buggy li ma li taqra invalidu 'memorja borġ. Naraw l-ebda żbalji jew twissijiet fil-kompilazzjoni. Uh-oh, is-sommarju iżball jgħid li hemm żewġ żbalji - 2 jaqra invalidi ta 'daqs 4 - bytes, li hu. Kemm ħażin jaqra seħħew fil-funzjoni prinċipali invalid_read.c, l-ewwel fuq il-linja 16 u t-tieni fuq il-linja 19. Ejja nħarsu lejn il-kodiċi. Id-Dehra tal-ewwel sejħa għall printf tipprova jinqraw wieħed int passat l-aħħar ta 'blokka tal-memorja tagħna. Jekk inħarsu lura lejn produzzjoni Valgrind s, naraw li Valgrind qalulna eżattament dan. L-indirizz aħna qed jippruvaw biex taqra jibda 0 bytes passat il-tarf tal-blokka ta 'daqs 16 bytes - 4 32-bit ints li aħna allokati. Dan huwa, l-indirizz konna tipprova taqra jibda dritt fl-aħħar ta 'blokk tagħna, biss kif naraw fis-sejħa printf tagħna ħżiena. Issa, invalidu jaqra jista 'ma tidhirx bħal li kbar ta' ftehim, imma jekk inti qed tuża din id-data biex jikkontrolla l-fluss tal-programm tiegħek - per eżempju, bħala parti minn jekk id-dikjarazzjoni jew loop - allura l-affarijiet jistgħu imorru ħażin skiet. Watch kif I tista 'tmexxi l-programm invalid_read u xejn barra min-normal jiġri. Scary, huh? Issa, ejja nħarsu lejn uħud tipi aktar ta 'żbalji li inti tista' tiltaqa fil-kodiċi tiegħek, u aħna ser tara kif Valgrind jiskopri minnhom. Aħna biss raw eżempju ta 'invalid_read, hekk issa ejja check out invalid_write. Għal darb'oħra, l-ebda żbalji jew twissijiet fil-kompilazzjoni. Okay, Valgrind jgħid li hemm żewġ żbalji f'dan il-programm - u invalid_write u invalid_read. Ejja check out din il-kodiċi. Id-Dehra konna ltqajna każ ta 'l-strlen klassika u wieħed bug. Il-kodiċi ma malloc byte żejda ta 'l-ispazju għall-karattru / 0, hekk meta str kopja marru jiktbu dan fil ssubstrlen "cs50 blat!" hija kitbet 1 byte passat il-tarf tal-blokka tagħna. Il invalid_read ġejja meta nagħmlu sejħa tagħna għal printf. Printf jispiċċa qari memorja invalidu meta jaqra l / 0 karattru kif jidher fl-aħħar ta 'dan sekwenza E huwa l-istampar. Imma xejn minn dan maħruba Valgrind. Naraw li qabad il-invalid_write bħala parti mill-kopja str fuq il-linja 11 tat ewlenija, u l-invalid_read hija parti mill printf. Rock fuq, Valgrind. Għal darb'oħra, dan ma jista 'jidher bħala big deal. Aħna tista 'taħdem dan il-programm fuq u aktar barra tal Valgrind u ma tara l-ebda sintomi ta 'żball. Madankollu, ejja nħarsu lejn varjazzjoni żgħira ta 'dan biex tara kif l-affarijiet jistgħu jiksbu verament ħżiena. Għalhekk, mogħtija, aħna qed jabbużaw affarijiet aktar minn sempliċiment daqsxejn f'dan il-kodiċi. Aħna biss allokazzjoni ta 'spazju fuq il-borġ għal żewġ kordi it-tul ta 'cs50 blat, din id-darba, ftakar l / 0 karattru. Imma allura aħna tarmi string super-twil fil-blokk memorja li S hija li tipponta lejn. X'effett se jkollu dan fuq il-blokka tal-memorja li l-punti T sa? Ukoll, jekk il-punti T għal memorja li jinsab biss maġenb S, ġejjin biss wara dan, allura aħna jista 'jkollha miktub fuq parti ta' T. Ejja run dan il-kodiċi. Ħares lejn dak li ġara. Il-kordi aħna maħżuna fi blokki munzell tagħna kemm dehret li stampati b'mod korrett. Xejn jidher ħażin fil-livelli kollha. Madankollu, ejja mmorru lura fis-kodiċi tagħna u jikkummentaw l-linja fejn aħna kopja cs50 blat fil-blokk memorja 2, innotat mill-t. Issa, meta aħna run dan il-kodiċi għandna biss tara l-kontenut tal-blokka tal-memorja 1 jistampa. Whoa, anke jekk aħna ma str kopja xi karattri ġewwa l-blokk munzell 2, l-1 indikat mill T, irridu jiksbu print out. Tabilħaqq, l-sekwenza aħna mimli fis ewwel blokk tagħna skorriet l-ewwel blokk u fil-blokk 2, jagħmlu kollox jidher normali. Valgrind, għalkemm, jgħidilna l-istorja vera. Hemm immorru. Kollha ta 'dawk invalidi jaqra u jikteb. Ejja nħarsu lejn eżempju ta 'tip ieħor ta' żball. Hawnhekk aħna nagħmlu xi ħaġa pjuttost sfortunati. Aħna grab spazju għal int fuq il-munzell, u aħna initialize l pointer int - p - għall-punt li dak l-ispazju. Madankollu, filwaqt li pointer tagħna huwa initialized, id-data li huwa tipponta lejn ftit ikun x'ikun junk huwa fil-parti tal-borġ. Allura meta aħna tagħbija li d-data fis INT i, aħna teknikament initialize i, iżda nagħmlu hekk ma 'data junk. Is-sejħa li jasserixxu, li huwa makro debugging handy definit fil-adattat issemmiet tasserixxi librerija, se abort-programm jekk il-kundizzjoni tat-test tagħha jonqos. Dan huwa, jekk i ma tkunx 0. Jiddependi fuq dak li kien fl-ispazju borġ, innotat mill p, dan il-programm jista 'jaħdem kultant u jonqsu f'ħinijiet oħra. Jekk din taħdem, aħna qed biss jkollna xxurtjati. Il-kompilatur mhux se jaqbdu dan l-iżball, imma Valgrind rieda żgur. Hemm naraw l-iżball li jirriżulta mill-użu tagħna ta 'dik id-data junk. Meta inti jallokaw memorja borġ iżda ma deallocate dan jew ħielsa it- li tissejjaħ nixxija. Għal żgħir, ħajja qasira programm li tmexxi u immedjatament ħruġ, tnixxijiet huma pjuttost ma jagħmlux ħsara, iżda għal proġett ta 'daqs akbar u / jew lonġevità, anke tnixxija żgħira tista kompost fis xi ħaġa kbira. Għal CS50, aħna ma jistennew li inti jieħdu ħsieb ta 'ħelsien kollha tal-memorja borġ li inti jallokaw, peress li aħna rridu li inti tibni il-ħiliet biex jimmaniġġjaw sew l-proċess manwali meħtieġa minn C. Biex tagħmel dan, il-programm tiegħek għandu jkollhom eżatta one-to-one korrispondenza bejn malloc u sejħiet b'xejn. Fortunatament, Valgrind jistgħu jgħinuk ma 'tnixxijiet memorja wisq. Hawnhekk huwa programm leaky imsejjaħ leak.c li jalloka ispazju fuq il-munzell, jikteb lilu, iżda ma ħielsa minnha. Aħna jikkompilaw bl Għamla u run taħt Valgrind, u naraw li, filwaqt li aħna għandna l-iżbalji memorja ebda, aħna għandna waħda nixxija. Hemm 16 bytes definittivament mitlufa, li jfisser li l-pointer għal dak memorja ma kienx fl-ambitu tiegħu meta l-programm ħareġ. Issa, Valgrind ma tagħtina ton ta 'informazzjoni dwar il-tnixxija, imma jekk aħna isegwu din in-nota ftit li tagħti l isfel lejn il-qiegħ tar-rapport tagħha li terġa 'ssir bl - leak-check = full biex tara d-dettalji sħaħ ta 'memorja nixxew, aħna ser tikseb aktar informazzjoni. Issa, fis-sommarju munzell, Valgrind tgħidilna meta l-memorja li kien mitluf kien inizjalment allokati. Just kif nafu minn tfittex fil-kodiċi tas-sors, Valgrind tinforma lilna li aħna nixxew l-memorja allokat ma 'sejħa għall malloc fuq il-linja 8 tal leak.c fil-funzjoni ewlenija. Pretty nifty. Valgrind categorizes tnixxijiet jużaw dawn it-termini: Żgur mitlufa - dan huwa borġ memorja allokat li l-programm ma għadx għandha pointer. Valgrind jaf li inti darba kellhom l-pointer iżda peress tilef rekord ta 'dan. Din il-memorja huwa definittivament nixxew. Indirettament mitlufa - dan huwa borġ memorja allokat li għalihom il-pointers biss għal wkoll huma mitlufa. Per eżempju, jekk int mitluf pointer tiegħek għall-node 1 ta 'lista marbuta, allura l-node 1 nnifisha tkun definittivament mitlufa, filwaqt li xi lymph sussegwenti tkun indirettament mitlufa. Possibilment mitlufa - dan huwa borġ memorja allokat li Valgrind ma jistax ikun ċert jekk hemmx pointer jew le. Still jista 'jintlaħaq huwa borġ memorja allokat li l-programm għad għandha pointer fuq ħruġ, li tipikament ifisser li l-punti varjabbli globali lilha. Biex tiċċekkja għal dawn tnixxijiet, tkun taf ukoll biex jinkludu l-għażla - Għadu-jista 'jintlaħaq = iva fil invokazzjoni tiegħek ta 'Valgrind. Dawn il-każijiet differenti jistgħu jeħtieġu strateġiji differenti għat-tindif up, iżda tnixxijiet għandhom jiġu eliminati. Sfortunatament, l-iffissar tnixxijiet jista 'jkun diffiċli li tagħmel, ladarba telefonati mhux korretti għall ħielsa tista 'blow up program tiegħek. Per eżempju, jekk inħarsu lejn invalid_free.c, naraw eżempju ta deallocation memorja ħażina. X'għandu jkun hemm sejħa waħda biex ħielsa l-blokk kollu tal-memorja indikat mill int_block, Minflok sar tentattiv biex ħielsa kull sezzjoni int 'daqs medju tal-memorja individwalment. Dan se jonqsu katastrofiku. Boom! Liema żball. Dan huwa definittivament mhux tajba. Jekk int mwaħħla ma 'dan it-tip ta' żball, għalkemm, u ma tafx fejn tfittex, jaqgħu lura fuq l-aqwa ħabib tiegħek ġodda. Qtajt - Valgrind. Valgrind, bħal dejjem, ikun jaf eżattament x'hemm up. L-għadd ALLOC u ħielsa ma jaqblu. Imxejna ltqajna 1 alloc u 4 jillibera. U Valgrind wkoll tgħidilna meta l-ewwel sejħa ħielsa ħażina - il-wieħed li wassal għall-blowup - ikun ġej minn - linja 16. Kif qed taraw, sejħiet ħżiena biex ħielsa huma tassew ħżiena, hekk aħna nirrakkomandaw kiri nixxija program tiegħek waqt li qed jaħdmu fuq jkollna l-funzjonalità korretta. Tibda tfittex għal tnixxijiet biss wara program tiegħek qed jaħdem kif suppost, mingħajr l-ebda żbalji oħra. U li kollox konna ltqajna għal dan il-video. Issa dak li huma inti tistenna? Mur jimxu Valgrind fuq programmi tiegħek dritt issa. Jisimni Nate Hardison. Dan huwa CS50. [CS50.TV]