>> DOUG LLOYD: Bone GDB.
Kio estas ĝuste?
Do GDB, kiu staras por la GNUa erarserĉilo,
Estas vere nekredebla ilo ke ni povas uzi helpi nin elpurigi niaj programoj,
aŭ trovi kie ajn estas iranta malĝustan en niaj programoj.
GDB estas mirinde potenca, sed la eligo kaj interagado kun ĝi
povas esti iomete kripta.
Ĝi estas kutime komandlinio ilo, kaj ĝi povas ĵeti multajn mesaĝojn ĉe vi.
Kaj ĝi povas ia malfacile analizi akurate kio okazas.
Feliĉe, ni prenis paŝoj ripari tiun problemon por vi
kiel vi laboras tra CS50.
Se vi ne uzas la grafikan erarserĉilo, kiun mia kolego Dan
Armandarse parolis tute iom pri en video ke
devus esti super tie ĝuste nun, vi eble bezonas
uzi tiujn komandlinio iloj por labori kun GDB.
Se vi laboras en la CS50 IDE, vi ne bezonas fari tion.
Sed se vi ne laborante en la CS50 IDE,
eble uzante versio de CS50 Appliance,
aŭ alia Linukso sistemo kun GDB instalita sur ĝi,
vi eble bezonos uzi tiujn komandlinio iloj.
>> Kaj ĉar vi eble devas fari tion, ĝi estas
utilaj nur por kompreni kiel GDB laboras de la komandlinio.
Sed denove, se vi estas uzante la CS50 IDE, vi
povas uzi la grafikan erarserĉilo kiu estas konstruita en la IDE.
Do por akiri aferojn iranta kun GDB, komenci la elpuriganta
procezo de aparta programo, ĉiuj vi devas fari
Estas tajpas GDB sekvis per la programo nomo.
Do ekzemple, se via programaro estas saluton, vi tajpas GDB saluton.
>> Kiam vi faros tion, vi tuj tiri supren la GDB medio.
Via prompto ŝanĝos, kaj anstataŭ esti kio kutime
Estas kiam vi tajpas aferoj ĉe la komando line-- ls,
cd-- ĉiuj viajn tipa Linukso komandoj, via prompt
ŝanĝos, probable, io kiel krampoj GDB krampoj.
Tio estas via nova GDB prompto, ĉar vi estas ene la GDB medio.
Fojo ene de tiu medio, Tie estas du gravaj komandoj
ke vi probable uzos en la jena ordo.
>> La unua estas b, kiu estas mallonga por paŭzo.
Kaj post vi entajpas b, vi tipe tajpi la nomon de funkcio,
aŭ se vi hazarde scias ĉirkaŭ kio lininumeron
via programo estas komencanta konduti iom stranga,
vi povas tajpi linion numeron tie ankaŭ.
Kio b, aŭ paŭzo, faras estas tio permesas via programo
kuri supren ĝis certa punkto, nome, la nomo de la funkcio
ke vi specifas aŭ la linio numeron kiun vi specifas.
>> Kaj je tiu punkto, ĝi glaciiĝas ekzekuto.
Jen vere bona afero, ĉar iam ekzekuto estis frostigita,
vi povas komenci tre malrapide paŝi tra via programo.
Tipe, se vi jam estis kuranta viaj programoj, ili estas sufiĉe mallonga.
Kutime, vi tajpas dot oblikvo ajn la nomo de via programo, batis Enter,
kaj antaŭ ol vi povos blink, via programo estas jam finita.
Ĝi ne estas vere multan tempon provi kaj eltrovi kio okazas erara.
Do ĝi vere povos malrapidigi aferoj malsupren per opcio ripozon punkto kun b,
kaj tiam intervenanta.
>> Tiam iam vi metis vian ripozon punkto, vi povas kuri la programon.
Kaj se vi havas neniun komandlinio argumentoj,
vi specifas ilin tie, ne kiam vi tajpas GDB via programo nomo.
Vi specifas ĉiuj komandlinio argumentojn per prenante r, aŭ kuro,
kaj tiam ajn komandliniajn argumentojn vi bezonas ene de via programo.
Estas nombro de aliaj vere gravaj kaj utilaj komandoj
ene de la MEP medio.
Do mi nur rapide transiru kelkajn.
>> La unua estas n, kiu estas mallonga por sekva, kaj vi povas tajpi sekva anstataŭ n,
ambaŭ laborus.
Kaj estas simple la stenografio.
Kaj kiel vi probable jam akiris kutimis, povi tajpi aferoj
mallonga estas ĝenerale bona.
Kaj kio faros estas ĝi malebligos paŝi antaŭen unu bloko de kodo.
Do ĝi movos antaŭen ĝis funkcio alvokon.
Kaj tiam anstataŭ plonĝado en tiun funkcion
kaj iranta tra ĉiuj tiu funkcioj kodon, ĝi nur havas la funkcion.
>> La funkcio estos vokita.
Ĝi faros kion ajn lia faro.
Ĝi revenos valoron al la funkcio kiu nomis ĝin.
Kaj tiam vi pluiru al la sekva linio de tiu voko funkcio.
Se vi volas paŝi ene de la funkcio,
anstataŭ nur havi ĝi ekzekutas, speciale
se vi opinias, ke la problemo povus kuŝi ene de tiu funkcio,
Vi povus, kompreneble, starigis ripozon atentigi interne de tiu funkcio.
Aŭ se vi jam kurante, vi povas uzi s paŝi antaŭen unu linio de kodo.
>> Do tiu estos paŝo en kaj plonĝo en funkcioj,
anstataŭ ĝuste havas la ekzekuti kaj vi daŭrigas en la funkcio
ke vi jam partoprenos elpuriganta.
Se vi iam volis scii la valoro de variablo,
vi povas tajpi p, aŭ Print, kaj tiam la variablo nomo.
Kaj tio estos presi al vi, ene de la GDB medio,
la nomo de la variablo, ke you-- Pardonu kunulinon la valoro de la variablo
ke vi nomiĝis.
Se vi volas scii la valoroj de ĉiu loka variablo atingebla de kie
vi aktuale estas en via programo, vi povas tajpi info lokuloj.
Ĝi estas multe pli rapida ol tajpado p kaj tiam cxio,
on el ĉiuj variabloj ke vi scias ekzistis.
Vi povas tajpi info lokuloj, kaj ĝi presos ĉion por vi.
Poste supre estas bt, kiu estas mallongigo Reen Trace.
Nun, ĝenerale, precipe frua en CS50,
vi ne vere havas okazo uzi bt, aŭ Reen Trace,
ĉar vi ne havas funkciojn ke nomas aliaj funkcioj.
>> Vi povus havi ĉefan voki funkcion, sed tio estas probable.
Vi ne havas tiun alian funkcion nomante alian funkcion, kiu
vokas alian funkcion, kaj tiel plu.
Sed kiel via programoj akiri pli kompleksa, kaj aparte
kiam vi komencas labori kun rekursio, reen spuro
povas esti vere utila maniero lasi vin speco de akiri iuj kunteksto sed kie
Mi estas en mia programo.
Do diru vi skribis vian kodon, kaj vi scias ke ĉefa nomas funkcio
f, kiu nomas funkcio g, kiu nomas funkcio h.
Do ni havas plurajn tavolojn de nestado okazas ĉi tie.
>> Se vi estas interne de via GDB medio,
kaj vi scias vian interne de h, sed vi forgesas
pri kio akiris vin al kie vi are-- vi povas tajpi bt, aŭ reen spuro,
kaj ĝi estos presi h, g, f ĉefa, apud iuj aliaj informoj, kiujn
donas indikon ke, OK ĉefa nomis f, f nomas g, g nomata h,
kaj tio estas kie mi nuntempe estas en mia programo.
Do ĝi povas esti vere utila, precipe ĉar la kripta-Ness de GDB
iĝas iom superfortanta, al eltrovi ĝuste kie ajn estas.
Fine, kiam via programo estas farita, aŭ kiam vi faris elpurigi ĝi
kaj vi volas paŝi for el la GDB medio,
ĝi helpas scii kiel akiri el ĝi.
Vi povas tajpi q, aŭ Quit, eliri.
Nun, antaŭ la hodiaŭa video Mi preparis kalesxo programo
nomata buggy1, kiun mi kompilis el dosiero nomata buggy1.c.
Kiel vi povus atendi, ĉi programo estas fakte kalesxon.
Io fuŝiĝas kiam mi provas kaj ruli ĝin.
Nun, bedaŭrinde, mi distrite forviŝita mia buggy1.c dosiero,
tial en ordo por mi elkompreni kio okazas malĝusta kun tiu programo,
Mi tuj devas uzi GDB ia blinde, klopodante
navigi tra tiu programo elkompreni ĝuste kio okazas erara.
Sed uzante nur la ilojn ni jam lernis pri,
ni povas sufiĉe tre figuro eksteren ekzakte kio ĝi estas.
Do ni estrus super al CS50 IDE kaj havi rigardon.
OK, tial ni estas tie ĉi en mia CS50 IDE medio,
kaj mi zomi iom Do vi povas vidi iom pli.
En mia fina fenestro, se mi listo la enhavo de mia nuna direktoro
kun LS, ni vidos, ke mi havas paron de fontodosierojn
tie, inkluzive de la antaŭe diskutis buggy1.
Kion ekzakte okazas kiam Mi provas kaj ruli buggy1.
Bone ni trovu.
Mi tajpas dot oblikvo, kalesxo, kaj mi batis Enter.
>> Segmentación faŭltoj.
Tio ne bona.
Se vi memoras, oni segmentación kulpo tipe
okazas kiam ni aliri memoro ke ni ne rajtas tuŝi.
Ni iel atingis ekster la saltegoj
el kio la programo, la tradukilo, donis al ni.
Kaj do jam tio estas postsigno teni en la ilkesto
kiel ni komencas la elpuriganta procezo.
Iu iris iom erara tie.
>> Bone, do ni komencu ĝis la GDB medio
kaj vidi se ni povas eltrovi kio ĝuste estas la problemo.
Mi tuj purigi mian ekranon, kaj mi tuj tajpi GDB
denove, por eniri la GDB medio, kaj la nomo de la programo
ke mi volas elpurigi, buggy1.
Ni ricevas iom mesaĝon vocxlegis simboloj de buggy1, farita.
Ĉiuj tio signifas estas ĝi tiris kune ĉiujn la kodon,
kaj nun ĝi estas ŝarĝita en GDB, kaj ĝi estas preta iri.
>> Nu, kion mi volas fari?
Ĉu vi memoras, kion la unua paŝo estas tipe
post mi estas ene de ĉi tiu medio?
Espereble, vi diris fiksita ripozon punkto, ĉar
fakte tion mi volas fari.
Nun, mi ne havas la fontkodon por tiu
antaŭ mi, kiu estas probable ne la tipa uzo kazo, cetere.
Vi probable volas.
Do tio estas bona.
Sed supozante vi ne, kio estas la funkcio ke vi scias
ekzistas en ĉiu ununura C programon?
Neniu afero kiom granda aŭ kiom komplikitaj ĝi estas, tiu funkcio sendube ekzistas.
Ĉefa, dekstra?
>> Do malsukcesanta ĉio alia, ni povas starigis ripozon punkto ĉe ĉefa.
Kaj denove, mi povus simple tajpu rompi ĉefa, anstataŭ b.
Kaj se vi estas scivola, se vi iam tajpas el longa komando
kaj tiam rimarkas ke vi tajpita mistrafas,
kaj vi volas forigi de ĉiuj kiel mi ĵus faris,
vi povas preni Kontrolo U, kiuj volas forviŝi ĉion kaj revenigos vin
al la komenco de la kursoro linioj.
Multaj rapida ol nur tenu la forigi, aŭ bati ŝin faskon fojojn
super.
>> Do ni starigis ripozon punkto ĉe ĉefa.
Kaj kiel vi povas vidi, ĝi diras nin havas starigis ripozon punkto ĉe dosieron buggy1.c,
kaj ŝajne la unuan linion de kodo de ĉefa estas linio sep.
Denove, ni ne havas la fontdosieron tie,
sed mi supozas ke ĝi estas dirante al mi la veron.
Kaj tiam, mi nur celas kaj ruli la programon, r.
Komencante programo.
Bone, do ĉi tiu mesaĝo estas iom enigmaj.
Sed esence kio estas okazas ĉi tie estas ke estas nur
rakontanta min Mi batis mian paŭzo punkto, ripozon punkto numero 1.
>> Kaj tiam, tiu linio de kodo, ne tia dosiero aŭ dosierujo.
La sola kialo, ke Mi vidas ke mesaĝo
Estas ĉar mi distrite forviŝita mia buggy.c dosiero.
Se mia buggy1.c dosiero ekzistis en la aktuala dosierujo,
tiu linio rajtas ekzistus reale diru al mi kio la linio de kodo
laŭvorte legas.
Bedaŭrinde, mi forigis ĝin.
Ni tuj devas speco de navigi tra ĉi iom pli blinde.
>> Bone, do ni vidu, kia mi volas fari tie?
Nu, mi ŝatus scii kion lokaj variabloj eble estas disponebla al mi.
Mi komencis mian programon.
Ni vidu kio povus esti Jam pravalorizitaj por ni.
Mi tajpas Info lokuloj, neniu lokuloj.
Bone, do ke ne donu al mi barelon da informo.
Mi povus provi kaj elprinti variablo, sed mi ne scias variablo nomoj.
Mi povus provi malantaŭa spuro, sed mi estas ene de ĉefaj,
do mi scias ke mi ne faris alian funkcion alvoko nun.
>> Do aspektas kiel mia nura ebloj estas uzi n aŭ tiel kaj komencas plonĝi en.
Mi tuj uzas n.
Do mi tajpas n.
Ho mia Gosh, kio okazas tie.
Programo signaloj ricevitaj, SIGSEGV segmentación kulpo,
kaj tiam tuta amaso de aĵoj.
Mi jam superŝutita.
Nu, ekzistas reale multo por lerni tie.
Do kion signifas ĉi diru al ni?
Kio ĝi diras ni estas, tiu programo estas ronde, sed ankoraŭ ne, seg kulpo.
Kaj precipe, mi tuj zomi eĉ plu ĉi tie,
ĝi estas ronde seg kulpo pri iu nomita strcmp.
>> Nun, kiam ni ne diskutis tiu funkcio vaste.
Sed is-- ĉar ni ne tuj paroli pri ĉiu funkcio kiu
Ekzistas en la C norma biblioteko sed ili estas ĉiuj haveblaj al vi,
precipe se vi prenas rigardas reference.cs50.net.
Kaj strcmp estas vere potenca funkcio kiu ekzistas interne
de la string.h kaplinio dosiero, kiu estas kaplinio
dosiero kiu estas dediĉita al funkcioj ke laboro kun kaj manipuli ĉenojn.
>> Kaj precipe, kion strcmp faras estas komparas la valorojn de du ŝnuroj.
Do mi estas ronde segmentación kulpo sur alvoko al strcmp similas.
Mi trafis n, kaj fakte mi ricevas la mesaĝon, programo finiĝis kun signalo SIGSEGV
segmentación kulpo. Do nun Mi efektive seg riproĉis,
kaj mia programo havas belajn multe efike forlasis.
Jen la fino de la programo.
Ĝi rompiĝis, ĝi kraŝis.
Do ne multe, sed mi fakte lernis sufiĉe iomete
de tiu malgranda sperto.
Kion mi lernis?
Nu, mia programo kraŝas preskaux tuj.
Mia programo kraŝas sur alvokon al strcmp, sed mi
ne havas lokajn variablojn en mia programo tiutempe ke ĝi kraŝas.
Do kio ŝnuro, aŭ ĉenoj, mi povus eventuale esti komparante.
Se mi ne havas lokan variabloj, vi eble
diveni, ke ankaŭ mi havas tie eble estas malloka variablo, kiu povis esti vera.
>> Sed ĝenerale, ĝi ŝajnas kiel mi komparante
al iu kiu ne ekzistas.
Do ni enketi ke iom plu.
Do mi tuj purigi mian ekranon.
Mi tuj forlasis el la GDB medio dum sekundo.
Kaj mi pensas, OK, do ekzistas neniu lokaj variabloj en mia programo.
Ĉu eble mi supozis pasi en cxeno kiel komandlinia argumento.
Do ni nur testi ĉi ekstere.
Mi ne faris tion antaŭe.
>> Ni vidu se eble se mi kuros ĉi programo kun komandlinio argumento funkcias.
Hm, neniu segmentación kulpo tie.
Ĝi nur diris al mi ke mi kalkulis ĝin.
Do eble tio estas la solvon tie.
Kaj efektive, se mi reirus kaj rigardi la fakta fontkodon por buggy1.c,
ŝajnas kvazaŭ kion mi faras estas Mi faras alvokon al strcmp sen
kontrolanta ĉu fakte argv [1] ekzistas.
Tiu estas fakte la fontkodon por buggy1.c.
Do kion mi vere bezonas fari tie ripari mian programon,
supozante mi havas la file antaŭ mi, estas
simple aldoni ĉekon por fari certas ke argc estas egala al 2.
Do tiu ekzemplo, denove, kiel mi diris, Estas iomete elpensita, ĉu ne?
Vi ĝenerale ne tuj hazarde forviŝi viajn fontkodo
kaj tiam devi provi kaj elpurigi la programo.
Sed espereble, ĝi donis vi ilustraĵo
de la specoj de aĵoj kiuj vi povus pensi pri
kiel vi elpurigi via programo.
>> Kio estas la stato de aferoj tie?
Kio variabloj mi havi atingebla al mi?
Kie precize estas mia programo frakasante, sur kio linio,
sur kio alvoko al kio funkcio?
Kiajn postsignoj does kiuj donas al mi?
Kaj tio estas ĝuste la speco de pensmaniero ke vi
devus esti akiranta en kiam vi estas pensante pri elpurigi viajn programojn.
>> Mi Doug Lloyd.
Jen CS50.