>> Doug LLOYD: Labi GDB.
Kas tas ir tieši tā?
Tātad GDB, kas apzīmē par GNU atkļūdotājs
ir patiešām lielisks rīks, ka mēs varam izmantot, lai palīdzētu mums atkļūdot savas programmas,
vai uzzināt, kur lietas ir notiek nepareizi mūsu programmās.
GDB ir pārsteidzoši spēcīgs, bet izejas un mijiedarbība ar to
var būt mazliet mistisks.
Tas parasti ir komandrindas rīks, un tas var mest daudz ziņu pie jums.
Un tas var veida grūti apstrādāt tieši to, kas notiek.
Par laimi, mēs esam spēruši soļus lai atrisinātu šo problēmu, lai jūs
kā jūs strādājat ar CS50.
Ja jūs neizmantojat grafisko atkļūdotājs, kas mans kolēģis Dan
Armandarse ir runājis diezgan mazliet par šajā video, kas
vajadzētu būt vairāk nekā šeit tieši tagad, jums var būt nepieciešams
izmantot šos komandrindas instrumenti darbam ar GDB.
Ja jūs strādājat ar CS50 IDE, jums nav nepieciešams, lai to paveiktu.
Bet, ja jūs neesat strādā CS50 IDE,
varbūt izmantojot versiju no CS50 Appliance,
vai citu Linux darbojas sistēma ar GDB uzstādīts uz tā,
Jums var būt nepieciešams izmantot šie komandrindas rīkus.
>> Un tā kā jūs varētu ir to darīt, tas ir
noderīga tikai, lai saprastu, kā GDB darbi no komandrindas.
Bet atkal, ja jūs esat izmantojot CS50 IDE, jūs
var izmantot grafisko atkļūdotājs kas ir iebūvēts IDE.
Tātad, lai iegūtu lietas notiek ar GDB, lai sāktu debugging
process īpaši programma, viss, kas jums jādara,
ir veids GDB seko ar programmas nosaukumu.
Tā, piemēram, ja jūsu programma ir sveiki, jūs varētu rakstīt GDB Sveiki.
>> Kad jūs to izdarītu, jūs gatavojas uzvilkt gdb vidi.
Jūsu tūlītēja mainīsies, un tā vietā, ko tas parasti
ir tad, kad jūs tipa lietas Komandu line-- ls,
cd-- visas jūsu tipiskā Linux komandas, jūsu tūlītēju
mainīsies uz kuru, visticamāk, kaut līdzīgi iekavās GDB iekavās.
Tas ir jūsu jaunā GDB ātru, jo tu esi iekšā GDB vidē.
Kad iekšā šajā vidē, tur ir divi galvenie komandas
ka jūs, iespējams izmantot šādā secībā.
>> Pirmais ir b, kas ir īss pārtraukums.
Un pēc tam, kad B tipa, jūs parasti ierakstiet nosaukumu funkcijai
vai, ja jūs notikt zināt ap ko līnijas numurs
jūsu programma sāk uzvesties mazliet dīvaini,
Jūs varat ierakstīt līniju skaits tur kā labi.
Kas b, vai pārtraukums, vai tas ļauj jūsu programma
palaist līdz noteiktam punktam, proti, nosaukums funkcijas
ka jūs norādāt vai līnija jūsu norādīto numuru.
>> Un tajā brīdī, to būs iesaldēt izpildi.
Tas ir tiešām laba lieta, jo tiklīdz izpilde ir iesaldēti,
Jūs varat sākt ļoti lēni soli pa savu programmu.
Parasti, ja jūs esat bijis rādīt savas programmas, viņi diezgan īss.
Parasti, rakstot dot slīpsvītru neatkarīgi nosaukums jūsu programmas, hit Enter,
un pirms jūs varat mirgot, jūsu Programma jau ir pabeigta.
Tas nav īsti daudz laika, lai mēģinātu un saprast, kas notiek nepareizi.
Tātad, tas tiešām varētu palēnināt lietas pa nosakot lūzuma punkts ar B,
un tad ienāk.
>> Pēc tam, kad esat iestatījis jūsu pārtraukuma punktu, jūs varat palaist programmu.
Un, ja jums ir kāds komandrindas argumentus,
norādāt tos šeit, nevis tad, kad Rakstot gdb jūsu programma vārds.
Jūs norādāt visus komandrindas argumenti ņemot R, vai skriet,
un tad kāds komandrindas argumentus Jums nepieciešams iekšpusē jūsu programmā.
Ir vairāki citi patiešām svarīgas un noderīgas komandas
iekšpusē IKP vidi.
Tāpēc ļaujiet man tikai ātri iet pār daži no tiem.
>> Pirmais ir n, kas ir īss nākamajā, un jūs varat rakstīt nākamo, nevis n,
abi varētu strādāt.
Un tas ir tikai stenogrāfija.
Un, kā jūs droši vien jau gotten izmanto, lai, to var ievadīt lietas
īsāks parasti ir labāk.
Un kas tas būs jādara, ir tas būs solis uz priekšu vienu bloku kodu.
Tātad tas būs virzīties uz priekšu līdz funkciju zvanu.
Un tad tā vietā, iegremdēšanās šīs funkcijas
un iet cauri visiem, kas darbojas kods, tas vienkārši ir funkcija.
>> Funkcija tiks saukts.
To darīs neatkarīgi no tās darbs ir.
Tas atgriezīs vērtību funkcija, kas to nosauca.
Un tad jums būs pāriet uz Nākamais rindā šī zvana funkcijas.
Ja jūs vēlaties, lai soli iekšpusē funkciju,
nevis tikai ņemot tas izpildīt, jo īpaši
ja jūs domājat, ka problēma varētu gulēt iekšpusē šo funkciju,
jūs varētu, protams, ir noteikts pārtraukums punktu iekšpusē šo funkciju.
Vai, ja jūs jau darbojas, jūs varat Ar S solis uz priekšu, vienu rindiņu kodu.
>> Tātad tas būs solis un nirt funkcijām,
nevis vienkārši ir izpildīt un turpinot ar funkciju
ka tu esi debugging.
Ja jūs kādreiz vēlaties zināt vērtība ir mainīgs,
Jūs varat ierakstīt P, vai Print, un pēc tam mainīgā vārds.
Un tas būs drukāt, lai jums, iekšpusē GDB vides,
nosaukums mainīgo, ka you-- atvainojiet me-- vērtību mainīgā
ka jūs esat nosaukts.
Ja jūs vēlaties zināt vērtības ik vietējās mainīgais pieejama no kurienes
Jums šobrīd ir jūsu programma, jūs varat ierakstīt info vietējie.
Tas ir daudz ātrāk nekā ierakstot p un tad kāds,
uzskaitot, visas mainīgie, ka jūs zināt pastāv.
Jūs varat ierakstīt info vietējie, un tas būs izdrukāt visu, lai jums.
Blakus up ir bt, kas ir īss Back Trace.
Tagad, parasti, jo sākumā CS50,
jums nav īsti ir izdevība izmantot BT, vai mugurā Trace,
jo jums ir ne funkcijas ka zvanu citas funkcijas.
>> Jums varētu būt galvenais piezvanītu funkcija, bet tas ir iespējams, tas.
Jums nav, ka citas funkcijas zvana citu funkciju, kas
aicina citu funkciju, un tā tālāk.
Bet, tā kā jūsu programmas iegūtu vairāk sarežģīts, un jo īpaši
kad sākat strādāt ar recursion, muguras izsekot
var būt patiešām noderīgs veids, lai jūs veida dabūt kontekstu, kurā
Es esmu savā programmā.
Tā teikt, jūs esat rakstiski savu kodu, un jūs zināt, ka galvenais zvani funkciju
f, kas aicina funkciju g, kas aicina funkciju h.
Tāpēc mums ir vairāki slāņi ligzdojošo notiek šeit.
>> Ja jūs esat iekšpusē Jūsu GDB vide,
un jūs zināt jūsu iekšpusi H, bet esat aizmirsis
par to, kas ieguva jums, kur jūs are-- jūs varat ierakstīt BT, vai atpakaļ pēdas,
un tas būs izdrukāt h, g, f galvenais, līdzās kādu citu informāciju, kas
dod jums pavediens, ka OK galvenā sauc f, f, ko sauc par g, g sauc h,
un tas, kur es Pašlaik esmu manā programmā.
Tātad tas var būt patiesi noderīga, jo īpaši tādēļ, ka mistisks-Ness GDB
kļūst mazliet milzīgs, lai uzzināt, kur tieši lietas.
Visbeidzot, ja jūsu programma tiek darīts, vai tad, kad jūs esat darījuši to atkļūdošana
un jūs vēlaties, lai soli prom No GDB vidē,
tas palīdz uzzināt, kā izkļūt no tā.
Jūs varat ierakstīt q, vai Iziet, lai izkļūt.
Tagad, pirms šodienas video Es sagatavojis buggy programmu
sauc buggy1, kuru es apkopoti no faila pazīstams kā buggy1.c.
Kā jūs varētu gaidīt, tas Programma ir faktiski buggy.
Kaut kas noiet greizi kad mēģinu un palaist to.
Tagad, diemžēl, es nejauši svītrots manu buggy1.c failu,
tāpēc, lai man, lai noskaidrotu kas notiek nepareizi ar šo programmu,
Es esmu nāksies izmantot GDB veida akli, mēģinot
lai virzītos caur šo programmu, lai izdomāt tieši to, kas notiek nepareizi.
Bet izmantojot tikai instrumentus mēs esam jau uzzinājām,
mēs varam diezgan daudz attēlu , ko tieši tas ir.
Tātad pieņemsim dodies uz CS50 IDE un paskatīties.
Labi, tāpēc mēs esam šeit, manā CS50 IDE vide,
un es ņemšu tuvinātu mazliet lai jūs varētu redzēt mazliet vairāk.
Manā termināļa logā, ja es sarakstu saturs mana pašreizējā direktora
ar ls, mēs redzēsim, ka es ir pāris avota failus
šeit, tostarp iepriekš apspriests buggy1.
Kas īsti notiek, kad Mēģinu un palaist buggy1.
Nu pieņemsim uzzināt.
I tips dot slīpsvītra, buggy, un es hit Enter.
>> Segmentācijas kļūdas.
Tas nav labi.
Ja jūs atceraties, segmentāciju vaina parasti
notiek tad, kad mēs piekļūt atmiņas ka mēs esam nav atļauts pieskarties.
Mēs esam kaut kā sasnieguši ārpus robežām
no tā, ko programmu, kompilators, mums ir devis.
Un tā jau tas ir pavediens paturēt kopums
kā mēs sāktu atkļūdošanas procesu.
Kaut kas ir gājusi mazliet nepareizi šeit.
>> Labi, tāpēc sāksim up GDB vidē
un redzēt, ja mēs varam izrēķināt kas īsti ir problēma.
Es esmu gatavojas, lai notīrītu manu ekrānu, un es esmu gatavojas rakstīt GDB
vēlreiz, lai ievadītu gdb vidē, un programmas nosaukums
ka es gribu, lai atkļūdot, buggy1.
Mēs saņemt nedaudz ziņu, lasot simbolus no buggy1, darīts.
Viss, kas nozīmē, tas velk kopā visi no koda,
un tagad tas ir bijis iepildīta GDB, un tā ir gatava iet.
>> Tagad, ko es gribu darīt?
Vai jūs atceraties to, ko Pirmais solis parasti ir
kad es esmu iekšā šajā vidē?
Cerams, jūs teicāt iestatīt lūzuma punkts, jo
patiesībā tas ir tas, ko es gribu darīt.
Tagad, man nav pirmkods šī
man priekšā, kas, iespējams, ir nav tipisks izmantošanas gadījumā, ko veidā.
Jūs droši vien būs.
Tātad tas ir labi.
Bet pieņemot, ka jums nav, kas ir viena funkcija, kas jūs zināt
pastāv katrā atsevišķā C programmu?
Nav svarīgi, cik liels vai cik sarežģīts tas ir, šī funkcija noteikti pastāv.
Galvenais, vai ne?
>> Tātad ja viss cits, mēs varam noteikt lūzuma punkts pie galvenā.
Un atkal, es varētu vienkārši ierakstiet break galvenais, tā vietā, lai b.
Un, ja jūs esat ieinteresēti, ja jums kādreiz tipa no garu komandu
un tad saproti, ka jums drukāti nepareizi lieta,
un jūs vēlaties, lai atbrīvotos no visiem, jo ​​es tikko darīju,
jūs varat veikt kontroli U, kas izdzēst visu un nest atpakaļ
sākumam no kursora līniju.
Daudz ātrāk nekā tikai turiet dzēst, vai hitting to ķekars reizes
vairāk.
>> Tātad mēs noteikt lūzuma punkts pie galvenā.
Un, kā jūs varat redzēt, tas saka, ka mēs esam noteikt lūzuma brīdi failu buggy1.c,
un acīmredzot pirmajā rindā no koda galvenais ir septiņi līnija.
Atkal, mums nav avota fails šeit,
bet es pieņemu, ka tas ir man saki patiesību.
Un tad, es esmu tikai mēģina un palaist programmu, r.
Sākot programmu.
Labi, tāpēc šī ziņa ir nedaudz mistisks.
Bet būtībā, kas ir notiek šeit ir tas ir tikai
man saki Es esmu hit manu pārtraukuma punkts, lūzuma punkts numurs 1.
>> Un tad, ka līnija koda, Nav tāda faila vai direktorijas.
Vienīgais iemesls, ka Es esmu redzēt šo ziņu
ir tāpēc, ka es nejauši svītrots manu buggy.c failu.
Ja mans buggy1.c fails pastāvēja pašreizējā direktorijā,
ka līnija labi tur tiešām man pateikt, kāda līnija koda
burtiski skan.
Diemžēl, es svītrots to.
Mēs ejam, lai būtu sava veida orientēties caur šo nedaudz vairāk akli.
>> Labi, tāpēc pieņemsim redzēt, ko es gribu darīt šeit?
Nu, es gribētu zināt, ko vietējās mainīgie varbūt man ir pieejami.
Esmu sācis savu programmu.
Let 's redzēt, kas varētu būt jau inicializēts mums.
I tipa Info vietējiem iedzīvotājiem, nav vietējie.
Visi pa labi, tā, ka tas nav man ton informāciju.
Es varētu mēģināt izdrukāt mainīgo, bet es nezinu nevienu mainīgo nosaukumi.
Es varētu mēģināt atpakaļ pēdas, bet es esmu iekšā galvenais,
tāpēc es zinu, man nav veikti cita funkcija zvans tieši tagad.
>> Tātad izskatās mans vienīgais iespējas izmantot n vai tik un sākt ienirt.
Es esmu gatavojas izmantot n.
Tāpēc es rakstīt n.
Ak mans Dievs, kas notiek šeit.
Program saņemti signāli, SIGSEGV segmentāciju vaina,
un tad viss ķekars sīkumi.
Es esmu jau satriekti.
Nu, tur ir tiešām daudz ko iemācījušies šeit.
Tātad, ko tas mums stāsta?
Ko tas stāsta mums ir, šī programma ir par to, bet vēl nav noticis, SEG vaina.
Un jo īpaši, es eju lai tuvinātu vēl šeit,
tas ir par SEG vaina par kaut ko sauc strcmp.
>> Tagad, mēs, iespējams, nav apspriesti Šī funkcija plaši.
Bet tas is-- tāpēc, ka mēs nebrauksim lai runātu par katru funkciju,
eksistē C standartā library-- bet viņi visi ir pieejami, lai jūs,
it īpaši, ja esat lietojis apskatīt reference.cs50.net.
Un strcmp ir ļoti spēcīgs funkcija, kas pastāv iekšpusē
no string.h header fails, kas ir header
fails, kas ir veltīta funkcijām ka darbs ar un manipulēt stīgas.
>> Un jo īpaši, kāda strcmp tas ir tā salīdzina vērtības divām stīgām.
Tāpēc es esmu par to segmentācijas vaina uz aicinājumu strcmp šķiet.
I hit n, un patiesībā man ziņu, Programma izbeigts ar signāla SIGSEGV
segmentēšana vaina. Tāpēc tagad Man tiešām ir SEG pārmest,
un mana programma ir diezgan daudz efektīvāk atdevis.
Tas ir beigu programmas.
Tā sabojājusies, tā avarēja.
Tātad nebija daudz, bet es faktiski bija uzzināt diezgan daudz
no šīs maz pieredzes.
Ko es esmu iemācījies?
Nu, mana programma avarē diezgan daudz nekavējoties.
Mana programma avarē uz zvanu uz strcmp, bet es
nav nekādu vietējo mainīgie manā programma brīdī, ka tas atteici.
Tātad, ko string, vai virknes, Es, iespējams, varētu būt salīdzināt.
Ja man nav nekādu vietēja mainīgie, jūs varētu
domāt, ka es have-- tur varbūt ir globālo mainīgo, kas varētu būt taisnība.
>> Bet vispār, šķiet, piemēram, es esmu salīdzināt
uz kaut ko, kas neeksistē.
Tātad pieņemsim izpētīt ka nedaudz tālāk.
Tāpēc es esmu gatavojas, lai notīrītu manu ekrānu.
Es esmu gatavojas pamest ārā no GDB vide uz otru.
Un es domāju, OK, tāpēc tur ir vietējie mainīgie manā programmā.
Nez, ja varbūt es esmu vajadzēja iziet virknē kā komandrindas argumentu.
Tātad pieņemsim tikai pārbaudīt šo out.
Man nav izdarīts pirms tam.
>> Redzēsim, vai varbūt, ja man palaist šo programmu ar komandrindas argumentu tā darbojas.
Huh, neviens segmentācija vaina tur.
Tas tikai man teica, ka es sapratu to ārā.
Tātad, varbūt tas ir noteikt šeit.
Un tiešām, ja es dodos atpakaļ un apskatīt faktiskais pirmkods buggy1.c,
šķiet, ka tas, ko es daru, ir Es esmu padarot aicinājumu strcmp bez
pārbaudot, vai patiesībā argv [1] eksistē.
Tas ir faktiski pirmkods buggy1.c.
Tātad, ko es tiešām ir nepieciešams, lai darīt šeit, lai noteikt savu programmu,
pieņemot, ka man ir failu man priekšā, ir
lai vienkārši pievienojiet pārbaudi, lai padarītu ka argc ir vienāds ar 2.
Tātad šis piemērs, atkal, kā jau teicu, ir mazliet izdomāts, vai ne?
Tu vispār nav gatavojas nejauši izdzēst savu pirmkodu
un tad ir jāmēģina un atkļūdot programmas.
Bet, cerams, tas deva Jūs ilustrācija
no lietas veidu, kas jūs varētu domāt par
kā jūs atkļūdošana savu programmu.
>> Kāda ir situācija šeit?
Ko mainīgie man ir pieejams pie manis?
Kur tieši ir mana programma crashing, uz kāda līniju,
par to, zvans uz kādu funkciju?
Kādu versijām tas, kas dod man?
Un tas ir tieši tas veida domāšanas veids, kas jums
Būtu nokļūst, kad esat domājot par atkļūdošana programmas.
>> Es esmu Doug Lloyd.
Tas ir CS50.