DOUG LLOYD: Pob GDB gywir. Beth yw e yn union? Felly GDB, sy'n sefyll ar gyfer yr GNU Bar offer, yn offeryn wirioneddol anhygoel y gallwn defnyddio i'n helpu debug ein rhaglenni, neu gael gwybod ble mae pethau mynd o chwith yn ein rhaglenni. GDB yn rhyfeddol o bwerus, ond yr allbwn a rhyngweithio ag ef Gall fod ychydig yn cryptig. Mae fel arfer yn arf gorchymyn llinell, a gall daflu llawer o negeseuon ar chi. Ac y gall y math o galed i dosrannu yn union beth sy'n digwydd. Yn ffodus, rydym wedi cymryd camau at atgyweiria hon broblem i chi wrth i chi weithio trwy CS50. Os nad ydych yn defnyddio'r graffigol dadnamydd, y mae fy nghydweithiwr Dan Armandarse wedi siarad yn eithaf ychydig am mewn fideo sy'n Dylai fod dros yma ar hyn o bryd, efallai y bydd angen i chi i ddefnyddio'r llinell gorchymyn yma offer i weithio gyda GDB. Os ydych yn gweithio yn y CS50 IDE, nid oes angen i chi wneud hyn. Ond os nad ydych yn gweithio yn y CS50 IDE, efallai drwy ddefnyddio fersiwn o Offer CS50, neu Linux arall sy'n gweithredu system gyda GDB osod arno, efallai y bydd angen i chi ddefnyddio mae'r rhain offer llinell orchymyn. Ac ers i chi efallai rhaid i ni wneud hynny, 'i' yn ddefnyddiol dim ond i ddeall sut GDB yn gweithio o'r llinell orchymyn. Ond unwaith eto, os ydych yn gan ddefnyddio'r IDE CS50, byddwch yn yn gallu defnyddio'r debugger graffigol sy'n cael ei hadeiladu i mewn i'r DRhA. Felly, i gael pethau yn mynd â GDB, i gychwyn y debugging broses o manylyn rhaglen, mae angen i chi ei wneud i gyd yn teipio eu dilyn GDB o'r enw rhaglen. Felly, er enghraifft, os yw eich rhaglen yn helo, byddech yn teipio GDB helo. Pan fyddwch yn gwneud hynny, rydych yn mynd i dynnu i fyny ar yr amgylchedd GDB. Bydd eich brydlon yn newid, ac yn hytrach na bod yr hyn fel arfer yw pan fyddwch yn teipio pethau yn y ls line-- gorchymyn, cd-- eich holl nodweddiadol Linux gorchmynion, eich brydlon Bydd yn newid i, yn ôl pob tebyg, rhywbeth fel cromfachau GDB cromfachau. Dyna eich prydlon GDB newydd, oherwydd eich bod yn y tu mewn i'r amgylchedd GDB. Unwaith y tu mewn amgylchedd hwnnw, mae 'na ddau brif gorchmynion y mae'n debyg y byddwch yn defnyddio yn y drefn ganlynol. Y cyntaf yw b, a oedd yn yn fyr ar gyfer egwyl. Ac ar ôl i chi deipio b, byddwch fel arfer teipiwch enw swyddogaeth, neu os ydych yn digwydd i wybod o gwmpas pa rif llinell eich rhaglen yn dechrau i ymddwyn ychydig yn od, gallwch deipio llinell Rhif yno hefyd. Pa b, neu egwyl, yn gwneud yw ei fod yn caniatáu eich rhaglen i redeg hyd nes y pwynt penodol, sef, enw'r swyddogaeth eich bod yn nodi neu'r llinell Rhif eich bod yn nodi. Ac ar y pwynt hwnnw, mae'n Bydd rhewi gweithredu. Mae hyn yn beth da iawn, oherwydd unwaith y bydd gweithredu wedi cael ei rewi, gallwch ddechrau araf iawn cam drwy eich rhaglen. Fel arfer, os ydych wedi bod yn rhedeg eich rhaglenni, eu bod yn eithaf byr. Fel arfer, chi deipio dot slaes beth bynnag enw eich rhaglen, daro Chofnoda, a cyn y gallwch Blink, eich rhaglen eisoes wedi'i orffen. Nid yw'n wir yn llawer o amser i roi cynnig a chyfrif i maes beth sy'n mynd o'i le. Felly y mae mewn gwirionedd i allu arafu pethau i lawr drwy osod pwynt egwyl gyda b, ac yna camu i mewn. Yna, unwaith y byddwch wedi gosod eich gwyliau bwynt, gallwch redeg y rhaglen. Ac os oes gennych unrhyw dadleuon llinell orchymyn, eich bod yn nodi nhw yma, nid pan chi deipio GDB eich enw rhaglen. Byddwch yn pennu'r holl 'r archa bannod dadleuon drwy gymryd r, neu redeg, ac yna dadleuon llinell orchymyn beth bynnag mae angen i chi tu mewn i'ch rhaglen. Mae yna nifer o eraill mewn gwirionedd gorchmynion pwysig a defnyddiol tu mewn amgylchedd GDP. Felly gadewch i mi jyst yn gyflym mynd dros rai ohonynt. Y cyntaf yw n, sydd yn fyr am nesaf, a gallwch deipio nesaf yn hytrach na n, byddai'r ddau yn gweithio. A 'i' dim ond y llaw-fer. Ac fel y byddwch wedi gotten yn ôl pob tebyg eisoes arfer, y gallu i deipio pethau byrrach yn well yn gyffredinol. A beth fydd yn ei wneud yw ei fe gamu ymlaen un bloc o god. Felly, bydd yn symud ymlaen hyd nes y swyddogaeth alwad. Ac yna yn lle plymio i mewn i swyddogaeth honno a mynd drwy hynny i gyd swyddogaethau cod, bydd yn jyst yn cael y swyddogaeth. Bydd y swyddogaeth yn cael eu galw. Bydd yn gwneud beth bynnag mae ei waith yn. Bydd yn dychwelyd gwerth at y swyddogaeth a oedd yn galw arno. Ac yna byddwch yn symud ymlaen at y llinell nesaf y swyddogaeth honno galw. Os ydych am i gamu tu mewn i'r swyddogaeth, hytrach na dim ond cael mae'n gweithredu, yn enwedig os ydych yn meddwl bod y broblem Gallai gorwedd tu mewn swyddogaeth honno, fe allech chi, wrth gwrs, yn gosod seibiant pwyntio tu mewn y swyddogaeth honno. Neu os ydych eisoes yn rhedeg, gallwch defnyddio i gamu ymlaen un llinell o god. Felly, bydd hyn yn camu i mewn a plymio i mewn i swyddogaethau, hytrach na dim ond yn cael y gweithredu ac yn parhau ar yn y swyddogaeth eich bod mewn am debugging. Os ydych chi erioed wedi eisiau ei wybod gwerth newidyn, gallwch deipio p, neu Print, ac yna yr enw newidyn. A fydd yn argraffu i chi, tu mewn i'r amgylchedd GDB, enw'r newidyn, hynny you-- esgusodwch me-- gwerth y newidyn eich bod wedi enwi. Os ydych am wybod gwerthoedd pob amrywio hygyrch lleol o ble ydych chi ar hyn o bryd yn eich rhaglen, gallwch deipio pobl leol info. Mae'n llawer cyflymach na teipio p ac yna beth bynnag, rhestru allan bob un o'r newidynnau eich bod yn gwybod yn bodoli. Gallwch deipio pobl leol gwybodaeth, ac mae'n Bydd argraffu popeth i chi. Nesaf i fyny yn bt, sef byr ar gyfer Back Trace. Yn awr, yn gyffredinol, yn enwedig yn gynnar yn CS50, ni fyddwch mewn gwirionedd yn cael achlysur i ddefnyddio bt, neu Back Trace, oherwydd nad ydych yn cael swyddogaethau sy'n galw swyddogaethau eraill. Efallai eich bod wedi prif alwad yn swyddogaeth, ond mae hynny'n fwy na thebyg. Nid oes gennych swyddogaeth honno eraill yn galw swyddogaeth arall, a oedd yn yn galw swyddogaeth arall, ac yn y blaen. Ond wrth eich rhaglenni yn cael mwy cymhleth, ac yn arbennig pan fyddwch yn dechrau gweithio gyda dychweliad, olrhain yn ôl Gall fod yn ffordd ddefnyddiol iawn i adael i chi fath o gael rhywfaint o gyd-destun lle Yr wyf yn fy rhaglen. Felly, yn dweud eich bod wedi ysgrifennu eich cod, a eich bod yn gwybod mai prif galwadau swyddogaeth f, sy'n galw swyddogaeth g, sy'n galw swyddogaeth h. Felly mae gennym sawl haen o nythu yn digwydd yma. Os ydych chi y tu mewn o eich amgylchedd GDB, a ydych yn gwybod eich tu mewn o h, ond byddwch yn anghofio am yr hyn rhaid i chi ble rydych yn yw-- gallwch deipio bt, neu olrhain yn ôl, a bydd yn argraffu h, g, f prif, ochr yn ochr â rhywfaint o wybodaeth arall, a oedd yn rhoi cliw i chi, prif OK Gelwir f, f elwir yn g, g elwir h, a dyna lle yr wyf yn wyf ar hyn o bryd yn fy rhaglen. Felly gall fod yn ddefnyddiol iawn, yn enwedig gan fod y cryptig-Ness o GDB yn dod yn ychydig yn llethol, i cael gwybod yn union ble mae pethau. Yn olaf, pan fydd eich rhaglen yn cael ei wneud, neu pan fyddwch chi'n ei wneud debugging ei ac rydych am i gamu i ffwrdd o'r amgylchedd GDB, mae'n helpu i wybod sut i ddod allan ohono. Gallwch deipio q, neu Ymadael, i fynd allan. Yn awr, cyn i fideo heddiw Yr wyf yn paratoi rhaglen buggy Gelwir buggy1, yr wyf luniwyd o ffeil a elwir yn buggy1.c. Fel y byddech yn disgwyl, mae hyn yn rhaglen mewn gwirionedd bygi. Rhywbeth yn mynd o'i le pan fyddaf yn ceisio rhedeg. Yn awr, yn anffodus, yr wyf yn anfwriadol dileu fy ffeil buggy1.c, felly er mwyn i mi chyfrif i maes beth sy'n mynd o'i le ar y rhaglen hon, Rydw i'n mynd i gael i ddefnyddio GDB fath o blindly, yn ceisio i lywio drwy'r rhaglen hon i ffigur yn union beth sy'n mynd o'i le. Ond gan ddefnyddio dim ond yr offer rydym eisoes wedi dysgu am, allwn 'n bert lawer ffigur beth yn union y mae. Felly gadewch i ni ben ar at CS50 IDE a chael golwg. Iawn, felly rydym ni yma yn fy CS50 amgylchedd IDE, a byddaf yn chwyddo i mewn ychydig bach fel y gallwch weld ychydig yn fwy. Yn fy ffenestr terfynell, os wyf yn rhestru cynnwys fy cyfarwyddwr presennol gyda ls, byddwn yn gweld fy mod cael un neu ddau o ffeiliau ffynhonnell yma, gan gynnwys y Trafododd buggy1 flaenorol. Beth yn union sy'n digwydd pan Yr wyf yn ceisio rhedeg buggy1. Wel gadewch i ni gael gwybod. Yr wyf yn teipio dot slaes, buggy, ac yr wyf daro Chofnoda. Namau segmentu. Dyw hynny ddim yn dda. Os cofiwch, yn fai segmentiad nodweddiadol yn digwydd pan fyddwn yn cael mynediad cof nad ydym yn caniatáu i gyffwrdd. Rydym wedi cyrraedd rywsut y tu allan i'r terfynau o'r hyn y mae'r rhaglen, mae'r compiler, wedi rhoi i ni. Ac felly yn barod fod 'na cliw i gadw yn y blwch offer wrth i ni ddechrau ar y broses debugging. Rhywbeth wedi mynd ychydig o'i le yma. Mae pob hawl, felly gadewch i ni ddechrau i fyny yr amgylchedd GDB a gweld os gallwn chyfrif i maes beth yn union yw'r broblem. Rydw i'n mynd i glirio fy sgrîn, ac yr wyf i'n mynd i deipio GDB unwaith eto, i fynd i mewn i'r amgylchedd GDB, ac enw'r rhaglen yr wyf am i debug, buggy1. Rydym yn cael ychydig neges, darllen symbolau o buggy1, ei wneud. Y cyfan sydd ei olygu yw ei dynnu ynghyd yr holl o'r cod, ac yn awr mae wedi cael ei llwytho i mewn GDB, ac mae'n barod i fynd. Yn awr, beth ydw i am ei wneud? A ydych yn cofio yr hyn y mae'r cam cyntaf fel arfer yw ar ôl fy mod tu mewn amgylchedd hwn? Gobeithio, dywedasoch osod pwynt egwyl, gan fod mewn gwirionedd dyna yr wyf am ei wneud. Yn awr, nid oes gennyf y cod ffynhonnell ar gyfer hyn o fy mlaen, sydd yn ôl pob tebyg nid yw'r achos defnydd nodweddiadol, gyda llaw. Mae'n debyg y byddwch yn gwneud hynny. Felly dyna dda. Ond gan dybio nad ydych, beth sydd yr un swyddogaeth eich bod yn gwybod yn bodoli ym mhob rhaglen C sengl? Waeth pa mor fawr neu pa mor gymhleth y mae, y swyddogaeth hon yn bendant yn bodoli. Main, dde? Felly yn methu dim arall, gallwn gosod pwynt torri yn y prif. Ac eto, gallwn i jyst deipio torri prif, yn hytrach na b. Ac os ydych chi'n chwilfrydig, os ydych byth deipio allan gorchymyn hir ac yna sylweddoli bod chi teipio y peth anghywir, a'ch bod am gael gwared o'r holl fel yr wyf newydd y gwnaeth, y gallwch eu cymryd Rheoli U, a fydd dileu popeth a dod â chi'n ôl i gychwyn y llinellau cyrchwr. Mae llawer cyflymach na dim ond dal i lawr y dileu, neu daro ei griw o weithiau drosodd. Felly, byddwn yn gosod pwynt torri ar mhrif. Ac fel y gwelwch, mae'n dweud ein bod i wedi gosod pwynt torri ar buggy1.c ffeil, ac i bob golwg y llinell gyntaf o god brif linell yn saith. Unwaith eto, nid oes gennym y ffeil ffynhonnell yma, ond byddaf yn cymryd yn ganiataol ei fod yn dweud wrthyf y gwir. Ac yna, Im 'jyst yn ceisio ac yn rhedeg y rhaglen, r. Rhaglen Cychwyn. Mae pob hawl, felly neges hon yn ychydig yn cryptig. Ond yn y bôn yr hyn sy'n digwydd yma yw mai dim ond yn dweud wrthyf fy mod i wedi taro fy egwyl pwynt, torri Rhif pwynt 1. Ac yna, y llinell o god, dim ffeil neu cyfeiriadur o'r fath. Yr unig reswm y Rwy'n gweld y neges yw oherwydd fy mod yn anfwriadol dileu fy ffeil buggy.c. Os yw fy ffeil buggy1.c yn bodoli yn y cyfeiriadur cyfredol, bod hawl llinell yno byddai mewn gwirionedd ddweud wrthyf beth y llinell o god yn llythrennol yn darllen. Yn anffodus, yr wyf yn dileu hi. Rydym yn mynd i gael i fath o lywio drwy hyn ychydig yn fwy blindly. Iawn, felly gadewch i ni weld, beth Nid wyf am ei wneud yma? Wel, hoffwn wybod beth lleol efallai newidynnau ar gael i mi. Rydw i wedi dechrau fy rhaglen. Gadewch i ni weld beth allai fod initialized eisoes i ni. Yr wyf yn teipio pobl leol Info, dim bobl leol. Mae pob hawl, fel nad yn gwneud hynny rhoi tunnell o wybodaeth i mi. Gallwn roi cynnig ac argraffu newidyn, ond nid wyf yn gwybod unrhyw enwau amrywiol. Gallwn roi cynnig olrhain yn ôl, ond rwy'n tu mewn prif, felly yr wyf yn gwybod nad wyf wedi gwneud swyddogaeth alwad arall ar hyn o bryd. Felly, yn edrych fel fy unig opsiynau sydd i ddefnyddio n neu hynny ac yn dechrau i ddeifio i mewn. Rydw i'n mynd i ddefnyddio n. Felly, yr wyf yn teipio n. O fy diar, yr hyn sy'n digwydd yma. Rhaglen a dderbyniwyd signalau, SIGSEGV fai segmentu, ac yna criw cyfan o bethau. Rwy'n barod llethu. Wel, mae mewn gwirionedd yn llawer i'w dysgu yma. Felly beth mae hyn yn ei ddweud wrthym? Yr hyn mae'n ei ddweud wrthym yw, mae'r rhaglen hon yn fin, ond nid yw eto, fai SEG. Ac yn arbennig, dw i'n mynd i chwyddo i mewn hyd yn oed ymhellach fan hyn, mae'n ymwneud i SEG fai am rywbeth o'r enw strcmp. Nawr, efallai nad ydym wedi trafod swyddogaeth hon yn helaeth. Ond mae'n yw-- am nad ydym yn mynd i siarad am bob swyddogaeth sy'n yn bodoli yn y safon C library-- ond maen nhw i gyd ar gael i chi, yn enwedig os ydych yn cymryd edrych ar reference.cs50.net. Ac strcmp yn wirioneddol pwerus swyddogaeth sy'n bodoli y tu mewn y pennawd string.h ffeil, sydd yn header ffeil sy'n cael ei neilltuo i swyddogaethau bod gwaith gyda a thrin llinynnau. Ac yn benodol, yr hyn strcmp wneud yw mae'n cymharu gwerthoedd dau llinynnau. Felly rwy'n ar fin segmentu fai ar alwad i strcmp mae'n ymddangos. Yr wyf yn taro n, ac yn wir yr wyf yn cael y neges, rhaglen i ben gyda SIGSEGV signal fai segmentu. Felly nawr Fi 'n weithredol wedi ffawtiau SEG, ac mae fy rhaglen wedi 'n bert llawer rhoi'r gorau yn effeithiol. Mae hyn yn ddiwedd y rhaglen. Mae'n torri i lawr, ei chwalu. Felly nid oedd llawer, ond yr wyf yn mewn gwirionedd oedd yn dysgu cryn dipyn o'r profiad bach hwn. Yr hyn yr wyf wedi ei ddysgu? Wel, fy rhaglen damweiniau 'n bert lawer ar unwaith. Fy rhaglen damweiniau ar a ffonio i strcmp, ond yr wyf yn Nid oes rhaid i unrhyw newidynnau lleol yn fy rhaglen ar y pryd y mae'n damweiniau. Felly beth llinyn, neu llinynnau, allwn yn fy myw yn cymharu. Os nad oes gennyf unrhyw leol newidynnau, efallai y byddwch dybio fy mod have-- yno efallai yn newidyn byd-eang, a allai fod yn wir. Ond yn gyffredinol, mae'n ymddangos fel mod i'n cymharu i rywbeth nad yw'n bodoli. Felly gadewch i ni ymchwilio bod ychydig yn bellach. Felly, yr wyf i'n mynd i glirio fy sgrin. Rydw i'n mynd i roi'r gorau iddi allan o'r Amgylchedd GDB am eiliad. A dwi'n meddwl, OK, felly mae dim newidynnau lleol yn fy rhaglen. Tybed efallai Im 'i fod i basio mewn llinyn fel ymresymiad llinell orchymyn. Felly gadewch i ni jyst profi hyn allan. Nid wyf wedi gwneud hyn o'r blaen. Gadewch i ni weld os efallai os byddaf yn rhedeg y rhaglen hon gyda ymresymiad llinell orchymyn y mae'n gweithio. Huh, dim bai segmentu yno. 'I jyst dweud wrtha i fod fy mod cyfrifedig allan. Felly efallai mai dyna y atgyweiria yma. Ac yn wir, os wyf yn mynd yn ôl ac edrych ar y cod ffynhonnell gwirioneddol ar gyfer buggy1.c, mae'n ymddangos fel pe hyn rwy'n ei wneud yw Fy mod yn gwneud galwad i strcmp heb gwirio a yw mewn gwirionedd argv [1] yn bodoli. Mae hyn mewn gwirionedd y cod ffynhonnell ar gyfer buggy1.c. Felly beth Fi 'n sylweddol angen i ni wneud yma at atgyweiria fy rhaglen, gan dybio Mae gen i'r ffeilio o fy mlaen, yw i ddim ond ychwanegu siec i wneud yn siwr bod argc yn hafal i 2. Felly yr enghraifft hon, unwaith eto, fel y dywedais, ychydig yn ddyfeisgar, dde? Nad ydych yn mynd yn gyffredinol i yn ddamweiniol dileu eich cod ffynhonnell ac mae'n rhaid wedyn i roi cynnig a debug rhaglen. Ond gobeithio, rhoddodd chi darlun o'r mathau o bethau sy'n gallech fod yn meddwl am fel eich bod yn debugging eich rhaglen. Beth yw gyflwr materion yma? Pa newidynnau yn ei wneud i mi rhaid hygyrch i mi? Ble yn union yw fy rhaglen chwilfriwio, ar ba lein, ar ba alwad i ba swyddogaeth? Pa fath o gliwiau mae hynny'n ei roi i mi? A dyna yn union yr math o feddylfryd sy'n eich Dylid mynd i mewn pan fyddwch chi meddwl am debugging eich rhaglenni. Rwy'n Doug Lloyd. Mae hyn yn CS50.