>> 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.