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.