[? DAN ARMADARAS:?] Bok, Ja sam [? Dan Armadaras?]. Danas ćemo se gleda na ispravljanje pogrešaka. Ne samo da ćemo govoriti o nekim tehnikama, ali ćemo gledati na neke od značajki sadržani u CS50 IDE koji omogućuju jednostavno ispravljanje program. Samo jedan primjer nešto što može poći po zlu i to je zapravo nešto kako smo već vidjeli. U ovom slučaju, to je program C koja prihvaća cijeli broj od korisnika, dijeli po dva, te pruža izlaz natrag korisniku. Sada od onoga što smo vidjeli ranije u predavanjima, Znamo da je to zapravo će izazvati određene vrste podjela problema kada imamo neparne brojeve. Naime, samo ćemo baciti ništa nakon decimalne točke. Sada znamo da je to se događa da se slučaj. A ako smo ga pokrenuti, možemo potvrditi naše sumnje, prva, sastavljanjem. A onda, trčanjem i ulaska neparan broj. To nije ništa novo. Ali to je zapravo Primjer bug koji može postojati unutar šireg programa koje postaje sve teže pronaći. Iako znamo što je problem je, pravi poanta je u tome možda pokušava identificirati posebno gdje je pogreška, identificiranje što taj problem je, a onda ga srediti. Dakle, dati ovo kao primjer onoga što bi moglo biti nešto koje smo već znali, ali može biti pokopani unutar drugih elemenata koda. Dakle, otvaranjem ovog drugog izvora broj datoteka kao primjer, ovaj problem podjela sada dio većeg programa. Ipak bi moglo biti malo malo neprirodan, a mi mogli lako prepoznati ga, pogotovo jer mi smo samo raspravljati. Ali možemo shvatiti da je ovaj Problem može postojati na većem mjerilu. Ako sam sastaviti ovaj i sada pokrenuti ga, unesite neparan broj, možemo vidjeti da ne dobijemo upravo izlaz da možemo očekivati. U ovom konkretnom slučaju, mogli bismo reći da smo želite brojati sve brojeve od jedne do nekog određenog broja. I možemo vidjeti da smo imaju različite probleme Ovdje ako smo izlaza, jednostavno, 0 i 1 kad smo dati doprinos od 5. Dakle, mi već znamo da postoji problem ovdje. Ali mi se ne može točno znati gdje je to pitanje zapravo postoji. Sada je jedan od načina na koji možemo pokušati popraviti ovaj je nešto što smo već uveo. Mi samo možemo ga koristiti na većem mjerilu. Na liniji 14, imamo ovo printf funkcija, što nam omogućuje da ispisati države različitih komada informacija. A to je nešto što vam treba iskoristiti u svom programu pokušati shvatiti točno ono što je događa u raznim linija koda. Dakle, čak i ako to nije Konačni izlaz da smo zapravo želite proizvode iz ovaj program, još uvijek Možda su neki debug izjava Gdje smo može pokušati shvatiti upravo ono se događa unutar našeg koda. Dakle, u ovom slučaju, ja ću printf s debug oznaku. U ovom slučaju, to je samo debug niz da sam se-stavljanjem, tako da ona postaje vrlo jasno u izlazu moj broj što je to što želim pokazati. A izlaz ovdje broj da smo izračunati. U ovom slučaju, mogao bih želim znati točno što se događa prije i Nakon nekog specifičnog računanja. Dakle, ja mogu koristiti prije printf a nakon toga linije koda. U ovom slučaju, mogao bih čak čine ga malo jasnije rekavši ispravljanje prije i ispravljanje nakon toliko da ja ne bih brkati s više linija koje izgledaju identično. Sada, ako ćemo rekompilirati ovo i trčanje da, unesite broj kao i pet opet, možemo vidjeti da imamo Sada izlaz prije i poslije a da nismo učinili jasan podjela ili čisto vlasništvo broja da smo zapravo želite učiniti. Sada, u ovom slučaju, to je zapravo nije jasan izlaz. To zapravo nije jasan ishod koji želimo iz ovog posebnog programa. A to je, opet, malo neprirodan. Ali, možda, jedna od stvari koje smo mogli učiniti ako specifikacija rekao koje želimo podijeliti ovu by 2 i dodati 1-- tako drugim riječima, želimo zaokružiti up-- onda mogli bismo znali da smo mogli učiniti da određenu stvar, u ovom slučaju. Sada ovdje znamo da ćemo biti mogućnosti dodati 1 na naše prepolovljen broj. Idemo rekompilirati ovo i potvrditi da je ovaj se ponaša na način koji želimo. Možemo vidjeti da je sada prije ima, mi imamo broj 5. Nakon što imamo broj 3, koja je prema našim specifikacijama, je ono što smo željeli učiniti. Ali ako pogledamo Izlaz ovdje, možemo vidjeti da bismo mogli imati još jedan bug zajedno, što je da mi se počinju naše računati od 0. Sada opet, to je nešto koje smo vidjeli u prošlosti a možemo popraviti prilično lako. No, u ovom slučaju, mi Također je imao korist korištenja printf izjavu izravno unutar za petlju da znam točno gdje da je greška bila u tijeku. Dakle printf izjave vrlo korisno u pomaganju da odredite gdje, upravo u svom izvornom kodu, specifična greška se događa. I to je također važno shvatiti da, kao što smo pisanje koda, bismo mogli imati pretpostavke o stanju programa. Ili bismo mogli imati pretpostavke o tome što dio programa je zapravo točan ili netočan kada kasnije kao što smo graditi na tom programu i čine ga jedan dio složen i veći programa da smo shvatili da neki aspekt to je zapravo lud. Korištenje printf zaista može pomoći suziti i prepoznati regije se program koji ne može se ponaša upravo onako kako smo očekivati, na temelju naših pretpostavki. No, tu je druge alate raspolaganju, kao i, koji omogućuju nam da pokušate slici gdje pogreška se događa I također, Naime, ono što stvari se događa unutar programa. Tako pomoću printf vrlo korisne kada želimo identificirati specifična područja program koji ima neki bug. Ali to također postaje dosadan nakon nekog vremena. U ovom slučaju, to je relativno jednostavan program sa samo jednom ili dvije varijable. I to postaje vrlo lako za nas ispisati vrijednosti tih varijabli u kontekstu većih programa. Ali bismo mogli imati drugačiji program koji ima mnogo varijabli. A to ne može biti sasvim tako jednostavan za korištenje printf pokušati procijeniti što se događa za svaku od tih varijabli kao programa izvršavanja. Postoji program koji postoji zove ispravljanje pogrešaka programa. U tom slučaju, onaj koji ćemo Uporaba je GNU program za pronalaženje pogrešaka, ili GDB, koji nam omogućuje da provjerite unutarnje djelovanju programa u mnogo više detaljan način. Mi zapravo može izvršiti GDB iz naredbenog retka Ovdje jednostavnim upisivanjem GDB i Naredba da želimo ispravljanje. U ovom slučaju, računati. Sada, u ovom slučaju, možemo vidjeti da je to nas dovodi do redak koji kaže GDB. I možemo zapravo izvršavanje naredbi na GDB zapravo početak izvršenja Program, zaustaviti ga na određenim mjestima, procjenu varijabli i pregledati varijable koje postoje u državni program u tom trenutku, i tako dalje i tako dalje. On pruža puno snage za nas. Ali to samo tako dogodi da CS50 IDE također pruža GUI ili korisnika sučelje za GDB da omogućuje nam da to učinite bez potrebe sučelje naredbenog retka god ili uopće još. Način na koji ja mogu pristupiti da je pomoću gumba debug na samom vrhu CS50 IDE. Sada je u prošlosti, ono što imamo Vidio je da koristimo naredbu linije za prikupljanje i zatim pokrenite program. Gumb ispravljanje radi oba od tih koraka. No, to će dovesti do debugger tab na desnoj strani koji nam omogućuje uvid u različite svojstava programa kao što je izvršavanje. Ako sam kliknite debug, u ovom slučaj, to će dovesti do nova kartica u konzolu Prozor na samom dnu. I možete vidjeti da je ova kartica ima neke informacije na samom vrhu. A mi uvelike može ignorirati to. No, jedna od stvari da želimo primijetiti je da izlazi ista stvar koja mi bi dobili ako bismo pokušali pokrenuti napraviti na Program C u terminalnom prozoru. Ovdje možemo vidjeti da je pokrenut zveket, i ima razne zastave, i to je sastavljanje našu count.c datoteku, koja je bila odabrana kartica u vrijeme da sam pogodio ispravljanje. Dakle, to je vrlo korisno, jer Sada pomoću ovog gumba debug, što istovremeno može sastaviti i onda izvršiti program koji smo zapravo želite pokrenuti. Jedan od zastava koja je važno, u ovom slučaju, zapravo sam bio koristeći za najdulji vrijeme ali i samo je neki ruku mašući [nečujan], koja je ovo jedan upravo ovdje. U zveket, ona kaže -ggdb3. U ovom slučaju, ono što smo reći zveket, naš prevodilac, je da želimo sastaviti naš program. No također pružaju ono što su zove simbol informacije tako da prevodilac zapravo ima pristup na puno informacija o podlozi sadržan u programu. Točnije, broj funkcija koje imam, imena tih funkcija, varijable, vrste da oni varijable, te razne drugih stvari koje pomažu debugger obavljati svoj rad. Sada postoji nešto drugo to je važno napomenuti kada smo raspravljali trčanje program na ovaj način. Obavijest da je zapravo izveo novu karticu u našem konzoli po dnu. Mi više ne moraju komunicirati izravno s prozora terminala. No, ova nova kartica zapravo terminala prozor. To samo je specifična za trčanje Program koji smo stvorili. Obavijest da je na dnu, u Kombinacija s nekim izlazom po zveket prevodilac i GDB, koje smo uvelike može zanemariti, to zapravo pokazuje izlaz naš program na samom dnu. Sada je važno shvatiti da je ovo jedan prozor zapravo će vam pokazati izlaz iz programa ali također može prihvatiti ulaz za taj program, kao dobro. Tako obavijest da govori unesite broj, koji je isti izlaz koji smo imali imali u terminal prozoru prije. Ali to je sada prikazana u ovoj novoj kartici. I možete unijeti broj. I to će zapravo funkcija kao što smo očekivali pokazujući nam naš debug, izlaz, izlaz koji bi mogli biti lud, kao što smo vidjeli prije. A na samom dnu, to zapravo ima neke dodatne izlaz od BDP-a samo reći da ovaj program je završen. Sada kao što ste vidjeli u to Konkretno trčanje preko, nije bio osobito korisni jer čak iako mi je došao izbornik debugger gore, to je još uvijek trčanje plan. Ni u jednom trenutku je to učinio zapravo pauzirati izvršenje za nas da biste mogli pregledati sve varijable sadržan u. Nešto je drugo da moramo učiniti kako bi doći GDB priznati da želimo pauzirati izvršenje programa i to ne samo dopustiti da biste nastavili normalno kao što bi u svakom drugom slučaju. Kako bi pauzirati izvršenje, u nekom određenom retku, moramo stvoriti ono što je zove break point. I break point je vrlo jednostavno stvorio u ovom CS50 IDE uzimanjem miša i klikom izravno na lijevo neke specifične linije broj. Kad sam to učiniti, crvena točka pojavi, što ukazuje da je linija je sada pauza točka. A sljedeći put kad sam pokrenuti GDB ga, prestat će se izvršenje na toj točki prekida kad dosegne tu liniju koda. A ovo je važan stvar za shvatiti da to nije nužno Slučaj koji je svaki redak koda je zapravo dostupna. Ako mi je stvoriti funkciju ovdje, za example-- void f-- i samo napraviti ispis liniju here-- Pozdrav svijet-ako nikada nazvati ovu funkciju, to će biti slučaj da je, ako sam postaviti break ovdje funkcija nikada neće biti pozvan. I zato, ovaj Posebno break Nikad zapravo će pauzirati Izvršenje programa. Pa recimo da sam ispravno stvoriti pauza točka na nekoj liniji koda koji će zapravo biti pogubljeni. Sada, u ovom slučaju, to je Prvi redak u glavnoj funkciji. Dakle, to će sigurno biti slučaj da, čim sam početak izvršenja, Prva linija će biti postignut. GDB će pauzirati izvršenje. I onda, ja ću biti u mogućnosti interakciju s ispravljanje pogrešaka. Možete postaviti više redaka što kontrolne točke, ako želite. Također možete stvoriti liniju gore ovdje u ovom segmentu kod da nikada neće biti postignut. I mi također može postaviti jedan u nastavku. Razlog da bismo želim to ćemo učiniti ići u malo više detalj u samo trenutak. Dakle, za sada, neka mi samo onemogućiti te dodatne break bodova tako da možemo gledati na ono što se događa kad imam jednu pauzu točka u mom programu. Ja sam napravio neke Promjene ovom programu. Dakle, trebam ga spasiti. Ja ću kliknite ispravljanje, tako da ja mogu započeti prikupljanje i potom izvršenje ispravljanje pogrešaka. Vidjet ćemo da je, nakon što je trenutaka, linija koja smo odabrali kao pauze točka je označena žutom bojom. Također možemo primijetiti da je u Gornji desni u debug ploči da je ikona stanka pretvorio u malu play ikonu. To znači da imamo pauzu izvršenje, u ovom konkretnom slučaju. I udarajući gumb Play bi nam omogućiti da nastavi izvršenje u tom određenom trenutku. Obavijest da postoji nekoliko drugih Tipke dostupne u ovom debug ploči, kao. Korak više, što mi omogućuje da izvršiti tu jednu liniju koda i korak preko te crte do Sljedeći, koji, u ovom slučaju, bi značilo da je printf naredba izvrši. A onda će pauzirati Izvršenje na liniji 13, kao i toliko. A tu je i korak u funkciju, što Korisno je ako sam stvorio drugi Funkcije drugdje u izvornom kodu. I želim korak u te funkcije, a ne izvršiti tu funkciju u cjelini. No, mi ćemo izgledati u koraku u funkciju u samo trenutak. Sada primijetite neke druge stvari koje Zapravo postoje u ovom debug ploči. Imamo ovu ploču naziva pozvati stog, što nam pokazuje gdje točno smo. U ovom slučaju, mi smo unutar glavne funkcije. Naša skripta zove count.c. A mi se dogoditi da se na linija 13, stupac jedan, koji je upravo ono što je istaknuo regija izvornog koda pokazuje, kao dobro. Sada primijetite da su to također pokazuje pod lokalnom promjenjivog presjeka sve varijable koje postoje unutar ove funkcije. Važno je napomenuti da sve varijable će se pojaviti u ovom lokalnom varijable poglavlje u funkciji, čak i prije nego što su definirani. Ovdje možemo vidjeti da imamo varijablu zove num, ima zadanu vrijednost 0, a je tipa int. Sada prije nego što smo zapravo inicijalizirati svih tih varijabli, nismo nužno zajamčeno da vidi vrijednost 0. I ovisno o drugim pogubljenja da ste obavili i stanje vaše memorije kada što zapravo pokrenuti ovaj program, možda otkrijete da vas ne vidim vrijednosti 0 i, umjesto toga, neki drugi ludi brojevi. No, ne brinite o tome. To neće biti relevantni do što zapravo inicijalizirati vrijednost. Sada, u ovom slučaju, možemo vidjeti da Izvršio sam neke izlaze. A ja, sada, zastao izvršenje. No, u ovom slučaju, ono što Ja stvarno želim raditi je sada korak preko te linije koda, tako da ja mogu zapravo upit korisniku za tu int da želimo koristiti u našem programu. Sada je u ovom slučaju, kad Sam pogodio korak više, obavijest da Pauza odnosno Nastavi Gumb promijenio ovaj gumb Pause jer ovaj broj zapravo izvršenje. Što se događa sada je da je čekaju nas da unesete neke informacije kao što možemo vidjeti naš izlazni tekst na samom dnu. Pa sad, ovo je zapravo ne zastane, iako to, nekako, pojavljuje da, jer se ništa ne događa. Ali to samo tako dogodi da u moj konkretan slučaj na liniji 13, Čekam korisničkog unosa. I tako GDB nije u mogućnosti pregledati program kao što je trčanje. Sada sljedeći put da ulazim neki input-- pa ću ući u taj broj 5, kao što smo vidjeli u past-- pritisnite Return, a mi primijetiti da je, odmah GDB pauza i, opet, ističe sljedeći redak. Ali primijetite da je sada, kao Rezultat našeg unosa vrijednosti, smo ažurirali tu vrijednost unutar naših lokalnih varijabli koje vrlo je korisno znati točno što je broj bio u memoriji. Sada mogu dopustiti da ovaj program nastaviti igrati do kraja njegova izvršenja udarajući životopis. Možemo vidjeti da je vrlo brzo li program završiti izvršavanje s istim izlaz koji smo imali prije, debugger zatvara, i sad ovaj program je u potpunosti zaustavljen. Sam pokazati da je samo za Svrha vidjeti što se događa kada smo zapravo udario životopis. Ali mi zapravo ide na žele vratiti u ovaj program tako da možemo pokušati ispravljanje upravo ono što se događa. Sada kada sam koristeći program za pronalaženje pogrešaka, smijem Ne trebaju te ispravljanje printf izjave. Zato ih ja mogao ukloniti što ću učiniti sada samo vratiti na našu jednostavniji kod da smo imali prije nekoliko trenutaka. Sad kad sam spasiti programiranje i izvršiti ga, to će, opet, ići u tom početnom razbiti točku koja sam imala na liniji 11. I ja ću biti u mogućnosti pregledati moji varijable želim učiniti. To samo tako dogodi da je ovaj dio nije jako zanimljivo, I znam da ću otisnuti ovu izjavu. Unesite broj. A onda, znam da ću pitati korisnika za taj cijeli broj. Pa možda, ja zapravo želim da se presele moj razbiti točku malo dalje. Možete ukloniti break bodova klikom, opet, izravno s lijeve strane tog retka broj. To crvena točka će nestati, što ukazuje na da je pauza točka sada je otišao. Sada je u ovom slučaju, Izvršenje je zastao. I tako to nije zapravo ide nastaviti u tom slučaju. Ali ja mogu postaviti pauzu usmjerite malo kasnije. A kad sam sad nastaviti moj kod, što će se nastaviti i reći točka tog prekida točke. Opet, ja udario Nastavi. Zar ne izgledaju kao nešto što se događa. Ali to je zato što je moj kod čeka ulaz. Ja ću unijeti broj 5, pritisnite Enter, a sada sljedeći pauze točka će biti hit. Sada, u ovom slučaju, to je linija koda da, prije nego što smo znali dogodilo se lud. Tako ćemo procijeniti što se događa u ovom trenutku. Kada linija istaknuo, ova crta još nije izvršen. Dakle, u ovom slučaju, možemo vidjeti da imam broj, koji Imam cijeli broj pod nazivom num koji ima vrijednost 5. I ja ću biti obavljanje neke matematike na taj broj. Ako sam korak preko toga, možemo Obavijest da je vrijednost num promijenio u skladu s aritmetička da smo zapravo učinili. A sada da smo unutar toga za petlju ili sad da je za petlju Sam je istaknuo, vidimo da imamo novi varijabla sam nazvao da će se koristiti da se u petlji za. Zapamti Prije toga sam spomenuo da ponekad si ćemo vidjeti nekakav ludi brojevi su zadani prije tog broja ili da je varijabla zapravo inicijalizacije. Možemo vidjeti da je upravo ovdje u ovom varijable Zvao sam, koji nema još inicijalizacije u vrijeme isticanja. Ali možemo vidjeti da ima neki broj da mi ne bi zapravo očekuje. To je u redu. Ne brinite o tome jer imamo zapravo nije inicijalizira taj broj dok nisam korak preko te linije i vrijednosti ja se inicijalizira na vrijednost 1. Dakle, da se vidi da je to zapravo slučaj, idemo korak više. Sada možete vidjeti da je to linija je pogubljen. A mi smo sada naglašavajući ovo printf linije. I sada možemo vidjeti kako naše vrijednosti I i 3 su se promijenile tijekom vremena. To je vrlo korisno za napraviti, u stvari, je na korak preko linije puta. A možete pronaći ono što je zapravo se događa unutar vašeg petlje za i što se događa s varijabli unutar petlje da je za kao da je izvršenje programa javlja jedan korak u isto vrijeme. Sada u ovom trenutku, ja prišao dovoljno da sam sad sam na kraju mog programa. Ako sam korak preko toga, to će zapravo prestaje izvršenje kao što smo vidjeli u prošlosti. Dopustite mi da ponovno pokrenete ovaj, opet, tako da da mogu istaknuti nešto drugo, kao. U ovom slučaju, to je Sada me pitaju, opet, za određeni broj, koji je Ja ću opet ući. No, ovaj put, ja ću ući u veći broj, tako da je za petlju će ponoviti više puta. U ovom slučaju, idem upisati vrijednost 11. Sada opet, jer bih postaviti pauza točka na liniji 15, to će naglasiti tu liniju. Možemo vidjeti da je naš Broj 11 je ispravno zastupljene u našim lokalnim varijablama. Ulazeći preko toga, možemo sada gledati što se događa s našim vrijednosti I kao što smo nastavili u to za petlju. Ona dobiva porastao svaki put kad smo do vrha da je za petlje. Sada jedna od stvari koje bi mogle biti korisno učiniti tijekom izvršenja ovog programa je za mene zapravo promijenite varijable srednjemu vidjeti što se događa s mojim programom. U tom slučaju, mogu zapravo dvaput kliknite na vrijednosti. Obavijest da to postaje riječi. Sada mogu ući drugačije vrijednost uopce vidjeti kako moj program se ponaša kad sam promijenio tu varijablu. Sada je u ovom slučaju, varijabla ja sada sadrži vrijednost 10. No, program je još Zastao je u izvršenju. Kad sam korak više, vidim da je Vrijednost ja, koji sam ušao kao 10., nije veća od vrijednosti num, koji je odmah uzrokuje za petlju zaustaviti izvršavanju. Sada to nije jedini Razlog zašto bi želite mijenjati varijablu na mjestu. Vi zapravo možda želite pokušati ga mijenjati tako da možete nastaviti izvršenje petlje ili, tako da možete mijenjati neke vrijednosti pred njim doseže neki određeni skup aritmetici da ste o obavljati. Pa sada da smo zapravo promjenu vrijednost od i kao program je izvršavao, što je uzrokovalo za petlju prestati prerano, jer odjednom, ja slučajno biti veći od vrijednosti NUM, što znači da je za petlju više nije potrebno da bude pogubljen. Nadalje, to se dogodilo da se slučaj da se promijenio vrijednost od i kada je istaknuta linija 17, što je točka u vremenu da je za izvršenje petlje bio zapravo se procjenjuje. Ako sam promijenio vrijednost ja na drugom retku, kažu 19, bismo vidjeli drugačije ponašanje, jer linija 19 bi su izvršena prije petlje Uvjet je reevaluated. Sada u ovom trenutku, ja sam, opet, na kraju ovog programa. I ja mogu dopustiti da nastavite dopustite mi program za otkaz, naravno. No, postoji par stvari koji su važni za oduzeti od pojedinačnog razgovora. Morate procijeniti vlastite pretpostavke o tome kako je kod treba ponašati. Svaki put kada mislite da su neki komad koda znate dogodi da rade, koji bi mogli biti crvena zastava ići natrag i procijeniti, i biti sigurni da vaše pretpostavke kako se to radi kod je zapravo istina kako je to izražena u izvornom kodu. No, čak i više trenutku bio, kada koristite program za pronalaženje pogrešaka, možete staviti kontrolne točke na različitih linija koda, što će uzrokovati debugger na pauzirati izvršenje na svakom od tih redaka tako da možete procijeniti memorije ili čak ga promijeniti na mjestu. I opet, sjetite se da možete stvoriti više prijelomnih točaka, tako da Također možete nastaviti izvršenje, preskočite nad velikim dijelovima koda, i ona će automatski pauzirati na sljedećem pauze točku. Tu je zapravo napredniji značajke debugger, kao dobro. No, morat ćemo vas uputiti nekim kasnijim videa kako bi se stvarno zafrkavati osim kako je koristiti one određene funkcije. Za sada, hvala vam vrlo mnogo za gledanje. I sretno ispravljanje pogrešaka.