DOUG Lloyd: Në rregull Gdb. Çfarë është kjo saktësisht? Pra GDB, e cila qëndron për Debugger GNU, është një mjet me të vërtetë awesome që ne mund të përdorin për të na ndihmuar debug programet tona, ose të gjetur se ku gjërat janë do të gabuar në programet tona. GDB është amazingly fuqishëm, por prodhimit dhe ndërveprimin me të mund të jetë pak i fshehtë. Kjo është zakonisht një linjë mjet command, dhe ajo mund të hedhin një shumë mesazhe në ju. Dhe kjo mund të lloj i vështirë për kuptoj saktësisht se çfarë po ndodh. Hapat për fat të mirë, ne kemi marrë për të rregulluar këtë problem për ju si ju punoni me CS50. Nëse ju nuk jeni duke përdorur grafike Rregullues, i cili kolegu im Dan Armandarse ka folur mjaft pak rreth në një video që duhet të jetë e gjatë këtu tani, ju mund të kenë nevojë të përdorni këto command line mjete për të punuar me GDB. Në qoftë se ju jeni duke punuar në CS50 IDE, ju nuk keni nevojë për të bërë këtë. Por në qoftë se ju nuk jeni që punojnë në CS50 IDE, ndoshta duke përdorur një version të e CS50 Appliance, apo tjetër Linux veprojnë sistem me GDB instaluar në të, ju mund të kenë nevojë të përdorin Këto mjete command line. Dhe kur ju e fuqisë duhet për të bërë këtë, është e e dobishme vetëm për të kuptuar se si GDB punon nga vija e komandës. Por, përsëri, në qoftë se ju jeni duke përdorur IDE CS50, ju mund të përdorni Rregullues grafike që është ndërtuar në IDE. Pra, për të marrë gjërat e sipër me GDB, për të filluar debugging Procesi i a veçanti program, të gjithë ju duhet të bëni është lloji Gdb ndiqet me emrin e programit. Kështu për shembull, në qoftë se programi juaj është i Përshëndetje, ju do të tipit GDB përshëndetje. Kur ju bëni këtë, ju do të jeni për të tërhequr deri mjedisin GDB. Shpejtë juaj do të ndryshojë, dhe në vend që të është ajo që zakonisht është kur ju shkruani gjëra në ls e line-- komandës, cd-- gjithë tipike tuaj Komandat Linux, shpejtë tuaj do të ndryshojë për të, ndoshta, diçka si kllapa kllapa Gdb. Kjo është tuaj të re GDB shpejtë, sepse ju jeni brenda mjedisit gdb. Pasi brenda atij mjedisi, ka dy komandat kryesore që ju ndoshta do të përdorni në rendin e mëposhtëm. Parë është b, e cila është e shkurtër për pushim. Dhe pasi të keni tipit B, ju zakonisht shkruani emrin e një funksioni, ose në qoftë se ju ndodh që të dini rreth çfarë numri linjë programi juaj ka filluar të sillen pak i çuditshëm, ju mund të shtypni një linjë Numri edhe atje. Çfarë b, ose pushim, nuk është ai lejon programin tuaj për të drejtuar deri në një pikë të caktuar, domethënë, emri i funksionit që ju të specifikojë ose vija numër që ju specifikoni. Dhe në atë moment, atë do të ngrijë ekzekutimin. Kjo është një gjë me të vërtetë e mirë, sepse dikur ekzekutimi ka qenë i ngrirë, ju mund të fillojnë të shumë ngadalë hap përmes programit tuaj. Në mënyrë tipike, në qoftë se ju keni qenë running programet tuaja, ata janë mjaft të shkurtër. Zakonisht, ju shkruani dot plagë çfarëdo emri i programit tuaj është, hit Enter, dhe para se ju mund të injoroj, tuaj Programi ka mbaruar tashmë. Kjo nuk është me të vërtetë një shumë kohë për të provuar dhe të kuptoj se çfarë po ndodh gabuar. Pra, me të vërtetë të jetë në gjendje për të ngadalësuar gjëra poshtë duke vendosur një pikë pushim me b, dhe pastaj shkelën në. Pastaj një herë ju keni vendosur pushim tuaj pikë, ju mund të drejtuar programin. Dhe në qoftë se ju keni ndonjë argumente command line, ju specifikoni ato këtu, jo kur ju shkruani GDB emrin programi juaj. Ju specifikoni të gjitha linjë e komandës Argumentet duke marrë r, ose të drejtuar, dhe pastaj argumentet e linjës çfarëdo komandës ju keni nevojë për brenda programit tuaj. Ka një numër të tjera të vërtetë komandat të rëndësishme dhe të dobishme brenda mjedisit të PBB-së. Pra, më lejoni vetëm të shpejt shkoj për disa prej tyre. Parë është n, e cila është e shkurtër për vazhdim, dhe ju mund të shtypni tjetër në vend të n, të dy do të punojë. Dhe kjo është vetëm stenografi. Dhe si ju ndoshta keni marrë tashmë përdoret për të, duke qenë në gjendje të shkruani gjëra shkurtër në përgjithësi është më e mirë. Dhe çfarë do të bëjë është ajo do të hap përpara një bllok i kodit. Pra, kjo do të ecë përpara derisa një telefonatë funksion. Dhe pastaj në vend të zhyten në atë funksion dhe duke kaluar nëpër të gjithë se funksionet Kodi, ai thjesht do të ketë funksionin. Funksioni do të quhet. Kjo do të bëjë çdo gjë që puna e saj është. Ajo do të kthehet një vlerë të funksioni që e quajti atë. Dhe pastaj ju do të lëvizin në të Linja tjetër e quajtur atë funksion. Nëse ju doni të hap brenda funksionit, në vend të vetëm duke pasur ajo ekzekutojë, veçanërisht në qoftë se ju mendoni se problemi mund të qëndrojnë brenda këtij funksioni, ju mund të, natyrisht, të vendosur një pushim pika brenda atë funksion. Ose në qoftë se ju jeni duke punuar, ju mund të përdorin s për të hap një linjë të kodit. Pra, kjo do të hap në dhe pikiatë në funksionet, në vend të vetëm kanë të ekzekutojë dhe duke vazhduar për në funksion që ju jeni në për debugging. Nëse ju ndonjëherë të dëshironi të dini vlera e një variable, ju mund të shtypni p, ose të shtypura, dhe pastaj emrin e ndryshueshme. Dhe kjo do të shtypura jashtë për ju, brenda mjedisit gdb, emri i variablit, që ju, duke filluar justifikim me-- vlerën e variablit që e keni emrin. Nëse doni të dini vlerat e çdo lokal ndryshueshme arritshme nga ku ju tani jeni në tuaj program, ju mund të shtypni vendasit info. Kjo është një shumë më shpejt se shtypni p dhe pastaj çfarëdo, renditur nga të gjithë të Variablat që ju e dini ekzistojnë. Ju mund të shtypni vendasit info, dhe ajo do të shtypura nga gjithçka për ju. Tjetra është bt, i cili është shkurtër për Back Trace. Tani, në përgjithësi, veçanërisht në fillim të CS50, ju nuk do të vërtetë kanë rastin për të përdorur BT, apo prapa gjurmë, sepse ju nuk jeni të paturit e funksioneve që e quajnë funksione të tjera. Ju mund të keni call kryesore e një funksion, por kjo është ndoshta ajo. Ju nuk keni atë funksion tjetër duke e quajtur një tjetër funksion, i cili e quan një funksion tjetër, dhe kështu me radhë. Por si programet tuaja të merrni më shumë komplekse, dhe veçanërisht kur ju filloni duke punuar me recursion, gjurmë prapa mund të jetë një mënyrë të vërtetë të dobishme për të ju lloj i marrë disa kontekst për ku Unë jam në programin tim. Pra, thonë se ju keni shkruar kodin tuaj, dhe ju e dini se kryesore quan një funksion f, e cila e quan një funksion G, e cila e quan një h funksion. Pra, ne kemi disa shtresa e shturë ndodh këtu. Nëse ju jeni në brendësi të mjedisin tuaj Gdb, dhe ju e dini se brenda tuaj eh, por ju të harrojmë lidhje me atë që ju mori për të ku ju are-- ju mund të shtypni BT, ose gjurmë prapa, dhe ajo do të shtypura nga h, g, f kryesor, së bashku me disa informacione të tjera, të cilat ju jep një çelës që, kryesor OK quajtur f, f quajtur g, g quajtur h, dhe kjo është ajo ku unë aktualisht jam në programin tim. Pra, ajo mund të jetë vërtetë e dobishme, sidomos si fshehtë kep e GDB bëhet pak e madhe, për të të gjetur saktësisht se ku gjërat janë. Së fundi, kur programi juaj është bërë, ose kur ju jeni bërë debugging atë dhe ju doni për të hap larg nga mjedisi gdb, ajo ndihmon të dini se si për të marrë nga ajo. Ju mund të shtypni q, ose Quit, për të marrë jashtë. Tani, para se video e sotme Kam përgatitur një program buggy quajtur buggy1, që unë hartuar nga një skedar i njohur si buggy1.c. Si mund të presin, kjo Programi është në buggy fakt. Diçka shkon keq kur unë të përpiqet dhe të drejtuar atë. Tani, për fat të keq, unë pa dashje fshihet dosjen time buggy1.c, kështu që në mënyrë për mua që të kuptoj se çfarë po ndodh gabuar me këtë program, Unë do të duhet të përdorni GDB lloj i verbërisht, duke u përpjekur për të lundruar nëpër këtë program për kuptoj se saktësisht se çfarë po ndodh gabuar. Por duke përdorur vetëm mjetet kemi mësuar tashmë rreth, ne mund të pretty much figurë pikërisht atë që është. Pra, le të kryesojë mbi të CS50 IDE dhe të kenë një vështrim. OK, kështu që ne jemi këtu në time CS50 mjedis IDE, dhe unë do të zoom në pak kështu që ju mund të shihni një pak më shumë. Në dritaren time terminal, në qoftë se unë lista përmbajtja e drejtorit tim aktual me ls, ne do të shohim që unë kanë disa fotografi burim këtu, duke përfshirë diskutuar më parë buggy1. Çfarë saktësisht ndodh kur Unë të përpiqet dhe të drejtuar buggy1. E pra, le të gjetur jashtë. Unë lloji dot plagë, buggy, dhe unë hit Enter. Gabimet segmentimit. Kjo nuk është e mirë. Nëse ju kujtohet, një faji segmentimit në mënyrë tipike ndodh kur ne Access Memory se ne nuk jeni i lejuar për të prekur. Ne kemi arritur disi jashtë kufijve e asaj programit, përpilues, na ka dhënë. Dhe kështu tashmë kjo është një çelës për të mbajtur në Toolbox si ne të fillojnë procesin debugging. Diçka ka shkuar një gabim të vogël këtu. Të gjithë të drejtë, kështu që le të fillojë deri mjedisin gdb dhe të shohim nëse ne mund të kuptoj se çfarë saktësisht problemi është. Unë jam duke shkuar për të pastruar ekranin tim, dhe unë jam duke shkuar për të tipit GDB përsëri, për të hyrë në mjedisin GDB, dhe emrin e programit që unë dua të korrigjoj, buggy1. Ne kemi marrë një mesazh të vogël, duke lexuar simbolet nga buggy1, bërë. E gjithë kjo do të thotë është e tërhequr së bashku të gjithë kodit, dhe tani ajo është e ngarkuar në GDB, dhe është gati për të shkuar. Tani, çfarë unë dua të bëj? A ju kujtohet çfarë Hapi i parë zakonisht është pasi unë jam brenda këtij mjedisi? Shpresojmë, ju seti një pikë pushim, sepse në fakt kjo është ajo që unë dua të bëj. Tani, unë nuk kam kodi burim për këtë para meje, e cila është ndoshta nuk është rasti përdorimi tipik, nga rruga. Ju ndoshta do. Pra, kjo është e mirë. Por, duke supozuar që ju nuk e bëni, çfarë është një funksion që ju e dini ekziston në çdo program të vetëm C? Pa marrë parasysh sa e madhe apo sa e komplikuar ajo është, ky funksion definitivisht ekziston. Kryesore, e drejtë? Pra, në mungesë të çdo gjë tjetër, ne mund të vendosur një pikë pushim në kryesore. Dhe përsëri, unë mund vetëm lloji thyejnë kryesor, në vend të b. Dhe në qoftë se ju jeni kurioz, nëse ju ndonjëherë shkruani një komandë të gjatë dhe pastaj të kuptojë se ju typed gjë të gabuar, dhe ju doni të merrni shpëtoj të gjithë si unë vetëm e bëri, ju mund të marrë kontrollin U, e cila do të fshini çdo gjë dhe do t'ju çoj përsëri në fillim të vijave kursorit. Një shumë më shpejt se vetëm të mbajë poshtë fshini, apo goditur atë një herë bandë mbi. Pra, ne do të caktojë një pikë pushim në kryesore. Dhe si ju mund të shihni, ajo thotë se ne kemi vendosur një pikë pushim në fotografi buggy1.c, dhe me sa duket rreshtin e parë e kodit të kryesor është linjë shtatë. Përsëri, ne nuk kemi fotografi burim këtu, por unë do të supozojmë se kjo është thënë mua të vërtetën. Dhe pastaj, unë jam vetëm duke u përpjekur dhe drejtuar programin, r. Duke filluar programin. Të gjithë të drejtë, kështu që ky mesazh është pak i fshehtë. Por në thelb ajo që është ndodh këtu është se është vetëm thënë mua unë kam goditur pushim tim pikë, break pika numër 1. Dhe pastaj, kjo linjë e kodit, nuk ka fotografi të tilla ose directory. Arsyeja e vetme që Unë jam duke parë këtë mesazh është për shkak se unë pa dashje fshihet dosjen time buggy.c. Nëse dosja ime buggy1.c ekzistuar në dosjen aktuale, kjo e drejtë nuk do të vijë në fakt më tregoni se çfarë linjë e kodit fjalë për fjalë lexon. Për fat të keq, unë fshihet ajo. Ne do të duhet të lloj të lundruar përmes kësaj pak më verbërisht. OK, kështu që le të shohim, çfarë dua të bëj këtu? E pra, unë do të doja të di se çfarë lokale Variablat ndoshta janë në dispozicion për mua. Unë kam filluar programin tim. Le të shohim se çfarë mund të jetë tashmë initialized për ne. Unë lloji vendasit info, asnjë vendasit. Të gjithë të drejtë, kështu që nuk ka më jepni një ton të informacionit. Unë mund të provoni dhe të shtypura nga një ndryshore, por unë nuk e di ndonjë emrat e ndryshueshme. Unë mund të provoni një gjurmë prapa, por unë jam brenda kryesor, kështu që unë e di unë nuk e kam bërë një tjetër telefonatë funksion tani. Pra, duket si mundësitë e mia janë vetëm për të përdorur n apo më shumë dhe të fillojnë të zhyten në. Unë jam duke shkuar për të përdorur n. Kështu që unë lloji n. Oh my gosh, çfarë po ndodh këtu. Programi ka marrë sinjale, Faji SIGSEGV segmentimit, dhe pastaj një bandë e tërë e gjëra. Unë jam tashmë të tronditur. E pra, ka në fakt një shumë për të mësuar këtu. Pra, çfarë na thotë kjo? Çfarë na tregon kjo është, ky program është për të, por nuk ka akoma, faji seg. Dhe në mënyrë të veçantë, unë jam duke shkuar për të zmadhuar edhe më tej këtu, është gati seg fajin për diçka që quhet strcmp. Tani, ne nuk mund të kemi diskutuar ky funksion gjerësisht. Por kjo is-- sepse ne nuk jemi duke shkuar për të folur në lidhje me çdo funksion që ekziston në standardin C library-- por ata janë të gjithë në dispozicion për ju, veçanërisht nëse ju merrni një shikoni në reference.cs50.net. Dhe strcmp është një të vërtetë të fuqishme Funksioni që ekziston brenda i header string skedë, e cila është një header fotografi që është i përkushtuar për funksionet që punojnë me dhe manipuluar vargjet. Dhe në mënyrë të veçantë, ajo që bën është strcmp ajo krahason vlerat e dy vargjet. Kështu që unë jam gati të Segmentimi faj në një telefonatë për të strcmp duket. I goditi n, dhe në fakt kam marrë mesazhin, Programi përfundoi me SIGSEGV sinjal faji segmentimit. Pra tani Unë në fakt kam fajësuar seg, dhe programi im ka mjaft shumë i dhënë në mënyrë efektive. Ky është fundi i programit. Ajo u ndërprenë, ai u rrëzua. Pra, nuk ishte shumë, por unë në fakt e bëri të mësojnë mjaft nga kjo përvojë pak. Çfarë kam mësuar? E pra, programi im crashes pretty much menjëherë. Programi im crashes në një thirrje për strcmp, por unë nuk kanë ndonjë variablave lokale në tim Programi në atë kohë që nuk punon. Pra, çfarë string, ose vargjet, Unë ndoshta mund të jetë krahasuar. Nëse unë nuk kam ndonjë lokal variabla, ju mund të marr me mend se unë have-- ka ndoshta një globale variabel, e cila mund të jetë e vërtetë. Por në përgjithësi, duket si unë jam krahasuar për diçka që nuk ekziston. Pra, le të hetojë që pak më tej. Kështu që unë jam duke shkuar për të pastruar ekranin tim. Unë jam duke shkuar për të lënë jashtë nga Mjedisi GDB për një të dytë. Dhe unë jam duke menduar, OK, kështu që nuk ka nuk ka ndryshore lokale në programin tim. Pyes veten në qoftë se ndoshta unë jam duke menduar për të kaluar në një varg si një argument command line. Pra, le të vetëm të provoni këtë. Unë nuk e kanë bërë këtë më parë. Le të shohim nëse ndoshta nëse unë të drejtuar këtë program me një argument command line ajo punon. Huh, jo faji segmentimit atje. Ajo vetëm më tha se unë i realizuar artistikisht it out. Pra, ndoshta kjo është fix këtu. Dhe me të vërtetë, në qoftë se unë kthehem dhe të shikojmë në kodi aktual burim për buggy1.c, duket sikur ajo që unë jam duke bërë është Unë jam duke e bërë një telefonatë të strcmp pa kontrolluar nëse në fakt argv [1] ekziston. Kjo është në fakt kodin burim për buggy1.c. Pra, ajo që unë me të vërtetë nevojë për të bëjmë këtu për të rregulluar programin tim, duke supozuar unë kam paraqesë para meje, është për të vetëm të shtoni një kontroll për të bërë sigurt se argc është e barabartë me 2. Pra ky shembull, përsëri, si i tha, është pak ndërtuar, e drejtë? Ju jeni në përgjithësi nuk do të aksidentalisht fshini kodin tuaj burim dhe pastaj duhet të provoni dhe debug programin. Por shpresojmë se, ajo i dha ju një ilustrim nga llojet e gjërave që ju mund të jetë duke menduar për si ju jeni debugging programin tuaj. Çfarë është gjendja e punëve këtu? Çfarë variabla bëjë unë duhet të arritshme për mua? Ku pikërisht është programi im crashing, në atë linjë, në atë thirrje për çfarë funksioni? Çfarë lloj të dhëna që nuk më jep mua? Dhe kjo është pikërisht lloj mendim që ju duhet të marrë në kur ju jeni duke menduar për debugging programet tuaja. Unë jam Doug Lloyd. Kjo është CS50.