>> Doug LLOYD: Dobro GDB.
Što je to točno?
Dakle GDB, koja stoji za GNU Debugger,
je stvarno strašan alat koji možemo koristiti kako bi nam pomogli ispravljanje naših programa,
ili saznati gdje su stvari ide krivo u našim programima.
GDB je nevjerojatno moćan, ali izlaz i interakciju s njom
može biti malo zagonetan.
To je obično alat naredbenog retka, i to može baciti puno poruka na vas.
A to može vrsta teško analizirati upravo ono što se događa.
Srećom, mi smo poduzela korake popraviti ovaj problem za vas
kao što rade kroz CS50.
Ako ne koristite grafički program za pronalaženje pogrešaka, koje je moj kolega Dan
Armandarse je govorio dosta malo o u videu koji
bi trebao biti ovdje upravo sada, možda ćete morati
koristiti ove naredbenog retka alati za rad s GDB.
Ako radite u CS50 IDE, ne morate to učiniti.
No, ako niste rade u CS50 IDE,
možda koristite inačicu od CS50 Appliance,
ili neki drugi Linux operativni sustav s GDB instaliran na njemu,
možda ćete morati koristiti ovi alati naredbenog retka.
>> A budući da bi mogli morate to učiniti, to je
korisno samo da shvate kako GDB radi iz naredbenog retka.
Ali opet, ako ste pomoću CS50 IDE, što
možete koristiti grafički program za pronalaženje pogrešaka koji je izgrađen u IDE.
Tako da se stvari događa s GDB, za početak ispravljanje pogrešaka
Proces određeni Program, sve što trebate napraviti
je tip GDB slijedi po nazivu programa.
Tako na primjer, ako je vaš program Pozdrav, te će upisati GDB pozdrav.
>> Kad to učinite, vi ćete podići GDB okoliš.
Vaš upit će se promijeniti, a umjesto da bude ono što je obično
kada upišete stvari U naredbeni line-- LS,
cd-- sve vaše tipične Linux naredbe, vaš upit
će promijeniti, vjerojatno, nešto kao zagradi GDB zagradama.
To je tvoj novi GDB brz, jer si unutar GDB okoliš.
Jednom unutar tog okruženja, postoje dva glavna zapovjedništva
da ćete vjerojatno koristiti u slijedećem redoslijedu.
>> Prvi je b, koji je je kratica za odmor.
I nakon što tip B, obično Upišite naziv funkcije,
ili ako vam se dogoditi da znate oko što je broj linija
vaš program počinje da se ponašaju malo čudno,
možete upisati liniju Broj tamo.
Što b ili pauze, ne je li vam vaš program
pokrenuti do određene točke, naime, naziv funkcije
da navedete ili linija broj koji ste odredili.
>> I u tom trenutku je, će zamrznuti izvršenje.
Ovo je stvarno dobra stvar, jer je Jednom je izvršenje zamrznuta,
možete početi vrlo polako korak kroz svoj program.
Obično, ako ste bili trčanje svoje programe, oni su prilično kratki.
Obično upišete dot crta što god naziv vašeg programa, pritisnite Enter,
i prije nego što možete treptati, vaš Program je već gotov.
To zapravo i nije puno vremena za probati i shvatiti što se događa u krivu.
Dakle, to je stvarno da bi mogli usporiti stvari dolje postavljanjem break sa b,
a zatim koračni u.
>> Onda kada ste postavili svoj odmor točka, možete pokrenuti program.
A ako imate bilo argumente naredbenog retka,
ih navesti ovdje, a ne kada upišete GDB vaše ime programa.
Vi određujete sve komandne linije Argumenti po uzimanja R, ili trčanje,
a zatim god argumente naredbenog retka trebate unutar vašeg programa.
Postoji i niz drugih stvarno važne i korisne naredbe
unutar okoliša BDP-a.
Zato mi dopustite da jednostavno brzo ići preko neke od njih.
>> Prvi je nje, što je kratica za sljedeći, a možete upisati iduće umjesto n,
kako će raditi.
I to je samo stenogram.
I kao što ste vjerojatno već stečen koristi se, biti u mogućnosti upisati stvari
kraći je općenito bolje.
A ono što će učiniti je da će korak naprijed jedan blok koda.
Dakle, to će pomaknuti naprijed dok funkcija poziva.
I onda, umjesto Ronjenje u tu funkciju
a prolazi kroz sve to funkcionira kod, samo će imati funkciju.
>> Funkcija će se zvati.
To će učiniti sve što je njegov rad je.
To će vratiti vrijednost funkcija koja ga zove.
A onda ćete prijeđite na Sljedeći redak tu funkciju poziva.
Ako želite korak unutar funkcije,
umjesto samo s to izvršiti, osobito
ako mislite da je problem možda leže unutar tog funkcije,
možete, naravno, postaviti pauzu ukazuju unutar tu funkciju.
Ili, ako ste već pokrenut, možete Sa s korak naprijed jedan redak koda.
>> Dakle, to će intervenirati Uronite u funkcijama,
umjesto da samo imaju izvršiti i nastavlja se na u funkciji
da ste u za ispravljanje pogrešaka.
Ako ste ikada željeli znati vrijednost varijable,
možete upisati p ili ispisati, a zatim varijabla imena.
I to će se ispisati na vas, unutar GDB okoliša,
naziv varijable, koje you-- oprostite me-- vrijednost varijable
da ste nazvali.
Ako želite znati vrijednosti svake Lokalni varijabla pristupiti odakle
Trenutno u svom Program možete upisati info mještanima.
To je puno brže nego upisivanjem p a zatim god,
popis sve od varijable koje znate postoje.
Možete upisati info mještanima, a to će ispisati sve za vas.
Dalje se je širok, što je kratko za povratak u tragovima.
Sada, u pravilu, osobito u ranom CS50,
ti stvarno neće imati prigodu koristiti BT ili leđima trag,
jer nećete jesti funkcije da zovu druge funkcije.
>> Možda ste glavni nazvati funkciju, ali to je vjerojatno to.
Vi nemate drugu funkciju zovete drugu funkciju, koja
poziva drugi funkciju, i tako dalje.
No, kao i svoje programe dobiti više kompleks, a naročito
kada počnete raditi s rekurzije, ponovno traga
može biti jako koristan način da vas pustiti vrsta dobiti neki kontekst u kojem
Ja sam u svom programu.
Dakle, reći da ste napisali svoj kod, i znate da je glavna poziva funkciju
F, koja poziva funkciju g, što zove funkciju h.
Dakle, imamo nekoliko slojeva od gniježđenje ovdje događa.
>> Ako ste unutar Vaša GDB okoliš,
i znate svoj unutrašnjost H, ali zaboraviti
o tome što vas je dobio na kojoj ste are-- možete upisati BT ili natrag trag,
i to će ispisati h, g, f glavna, uz neke druge informacije, koje
daje naslutiti da je, u redu glavni zove f, f naziva g, g naziva h,
i to je gdje sam Trenutno sam u mom programu.
Dakle, to može biti jako korisno, osobito kao grobni-ness od GDB
postaje malo neodoljiv, da saznati točno gdje su stvari.
Konačno, kada je vaš program je učinio, ili kada završite ispravljanje pogrešaka ga
a želite odmaknuti iz GDB okoliša,
to pomaže da znate kako izaći iz nje.
Možete upisati Q ili Quit, izaći.
Sada, prije današnjeg videa Ja pripremio lud programa
zove buggy1, koji sam sastavio iz datoteke poznat kao buggy1.c.
Kao što ste mogli očekivati, to Program je zapravo lud.
Nešto pođe po zlu kad sam probati i pokrenite ga.
Sada, na žalost, ja nehotice izbrisan moj buggy1.c datoteku,
tako da bi za mene shvatiti što se događa u redu s ovim programom,
Ću morati koristiti GDB vrsta slijepo, pokušavajući
za navigaciju kroz ovaj program se shvatiti točno ono što se događa u krivu.
No, koristeći samo alate smo već naučili o,
možemo prilično mnogo figuru točno što je to.
Pa neka je nad glavom CS50 IDE i imaju izgled.
U redu, tako da smo ovdje u mom CS50 IDE okoliš,
i ja ću povećavanje malo tako da možete vidjeti malo više.
U mom prozoru terminala, ako sam popis sadržaj mog trenutnog direktora
s LS, mi ćemo vidjeti da sam ima par izvornih datoteka
Ovdje, uključujući prethodno objašnjeno buggy1.
Što se točno događa kada Pokušavam pokrenuti buggy1.
Pa neka je saznati.
I tip dot crta, lud, a ja pritisnite Enter.
>> Segmentacija greške.
To nije dobro.
Ako se sjećate, A obično segmentacije kvara
javlja kada smo pristupili memorije da mi ne smijemo dirati.
Mi nekako smo stigli izvan granica
onoga programa, prevodilac, nam je dao.
I tako već da je trag držati u kutiji za alat
kao što smo započeli proces ispravljanje pogrešaka.
Nešto je otišao malo krivo ovdje.
>> U redu, počnimo gore GDB okoliš
i vidjeti ako mi može shvatiti što je točno problem.
Idem da razbistrim zaslon, a ja ću upisati GDB
opet ući u GDB okoliš, i naziv programa
da želim debug, buggy1.
Mi smo dobili malo poruku, čitanje simbola iz buggy1, učinjeno.
Sve to znači da je on izvukao zajedno sve koda,
a sada je stavljen u GDB, i to je spreman za ići.
>> Sad, ono što želim učiniti?
Sjećate li se što se Prvi korak je tipično
nakon što sam unutar tog okruženja?
Nadamo se da navedeni skup break point, jer
Zapravo to je ono što želim učiniti.
Sad, ja ne imati izvorni kod za to
ispred mene, što je vjerojatno Nije tipična uporaba slučaj, usput.
Vjerojatno neće.
Dakle, to je dobro.
Ali uz pretpostavku da ne, ono što je onaj funkcija da znate
postoji u svakom pojedinom C program?
Bez obzira koliko veliki ili koliko je komplicirano je, ova funkcija svakako postoji.
Glavni, zar ne?
>> Dakle, nije sve ostalo, možemo postaviti break na glavni.
A opet, mogao sam samo tip razbiti glavni, umjesto b.
A ako vas zanima, ako vas nikad tip iz dugo naredbu
a onda shvatite da vas upisali krivu stvar,
i želite da biste dobili osloboditi od svega što sam upravo učinio,
možete preuzeti kontrolu U, koji će izbrisati sve i dovesti vas natrag
na početku kursorskim linije.
Mnogo brže nego samo držite brisati ili udaranje ga hrpa puta
više.
>> Tako ćemo postaviti break na glavni.
I kao što možete vidjeti, on kaže mi smo postaviti break u datotečnom buggy1.c,
i očito prva linija koda od glavna je crta sedam.
Opet, mi nemamo izvor datoteka ovdje
ali ću pretpostaviti da je govori mi istinu.
A onda, samo pokušavam i pokrenuti program, r.
Pokretanje programa.
U redu, tako da ova poruka je malo zagonetan.
No, ono što je u osnovi ovdje događa je da je to samo
mi govori da sam pogodio moju pauzu točka, pauza točka broj 1.
>> A onda, da je linija koda, nema takve datoteke ili direktorija.
Jedini razlog zbog kojeg Vidim tu poruku
je zato što sam slučajno izbrisan moj buggy.c datoteku.
Ako je postojala moja buggy1.c datoteka u trenutnom direktoriju,
da crta upravo tamo bi zapravo reci mi što je linija koda
doslovno čita.
Nažalost, to sam izbrisan.
Ćemo morati vrsta navigaciju kroz to malo više slijepo.
>> U redu, da vidimo, što Ne želim raditi ovdje?
Pa, ja bih znati što lokalne varijable možda su mi dostupni.
Ja sam počeo moj program.
Idemo vidjeti što bi moglo biti Već inicijalizacije za nas.
I tip Info mještani, bez mještana.
U redu, tako da se ne dajte mi tonu informacija.
Mogao bih pokušati ispisati varijablu, ali ja ne znam niti varijablu imena.
Mogao bih probati natrag trag, ali sam unutar glavna,
tako da znam nisam napravio još jedna funkcija poziva upravo sada.
>> Tako izgleda kao moje samo su opcije koristiti nje ili tako i početi roniti u.
Idem koristiti n.
Tako sam tip nje.
O, moj Bože, što se ovdje događa.
Program za primljene signale, SIGSEGV segmentacija kriv,
a onda cijela hrpa stvari.
Ja sam već osvaja.
Pa, tu je zapravo Mnogo se saznaje ovdje.
Pa što nam to govori?
Ono što nam govori je, ovaj program je o da, ali još nije, SEG kriv.
A posebno, idem za povećavanje i dalje tu,
je o SEG grešku o nešto što se zove strcmp.
>> Sada smo možda smo razgovarali ova funkcija opsežno.
Ali to is--, jer ne idemo govoriti o sve funkcije koje
postoji u C standardu library-- ali oni su sve dostupne za vas,
pogotovo ako se uzme pogledajte reference.cs50.net.
I strcmp je stvarno moćan funkcija koja postoji unutar
od string.h zaglavlja datoteka, što je zaglavlje
datoteka koja je posvećena funkcije koji rade sa i manipulirati žice.
>> A posebno, što se je strcmp uspoređuje vrijednosti dvije žice.
Tako ću do segmentacije kvara na poziv da strcmp čini.
Sam pogodio nje, i zapravo dobivam poruku, Program prestaje sa signalom SIGSEGV
Segmentacija kriv. Tako sada Ja zapravo SEG su okrivio,
i moj program ima dosta koliko učinkovito odustali.
Ovo je kraj programa.
To se pokvario, on se srušio.
Dakle, nije bilo puno, ali ja doista naučiti dosta
iz ovog malog iskustva.
Što sam naučio?
Pa, moj program se ruši prilično odmah.
Moj program ruši na poziv na strcmp, ali ja
nemaju nikakve lokalne varijable u mom Program u vrijeme kad se ruši.
Pa što string ili žice, bih mogao biti usporedbom.
Ako ne imati bilo koji lokalni varijable, možda
Pretpostavljam da sam have-- postoji možda je Globalna varijabla, koja bi mogla biti istina.
>> Ali općenito, čini se kao da sam uspoređivanje
na nešto što ne postoji.
Tako ćemo istražiti da malo dalje.
Tako ću razbistriti zaslon.
Idem prestati iz kategorije GDB okruženje za sekundu.
I ja sam razmišljao, u redu, tako da Nema lokalne varijable u moj program.
Pitam se je li možda sam trebao proći u nizu kao argument komandne linije u.
Pa neka je samo testiranje ovo.
Nisam to učinio prije.
>> Da vidimo je li možda, ako sam pokrenuti ovaj program s naredbenog retka argument je da radi.
Huh, nije kriv segmentacija tamo.
To mi je samo rekao da sam ga shvatio.
Dakle, možda je to popraviti ovdje.
I doista, ako sam se vratiti i pogledati stvarni izvorni kod za buggy1.c,
čini se kao da je ono što ja radim je Ja sam upućivanja poziva za strcmp bez
provjeru argv [1] postoji li u stvari.
To je zapravo izvorni kod za buggy1.c.
Dakle, ono što stvarno trebate učiniti ovdje za škripac moj program,
pretpostavljajući imam file ispred mene,
samo dodati provjerite li argc jednak 2.
Dakle, ovo je primjer, opet, kao što sam rekao, je malo neprirodan, zar ne?
Vi obično ne ide slučajno izbrisati izvorni kod
a onda morate probati i ispravljanje program.
No, nadamo se, da je dao što ilustracija
od vrste stvari koje što bi se moglo razmišljati o
kao što ste ispravljanje pogrešaka u programu.
>> Što je stanje ovdje stvari?
Koje varijable ne ja imaju dostupan za mene?
Gdje je točno moj program pad, na kojoj liniji,
na ono što poziva na kojoj funkciji?
Kakve tragove to mi dati?
I to je točno vrsta razmišljanja koja vas
Treba uzimajući u kada ste razmišljam o debugging svoje programe.
>> Ja sam Doug Lloyd.
Ovo je CS50.