[Powered by Google Translate] [Valgrind] [Nate Hardison, Ollscoil Harvard] Is é seo an CS50, CS50.TV] Tá cuid de na bugs is deacra i gcláir C thagann as an mismanagement de chuimhne. Tá líon mór de na bealaí chun rudaí a scriú suas, lena n-áirítear leithdháileadh an méid mícheart de chuimhne, dearmad a athróg a thúsú, scríbhinn roimh nó tar éis deireadh a Maolán, agus freeing a choinneáil ar amanna cuimhne il. Raon na comharthaí ó tuairteanna uaineach do luachanna mysteriously overwritten, go minic ar áiteanna agus amanna i bhfad a bhaintear as an earráid bunaidh. Tracing an fhadhb faoi deara ar ais go dtí an bhunchúis bun Is féidir a bheith dúshlánach, ach ar an dea tá clár cabhrach ar a dtugtar Valgrind is féidir a dhéanamh go leor chun cabhrú leat. Ritheann tú i leith cláir faoi Valgrind a chur ar chumas seiceáil fhairsing de leithdháiltí cuimhne gcarn agus rochtain. Nuair a bhraitheann Valgrind ar fhadhb, tugann sé leat láithreach, faisnéis dhíreach a ligeann duit níos éasca a aimsiú agus an fhadhb a shocrú. Valgrind freisin tuarascálacha ar cheisteanna cuimhne níos lú deadly, cosúil le leaks cuimhne, leithdháileadh cuimhne gcarn, agus forgetting go saor in aisce é. Cosúil ár Tiomsaitheoir, clang, inár dífhabhtóir, GDB, Is é Valgrind bogearraí saor in aisce, agus tá sé suiteáilte ar an fearas. Valgrind ritheann ar do inrite dénártha, ní do. c nó. comhaid h cód foinse, mar sin a bheith cinnte go bhfuil tú le chéile cóip suas chun dáta do chlár ag baint úsáide as clang nó a dhéanamh. Ansin, is féidir a reáchtáil do chlár faoi Valgrind a chomh simplí agus is cóir prefixing an ordaithe clár caighdeán leis an Valgrind focal, a thosaíonn suas Valgrind agus ritheann an clár taobh istigh de sé. Nuair a bheidh ag tosú, ní Valgrind roinnt casta jiggering a chumrú an inrite do na seiceálacha chuimhne, ionas gur féidir é a chur le beagán a fháil ar bun agus a reáchtáil. Beidh an clár a fhorghníomhú ansin de ghnáth, go mbeadh sé i bhfad níos moille, agus nuair a bailchríocha é, beidh Valgrind a phriontáil achoimre ar a úsáide cuimhne. Má théann gach maith, beidh sé cuma rud éigin mar seo: Sa chás seo,. / Clean_program Is é an cosán ar an gclár ba mhaith liom a rith. Agus cé nach bhfuil an duine a ghlacadh aon argóintí, más rud é go raibh sé mhaith liom ach tack iad go dtí deireadh an ordaithe mar is gnách. Tá clár Glan ach clár amaideach beag a chruthaigh mé go leithdháiltear spás le haghaidh bloc ints ar an gcarn, chur ar roinnt luachanna taobh istigh díobh, agus FreeS an bloc ar fad. Tá sé seo cad a bhfuil tú ag lámhach do, aon earráidí agus aon leaks. Eile is ea an méadrach tábhachtach líon iomlán na mbeart a leithdháileadh. Ag brath ar an gclár, má tá do leithdháiltí san meigibheart nó níos airde, tú ag déanamh dócha rud éigin mícheart. An bhfuil a stóráil gan ghá thú dúblaigh? An bhfuil tú ag baint úsáide an gcarn le haghaidh stórála, nuair a bheadh ​​sé níos fearr a bhaint as an chairn? Mar sin, is féidir earráidí cuimhne a bheith fíor olc. Chur faoi deara na cinn níos oscailte tuairteanna iontach, ach fiú amháin ansin is féidir é a bheith fós deacair a pinpoint cad é go díreach i gceannas ar an tuairteála. Níos insidiously, clár a bhfuil earráid cuimhne Is féidir le chéile go fóill cleanly Is féidir agus is cosúil go fóill a bheith ag obair i gceart mar gheall ar bhainistiú tú a fháil t-ádh is mó den am. Tar éis roinnt "torthaí rathúla," d'fhéadfá smaoineamh ach go bhfuil timpiste a phucháin ar an ríomhaire, ach tá riamh ar an ríomhaire mícheart. Is féidir Running Valgrind cabhrú leat rianú síos an chúis na n-earráidí cuimhne le feiceáil chomh maith le teacht earráidí lurking nach bhfuil tú fiú go fóill ar an eolas faoi. Gach uair a Valgrind bhraitheann ar fhadhb, priontaí sé eolas faoi cad a breathnaíodh. Tá gach mír go leor gonta - an líne foinse an treoir ciontach, cad é an cheist, agus eolas beag faoi an chuimhne i gceist - ach is minic tá sé go leor eolais d'aird a dhíriú ar an áit ceart. Seo sampla de Valgrind a reáchtáil ar chlár Buggy go ndéanann a léamh neamhbhailí de chuimhne gcarn. Feicimid aon earráidí nó rabhaidh i thiomsú. Uh-OH deir an achoimre earráid go bhfuil dhá earráidí - dhá léann neamhbhailí de mhéid 4 - bytes, is é sin. Tá an dá olc Léann tharla i phríomhfheidhm invalid_read.c, an chéad ar líne 16 agus an dara ceann ar líne 19. Ligean ar breathnú ar an cód. Breathnaíonn cosúil leis an chéad ghlaoch chun iarracht printf a léamh amháin o am atá caite an deireadh ár bloc cuimhne. Má fhéachaimid siar ar aschur Valgrind s, feicimid gur inis Valgrind dúinn go díreach. Tosaíonn an seoladh táimid ag iarraidh a léamh 0 bytes anuas ar an deireadh an bhloic ar mhéid 16 bytes - ceithre 32-giotán ints bhfuil leithdháilte againn. Is é sin, tosaíonn an seoladh bhí muid ag iarraidh a léamh ar dheis ag an deireadh ár bloc, díreach mar a fheiceann muid inár glaoch printf dona. Anois, ní a d'fhéadfadh neamhbhailí léann cosúil mhaith go mór le déileáil, ach má tá tú ag baint úsáide as na sonraí sin a rialú an sruth do chlár - mar shampla, mar chuid de más rud é ráiteas nó lúb - ansin is féidir rudaí a théann go ciúin dona. Féach ar conas is féidir liom a reáchtáil ar an gclár invalid_read agus a tharlaíonn aon rud as an gnáth. Scary, huh? Anois, a ligean ar breathnú ar cineálacha áirithe níos mó de na botúin a d'fhéadfadh a bhíonn tú i do chód, agus beidh orainn a fheiceáil conas a bhraitheann Valgrind leo. Chonaic muid ach sampla de invalid_read, sin in iúl anois ar sheiceáil amach invalid_write. Arís, níl aon earráidí nó rabhadh i thiomsú. Maith go leor, a deir Valgrind go bhfuil dhá earráidí sa chlár seo - agus invalid_write agus invalid_read. A ligean ar a sheiceáil amach an cód. Breathnaíonn mhaith againn bhí cás na strlen clasaiceach móide a haon bug. Ní dhéanann an cód malloc le beart breise de spás do charachtar / 0, mar sin nuair a chuaigh str cóip a scríobh sé ag ssubstrlen "cs50 carraigeacha!" Scríobh sé 1 beart thar an deireadh ár bloc. Tagann an invalid_read nuair a dhéanamh linn ár glaoch chun printf. Printf chríochnaíonn suas léamh cuimhne neamhbhailí nuair a léann sé an / 0 carachtar mar tá sé ag deireadh an teaghrán E tá sé phriontáil. Ach éalaigh aon cheann de seo Valgrind. Feicimid gur ghabh sé an invalid_write mar chuid den chóip str ar líne 11 de is mó, agus is é an invalid_read chuid de printf. Rock ar, Valgrind. Arís, ní fhéadfadh sé seo cosúil mhaith le déileáil go mór. Is féidir linn a reáchtáil an clár seo thar agus os cionn taobh amuigh de Valgrind agus ní a fheiceáil ar bith comharthaí earráid. Mar sin féin, a ligean ar breathnú ar go mbeadh athrú beag seo a fheiceáil conas is féidir rudaí a fháil i ndáiríre dona. , Arna dheonú Mar sin, tá muid rudaí mí-úsáid níos mó ná beagán ach sa chód seo. Táimid ag dháileadh ach spás ar an gcarn ar feadh dhá teaghráin fad cs50 carraigeacha, an am seo, ag cuimhneamh ar an / 0 carachtar. Ach ansin dúinn a chaitheamh i teaghrán Super-fada isteach an bloc cuimhne go S dírithe. Cén éifeacht a bheith aige ar an bloc cuimhne go pointí T a? Bhuel, má pointí T chun cuimhne go díreach in aice le S, ag teacht díreach tar éis é, ansin d'fhéadfadh mór dúinn i scríbhinn os cionn cuid de T. A ligean ar seo a reáchtáil cód. Féach ar cad a tharla. Na teaghráin a stóráil muid inár bloic gcarn araon cosúil go chló amach i gceart. Ní dhéanfaidh aon ní cosúil go mícheart ar chor ar bith. Mar sin féin, a ligean ar dul ar ais isteach inár cód agus trácht a dhéanamh amach an líne nuair a chóipeáil againn cs50 carraigeacha isteach an bloc cuimhne dara, a léirigh ag t. Anois, nuair a reáchtáil againn an gcód seo ba chóir dúinn ach féach an t-ábhar ar an bloc cuimhne chéad phriontáil amach. Whoa, cé nach raibh muid str cóip aon carachtair isteach i mbloc gcarn dara, léirigh an ceann ag T, a fháil againn a phriontáil amach. Go deimhin, an teaghrán líonta muid isteach inár bloc an chéad overran an bloc chéad agus an dara bloc, a dhéanamh gach rud cosúil gnáth. Valgrind, áfach, insíonn dúinn an scéal fíor. Tá muid ag dul. Gach ceann de na neamhbhailí léann scríobhann agus. Ligean ar breathnú ar shampla eile de chineál ar earráid. Anseo a dhéanann muid rud éigin in áit trua. Grab muid spás le haghaidh slánuimhir ar an gcarn, agus táimid thúsú an pointeoir slánuimhir - p - go pointe leis an spás. Mar sin féin, cé go bhfuil ár n-pointeoir initialized, na sonraí go tá sé dírithe go bhfuil ach is cuma cén junk go bhfuil sa chuid sin den an gcarn. Mar sin, nuair a luchtú go bhfuil sonraí i slánuimhir i, táimid ag thúsú go teicniúil i, ach a dhéanann muid mar sin le sonraí junk. An glao a dhearbhú, a bhfuil macra debugging handy sainithe sa leabharlann aptly ainmnithe dhearbhú, Beidh tobscoir an gclár má theipeann ar riocht ina tástála. Is é sin, más rud é nach bhfuil mé 0. Ag brath ar an méid a bhí sa spás gcarn, a léirigh ag p, D'fhéadfadh an clár seo ag obair uaireanta agus go dteipeann ag amanna eile. Má oibríonn sé, tá muid ag dul díreach ádh. Ní bheidh an tiomsaitheoir ghabháil an earráid seo, ach beidh cinnte Valgrind. Tá linn a fheiceáil an earráid a eascraíonn as ár n-úsáid na sonraí junk. Nuair a dháileadh tú cuimhne gcarn ach nach GSSAPI é nó í a scaoileadh saor, go bhfuil ar a dtugtar sceitheadh. Do chlár, beag gearr-cónaí go ritheann agus díreach bealaí amach, ligean uisce sách harmless, ach le haghaidh tionscadal de mhéid níos mó agus / nó fad saoil, fiú is féidir le sceitheadh ​​beag cumaisc i rud éigin mór. Chun CS50, a dhéanann muid súil agat a cúram a ghlacadh de freeing gach ceann de na chuimhne gcarn go leithdháileadh ort, ós rud é ba mhaith linn leat chun cur leis na scileanna i gceart déileáil leis an bpróiseas láimhe a cheanglaítear le C. Chun é sin a, ba chóir do chlár a bhfuil cruinn duine-le-duine comhfhreagras idir malloc agus glaonna saor in aisce. Fortunately, is féidir Valgrind cabhrú leat le leaks cuimhne freisin. Seo clár leaky ar a dtugtar leak.c go leithdháileann spás ar an gcarn, scríobhann dó, ach ní saor in aisce é. Táimid thiomsú sé le Déan agus é a reáchtáil faoi Valgrind, agus feicimid go bhfuil, cé go bhfuil muid earráidí cuimhne ar bith, a dhéanann muid a bheith ar cheann sceitheadh. Tá 16 bytes cinnte caillte, rud a chiallaíonn nach raibh an pointeoir leis an chuimhne i raon feidhme nuair a sendmail an gclár. Anois, ní Valgrind a thabhairt dúinn a ton eolais i dtaobh an sceite, ach má leanann muid an nóta beag go dtugann sé síos i dtreo an ghrinnill a thuarascáil a rerun le - sceitheadh-seiceáil = iomlán a fheiceáil na sonraí iomlána cuimhne leaked, beidh orainn a fháil tuilleadh eolais a fháil. Anois, san achoimre gcarn, Valgrind insíonn dúinn ina bhfuil an chuimhne a bhí caillte go raibh leithdháileadh ar dtús. Díreach mar atá a fhios againn ó breathnú ar an cód foinse, Valgrind iúl dúinn go leaked muid an chuimhne leithdháilte le glaoch le malloc ar líne 8 de leak.c san fheidhm is mó. Pretty nifty. Valgrind categorizes leaks ag baint úsáide as na téarmaí seo: Cinnte caillte - tá sé seo chuimhne leithdháilte carn lena mbaineann an clár a thuilleadh a pointeoir. Valgrind a fhios go raibh tú aon uair amháin an pointeoir ach a chaill ó rian de. Tá an cuimhne leaked cinnte. Go hindíreach caillte - tá sé seo chuimhne leithdháilte carn lena mbaineann an leideanna ach tá sé caillte chomh maith. Mar shampla, má chaill tú do phointeoir leis an nód chéad liosta nasctha, ansin bheadh ​​an nód chéad féin a bheith caillte cinnte, cé go mbeadh aon nóid ina dhiaidh sin a bheith caillte go hindíreach. B'fhéidir caillte - tá sé seo chuimhne leithdháilte carn chun nach féidir Valgrind a bheith cinnte an bhfuil pointeoir nó nach bhfuil. Fós is reachable cuimhne leithdháileadh carn ar a bhfuil an clár fós pointeoir ag scoir, rud a chiallaíonn de ghnáth go pointí domhanda athraitheach leis. Chun seiceáil do na leaks, beidh ort freisin a chur san áireamh an rogha - Go fóill-reachable = yes i do agairt Valgrind. D'fhéadfadh na cásanna éagsúla a cheangal ar straitéisí éagsúla chun iad a ghlanadh suas, ach ba chóir ligean uisce a dhíchur. Ar an drochuair, is féidir ligean uisce a shocrú a bheith deacair a dhéanamh, toisc gur féidir glaonna mícheart saor in aisce buille suas do chlár. Mar shampla, má táimid ar invalid_free.c, feicimid sampla de deallocation cuimhne dona. Ba chóir go mbeadh Cad glaoch amháin go saor in aisce ar an bloc ar fad de chuimhne Luaigh trí int_block, tar éis éirí ina ionad sin mar iarracht chun saor in aisce gach rannóg o-iarrachtaí an chuimhne ina n-aonar. Beidh theipeann tubaisteach. Boom! Cad botún. Tá sé seo cinnte nach maith. Má tá tú bhfostú leis an gcineál seo earráid, áfach, agus nach bhfuil fhios agat nuair a chuardach, thagann ar ais ar do chara is fearr nua. Guessed tú é - Valgrind. Valgrind, mar i gcónaí a fhios, go díreach cad atá ar bun. Nach bhfuil na comhaireamh leithdháileadh agus saor in aisce mheaitseáil suas. Táimid iontach fuair 1 leithdháileadh agus 4 FreeS. Agus insíonn Valgrind dúinn freisin i gcás an chéad ghlaoch saor in aisce dona - an ceann a tharraing an blowup - ag teacht ó - líne 16. Mar a fheiceann tú, tá glaonna olc go saor in aisce i ndáiríre dona, mar sin molaimid ligean do sceitheadh ​​chlár fad a bhíonn tú ag obair ar an dul feidhmiúlacht ceart. Tosú ag lorg i gcomhair sceitheanna ach amháin tar éis do chlár ag obair i gceart, gan aon earráidí eile. Agus sin ar fad atá againn fuair haghaidh físeán seo. Anois, cad iad ag fanacht leat do? Téigh reáchtáil Valgrind ar do chláir ceart anois. Is é mo ainm Nate Hardison. Is é seo an CS50. [CS50.TV]