DOUG LLOYD: Alle reg GDB. Wat is dit presies? So GDB, wat staan vir die GNU Debugger, is 'n ongelooflike hulpmiddel wat regtig ons kan gebruik om ons te help ontfout ons programme, of uit te vind waar dinge verkeerd gaan in ons programme. GDB is ongelooflik kragtig, maar die uitset en interaksie met dit kan 'n bietjie kripties. Dit is gewoonlik 'n command line instrument, en dit kan 'n baie van die boodskappe te gooi by jou. En dit kan soort van moeilik om ontleed presies wat aangaan. Gelukkig het ons stappe geneem om hierdie probleem op te los vir jou as jy deur CS50. As jy nie die gebruik van die grafiese debugger, wat my kollega Dan Armandarse het nogal gepraat 'n bietjie oor 'n video wat moet hier wees nou, kan jy nodig het om hierdie opdrag lyn gebruik gereedskap om te werk met GDB. As jy werk in die CS50 IDE, het jy nie nodig om dit te doen. Maar as jy nie werk in die CS50 IDE, dalk met 'n weergawe van CS50 toestel, of 'n ander Linux bedryfstelsel stelsel met GDB geïnstalleer op dit, jy mag nodig wees om te gebruik hierdie command line gereedskap. En omdat jy dalk het om dit te doen, is dit nuttige net om te verstaan ​​hoe GDB werk uit die opdrag lyn. Maar weereens, as jy die gebruik van die CS50 IDE, jy kan die grafiese debugger gebruik wat gebou in die IDE. So dinge gaan met te kry GDB, die ontfouting begin proses van 'n spesifieke program moet alles wat jy doen is tik GDB gevolg deur die program naam. So byvoorbeeld, as jou program is hello, jy sal GDB hallo tik. Wanneer jy dit doen, jy gaan om te trek die GDB omgewing. Jou vinnige sal verander, en in plaas van om dit gewoonlik wat is wanneer jy dinge tik volgens die bevel line-- ls, cd-- al jou tipiese Linux instruksies, jou vinnige sal verander, waarskynlik, iets soos hakies GDB hakies. Dit is jou nuwe GDB vinnige, want jy binne die GDB omgewing. Sodra binnekant van die omgewing, daar is twee groot gebooie dat jy waarskynlik sal gebruik in die volgende volgorde. Die eerste is b, wat is kort vir pouse. En na jou, jy tipies tipe B Tik die naam van 'n funksie, of as jy gebeur om te weet rondom wat lyn nommer jou program begin om op te tree 'n bietjie vreemd, kan jy 'n lyn te tik getal daar ook. Wat b, of breek, doen is dit laat jou program om te hardloop totdat 'n sekere punt, naamlik die naam van die funksie wat jy spesifiseer of die lyn nommer wat jy spesifiseer. En op daardie punt, is dit sal uitvoering vries. Dit is 'n baie goeie ding, want keer uitvoering is gevries, kan jy baie stadig begin stap vir stap deur jou program. Tipies, as jy nie hardloop jou programme, hulle is redelik kort. Gewoonlik, jy dot streep tik alles die naam van jou program is, druk Enter, en voor jy kan knip, jou program is al klaar. Dit is nie regtig 'n baie tyd om te probeer en uit te vind wat verkeerd gaan. So dit regtig in staat wees om dinge stadiger af deur die oprigting van 'n breek punt met b, en dan trap in. Dan wanneer jy jou breek gestel het punt, kan jy die program uitvoer. En as jy enige het command line argumente, jy hulle hier spesifiseer, nie wanneer jy tik GDB jou program naam. Jy spesifiseer al die command line argumente deur r, of hardloop, en dan argumente ookal command line wat jy nodig het binnekant van jou program. Daar is 'n aantal ander regtig belangrike en nuttige opdragte binnekant van die BBP omgewing. So laat my net vinnig gaan oor 'n paar van hulle. Die eerste is N, wat is kort vir die volgende, en jy kan tik volgende plaas van N, beide sal werk. En dit is net die snelskrif. En as jy het waarskynlik reeds gekry gebruik om, in staat is om dinge te tik korter is oor die algemeen beter. En wat dit sal doen, is dit sal stap vorentoe een blok van die kode. So dit sal vorentoe te beweeg totdat 'n funksie oproep. En dan in plaas van duik in daardie funksie en gaan deur al wat funksioneer kode, sal dit net die funksie. Die funksie sal genoem word. Dit sal alles doen wat sy werk is. Dit sal 'n waarde om terug te keer die funksie dat dit genoem. En dan sal jy op die beweeg volgende reël van daardie roeping funksie. As jy wil om te stap binnekant van die funksie, in plaas van net ' dit uit te voer, veral as jy dink dat die probleem dalk binnekant van daardie funksie lê, jy kan, natuurlik, stel 'n breek wys binnekant van daardie funksie. Of as jy reeds hardloop, jy kan gebruik s om vorentoe een lyn van kode stap. So sal dit stap in en duik in funksies, in plaas van net die voer en die voortsetting van die funksie dat jy is in vir ontfouting. As jy al ooit wil weet die waarde van 'n veranderlike, jy kan tik p, of Print, en dan die veranderlike naam. En dit sal druk vir jou, binnekant van die GDB omgewing, die naam van die veranderlike wat you-- verskoon me-- die waarde van die veranderlike wat jy genoem het. As jy wil om die waardes van elke leer ken plaaslike veranderlike toeganklik vanaf waar jy tans in jou program, kan jy tik info locals. Dit is 'n baie vinniger as tik p en dan ook al, notering uit al die veranderlikes wat jy ken bestaan ​​nie. Jy kan tik info locals, en dit sal alles uit te druk vir jou. Volgende is bt, wat kort vir terug te spoor. Nou, in die algemeen, veral vroeg in CS50, sal jy nie regtig 'n geleentheid om BT, of terug te spoor gebruik, omdat jy nie met funksies wat noem ander funksies. Jy kan belangrikste oproep van 'n het funksie, maar dit is waarskynlik nie. Jy hoef nie die ander funksie 'n ander funksie, bel wat roep 'n ander funksie, en so aan. Maar as jou programme meer kompleks, en veral wanneer jy begin werk met rekursie, terug te spoor kan 'n baie nuttige manier om jou te laat wees soort kry 'n paar konteks vir waar Ek is in my program. So sê jy het jou kode geskryf, en jy weet dat 'n funksie belangrikste oproepe f, wat 'n funksie roep g, wat 'n funksie h noem. So ons het 'n paar lae nes hier aangaan nie. As jy binne jou GDB omgewing, en jy weet jou binnekant van h, maar jy vergeet oor wat jy het om te waar jy are-- jy kan tik BT, of terug te spoor, en dit sal druk h, g, f belangrikste, saam met sommige ander inligting wat gee jou 'n idee dat OK belangrikste genoem f, f genoem g, g genoem h, en dit is waar ek tans is in my program. So dit kan regtig nuttig, veral as die kriptiese-heid van GDB 'n bietjie oorweldigend, om uit te vind presies waar dinge. Ten slotte, wanneer jou program gedoen word, of wanneer jy klaar is ontfout en jy wil om te stap weg uit die GDB omgewing, dit help om te weet hoe om te kry uit dit uit. Jy kan tik q, of afsluit, uit te kry. Nou, voordat video vandag se Ek het 'n karretjie program voorberei genoem buggy1, wat ek saamgestel uit 'n lêer bekend as buggy1.c. Soos jy kan verwag, is hierdie program is in werklikheid karretjie. Iets verkeerd gaan wanneer ek probeer hardloop nie. Nou, helaas, ek per ongeluk geskrap my buggy1.c lêer, so ten einde vir my om uit te vind wat verkeerd gaan met hierdie program, Ek gaan om te gebruik GDB soort blindelings probeer opgevolg deur hierdie program uit te vind presies wat verkeerd gaan. Maar met net die gereedskap ons het reeds geleer het oor, ons kan pretty much figuur presies wat dit is. So laat kop bo aan CS50 IDE en het 'n blik. OK, so ons is hier in my CS50 IDE omgewing, en ek sal in 'n bietjie zoom sodat jy kan 'n bietjie meer te sien. In my terminale venster, as ek 'n lys van die inhoud van my huidige direkteur met ls, sal ons sien dat ek het 'n paar van die bron lêers hier, insluitend die voorheen bespreek buggy1. Wat presies gaan oor wanneer Ek probeer en hardloop buggy1. Wel, laat ons uit te vind. Ek tik dot streep karretjie, en ek druk Enter. Segmentering foute. Dit is nie goed nie. As jy onthou, 'n segmentering skuld tipies vind plaas wanneer ons toegang geheue dat ons nie toegelaat om aan te raak. Ons het een of ander manier bereik buite die grense van wat die program, die samesteller, het ons gegee het. En so al is dit 'n leidraad in die toolbox hou as ons begin die ontfouting proses. Iets het gegaan hier 'n bietjie verkeerd. Alle reg, so laat ons begin die GDB omgewing en kyk of ons kan uitvind wat presies die probleem is. Ek gaan my skerm skoon te maak, en ek gaan om te tik GDB weer na die GDB omgewing betree, en die naam van die program wat ek wil ontfout, buggy1. Ons kry 'n bietjie boodskap lees simbole van buggy1, gedoen. Al wat beteken dit getrek saam al van die kode, en nou is dit is in gelaai GDB, en dit is gereed om te gaan. Nou, wat wil ek doen? Het jy onthou wat die eerste stap is tipies nadat ek is binnekant van hierdie omgewing? Hopelik het gesê jy stel 'n breek punt, want in die feit dat dit is wat ek wil doen. Nou, ek het nie die bronkode vir hierdie in die voorkant van my, wat is waarskynlik nie die tipiese gebruik geval, deur die manier. Jy sal waarskynlik. So dit is goed. Maar die veronderstelling dat jy dit nie doen nie, wat is die een funksie dat jy weet bestaan ​​in elke enkele C-program? Maak nie saak hoe groot of hoe ingewikkeld dit is, is hierdie funksie beslis bestaan. Main, reg? So versuim alles, ons kan stel 'n breek punt belangrikste. En weer, ek kon net tik breek belangrikste, in plaas van b. En as jy nuuskierig is, as jy ooit tik 'n lang opdrag en dan besef dat jy getik die verkeerde ding, en jy wil ontslae te raak van alle ek nou net gedoen het, jy kan beheer neem U, wat sal verwyder alles en bring jou terug na die begin van die wyser lyne. 'N baie vinniger as net hou die verwyder, of slaan dit 'n klomp keer oor. So sal ons 'n breek punt stel by die hoof. En soos jy kan sien, dit sê ons het stel 'n breek punt lêer buggy1.c, en blykbaar die eerste reël van die kode van die belangrikste is lyn sewe. Weereens, ons het nie die bron lêer hier, maar ek sal aanvaar dat dit vertel my die waarheid. En dan, ek is net probeer en hardloop die program, r. Begin program. Alle reg, sodat hierdie boodskap is 'n bietjie kripties. Maar basies wat is hier gebeur, is dit net vertel my ek het my break getref punt, breek punt nommer 1. En dan, dat die lyn van die kode, geen sodanige lêer of gids. Die enigste rede dat Ek sien dat die boodskap is omdat ek per ongeluk geskrap my buggy.c lêer. As my buggy1.c lêer bestaan in die huidige gids, dat die lyn reg daar eintlik my vertel wat die reël van die kode letterlik lees. Ongelukkig het ek dit verwyder. Ons gaan hê om soort navigeer deur middel van hierdie 'n bietjie meer blindelings. OK, so laat ons sien, wat wil ek hier doen? Wel, ek sou graag wou weet wat die plaaslike veranderlikes miskien is beskikbaar vir my. Ek het my program begin. Kom ons kyk wat kan wees reeds geïnisialiseer vir ons. Ek tik Info locals, geen plaaslike bevolking. Alle reg, sodat nie gee my 'n ton van inligting. Ek kan probeer en druk 'n veranderlike, maar ek weet nie enige veranderlike name. Ek kon 'n spoor terug te probeer, maar ek is binnekant van hoof, so ek weet ek het nie gemaak ander funksie oproep nou. So lyk my enigste opsies is gebruik N of so en begin om te duik in. Ek gaan om te gebruik n. So ek tik n. Oh my gosh, wat gaan hier aan. Program ontvang seine, SIGSEGV segmentering skuld, en dan 'n hele klomp van die dinge. Ek is reeds oorweldig. Wel, daar is eintlik 'n baie hier geleer word. So wat beteken dit vir ons? Wat dit vir ons sê is, is hierdie program is oor, maar het nog nie, seg skuld. En in die besonder, ek gaan in selfs verder hier om te vergroot, dit gaan oor om fout seg oor iets genoem strcmp. Nou, kan ons nie bespreek hierdie funksie omvattend. Maar dit is-- omdat ons nie gaan om te praat oor elke funksie wat bestaan ​​in die C standaard library-- maar hulle is almal beskikbaar vir jou, veral as jy 'n te neem kyk na reference.cs50.net. En strcmp is 'n baie kragtige funksie wat binnekant bestaan van die string.h kop lêer, wat is 'n kop- lêer wat word gewy aan funksies dat die werk met en manipuleer snare. En in die besonder, wat strcmp doen, is Dit vergelyk die waardes van twee stringe. So ek is op die punt om skuld segmentering op 'n oproep om strcmp dit lyk. Ek getref N, en in werklikheid Ek kry die boodskap, program beëindig met sein SIGSEGV segmentering skuld. So nou Ek het eintlik seg myn, en my program het redelik veel effektief opgegee. Dit is die einde van die program. Dit gebreek het, dit neergestort het. So was nie 'n baie, maar ek eintlik het nogal 'n bietjie te leer Van hierdie min ondervinding. Wat het ek geleer? Wel, my program ineenstortings pretty much onmiddellik. My program ineenstortings op 'n oproep tot strcmp, maar ek moenie enige plaaslike veranderlikes nie in my program teen die tyd dat dit omval. So, wat string, of snare, Ek kon moontlik wees vergelyk. As ek nie 'n plaaslike het veranderlikes, kan jy vermoed dat ek daar is 'n have-- miskien globale veranderlike, wat ware kan wees. Maar oor die algemeen, blyk dit asof ek vergelyk iets wat nie bestaan ​​nie. So laat ondersoek dat 'n bietjie verder. So ek gaan my skerm skoon te maak. Ek gaan om op te hou uit die GDB omgewing vir 'n tweede. En ek dink, OK, so daar is geen plaaslike veranderlikes in my program. Ek wonder of miskien is ek veronderstel om te slaag in 'n string as 'n command line argument. So laat ons net toets dit uit. Ek het nie hierdie voorheen gedoen. Kom ons kyk of miskien as ek hierdie program met 'n command line argument dit werk. Huh, geen segmentering skuld daar. Dit het vir my gesê dat ek net gedink dit uit. So miskien is dit hier die fix. En inderdaad, as ek gaan terug en kyk na die werklike bron-kode vir buggy1.c, dit lyk asof dit wat ek doen is Ek maak 'n oproep na strcmp sonder kontroleer of in werklikheid argv [1] bestaan. Dit is eintlik die bron-kode vir buggy1.c. So, wat ek het regtig nodig om doen hier om my program op te los, veronderstelling Ek het die lêer in die voorkant van my, is net voeg 'n tjek te maak seker dat argc is gelyk aan 2. So hierdie voorbeeld, weer, soos ek gesê het, is 'n bietjie slinks, reg? Jy oor die algemeen gaan nie per ongeluk jou bronkode te verwyder en dan te probeer en ontfout die program. Maar hopelik, dit het jy 'n illustrasie van die soort van dinge wat jy kan dink oor as jy ontfouting jou program. Wat is die stand van sake hier? Wat veranderlikes ek het toeganklik vir my? Waar presies is my program gekraak, op watter lyn, oor wat oproep tot watter funksie? Watter soort leidrade nie wat my te gee? En dit is presies die soort ingesteldheid wat jy moet wees om in wanneer jy dink oor die opsporing van jou programme. Ek is Doug Lloyd. Dit is CS50.