DOUG LLOYD: Dobře GDB. Co je to přesně? Takže GDB, která stojí pro GNU Debugger, je opravdu skvělý nástroj, který můžeme používají, aby nám pomohli ladění našich programů, nebo zjistit, kde věci jsou děje špatně v našich programech. GDB je neuvěřitelně silný, ale výstup a interakce s ním může být trochu tajemný. Je to obvykle nástroj pro příkazovou řádku, a to může hodit hodně zpráv na vás. A to může trochu těžké analyzovat přesně to, co se děje. Naštěstí jsme přijata opatření, vyřešit tento problém za vás jak si práci prostřednictvím CS50. Pokud nepoužíváte grafickém debugger, které můj kolega Dan Armandarse mluvil docela něco o ve videu, který by měla být tady právě teď, možná budete potřebovat Chcete-li tyto příkazový řádek nástroje pro práci s GDB. Pokud pracujete v CS50 IDE, nemusíte to udělat. Ale pokud si nejste pracuje v CS50 IDE, Možná používáte verzi z CS50 Appliance, nebo jiný Linux operační systém s GDB nainstalován na to, možná budete muset použít Tyto nástroje příkazového řádku. A protože byste mohli to dělat, je to užitečné jen proto, aby pochopili, jak GDB práce z příkazového řádku. Ale na druhou stranu, pokud jste pomocí CS50 IDE, vy můžete použít grafický debugger která je integrována do IDE. Tak, aby se věci jít s GDB, spustíte ladění Proces konkrétní Program, vše, co potřebujete udělat, je typ GDB následován podle názvu programu. Tak například, pokud je váš program Dobrý den, by zadejte GDB ahoj. Když to uděláte, budete vytáhnout prostředí GDB. Vaše výzva se změní, a místo toho, aby to, co je obvykle je, když napíšete něco na příkaz line-- ls, cd-- všechny váš typický Příkazy Linux, svou výzvu se změní na, pravděpodobně něco jako závorkách GDB závorkách. To je váš nový GDB výzva, protože jste uvnitř prostředí GDB. Jakmile jste uvnitř tohoto prostředí, tam dva hlavní příkazy že budete pravděpodobně používat v tomto pořadí. První z nich je b, který je zkratka pro přestávku. A poté, co jste typ B, obvykle zadejte název funkce, nebo pokud jste náhodou, kolem toho, co číslo řádku váš program začíná chovat se trochu divné, můžete zadat linku číslo i tam. Co b, nebo přestávka, dělá Je to dovolí program běžet až do určitého bodu, jmenovitě, název funkce že zadáte nebo linka číslo, které zadáte. A v tomto bodě to, zmrazí provedení. To je opravdu dobrá věc, protože jakmile provedení byl zmrazen, můžete začít velmi pomalu krokování programu. Obvykle, pokud jste byli běh vaše programy, jsou to docela krátké. Obvykle zadáte dot lomítko cokoliv název vašeho programu, stiskněte klávesu Enter, a předtím, než můžete mrknout, vaše Program je již hotové. Není to opravdu hodně času, aby se pokusila a zjistit, co se děje špatně. Tak se skutečně být schopen zpomalit věci dolů nastavením bod zlomu s B, a pak se zapojovat. Pak, jakmile jste nastavit přestávku bod, můžete spustit program. A pokud máte jakýkoli argumenty příkazového řádku, jste je určit tady, ne-li zadáte GDB Vaše jméno programu. Můžete zadat všechny příkazového řádku Argumenty přijímáním r, nebo běh, a poté, co argumenty příkazového řádku budete potřebovat uvnitř vašeho programu. Existuje celá řada dalších opravdu důležité a užitečné příkazy uvnitř prostředí HDP. Tak mi dovolte jen rychle jít přes některé z nich. První z nich je n, což je zkratka pro další, a můžete zadat další místo n, jak bude fungovat. A je to jen zkratka. A jak jste si pravděpodobně již dostali použit k, je schopen zadat věci kratší, je obecně lepší. A co to bude dělat, je, že to Krok vpřed jeden blok kódu. Takže to bude pohybovat vpřed až do volání funkce. A pak místo potápění do této funkce a procházejí všemi, který funguje kód, bude to jen mít funkci. Tato funkce bude volána. To bude dělat, co její činnost. To vrátí hodnotu funkce, která jej nazývá. A pak budete přesunout na další řádek této funkce volání. Chcete-li krok uvnitř funkce, místo toho jen s to provést, zvláště pokud si myslíte, že problém může leží uvnitř této funkce, můžete samozřejmě nastavit si pauzu bod uvnitř této funkce. Nebo pokud jste již běží, můžete Pomocí s krokem vpřed jeden řádek kódu. Takže to bude krok v a ponořit se do funkcí, místo toho prostě execute a pokračující na ve funkci že jste v pro ladění. Pokud jste někdy chtěli vědět, hodnota proměnné, můžete zadat p, nebo Tisk, a pak název proměnné. A to bude tisknout na vás, uvnitř prostředí GDB, jméno proměnné, že vás-- omluvte me-- hodnotu proměnné které jste jmenoval. Chcete-li znát hodnoty každý lokální proměnná přístupné z místa, kde se právě nacházíte ve vašem Program, můžete zadat info místní obyvatelé. Je to mnohem rychlejší, než psaní P a pak cokoliv, výpis z všechny proměnné, které víte, že existují. Můžete zadat info místních obyvatel, a to vytiskne vše za vás. Další na řadě je bt, což je zkratka pro Back Trace. Nyní, obecně, zejména na počátku CS50, budete opravdu mít příležitost používat BT, nebo Back Trace, proto, že jste nemají funkce že volat další funkce. Můžete mít hlavní volat funkce, ale to je asi to. Nemáte tu druhou funkci volání jiné funkce, které volá jinou funkci, a tak dále. Ale jak vaše programy získat více komplexu, a to zejména když začnete pracovat s rekurze, zadní stopa může být opravdu užitečný způsob, jak vás nechat druh získat nějaké kontext, kde Já jsem v mém programu. Takže říct, že jste napsali svůj kód, a víte, že hlavní volání funkce f, který volá funkci g, který volá funkci h. Takže máme několik vrstev hnízdění děje. Pokud jste uvnitř Váš GDB prostředí, a znáte vnitřek H, ale zapomenete o tom, co se dostal na místo, kde vás are-- můžete zadat BT, nebo zadní stopu, a bude tisknout h, g, f hlavní, vedle dalších informací, které vám dává ponětí, že hlavní OK volal f, f zvané g, g nazvaný h, a to je, kde jsem V současné době jsem ve svém programu. Takže to může být opravdu užitečné, zejména jako kryptické-nost GDB se stává trochu ohromující, na přesně zjistit, kde se věci mají. Nakonec, když se provádí váš program, nebo když jste to udělal ladění a chcete ustoupit z prostředí GDB, je dobré vědět, jak se z toho dostat. Můžete zadat Q, nebo Quit, se dostat ven. Nyní, před dnešním videu Připravil jsem kočárek programu volal buggy1, kterou jsem sestavil ze souboru známého jako buggy1.c. Jak se dalo očekávat, tento Program je ve skutečnosti buggy. Něco se pokazí když se snažím a spusťte jej. Nyní, bohužel, jsem nechtěně vypouští můj buggy1.c soubor, tak, aby pro mě přijít na to, co se děje špatně s tímto programem, Budu muset použít GDB druh slepě, snažila navigovat prostřednictvím tohoto programu zjistit, co přesně se děje špatně. Ale pouze pomocí nástrojů už jsme se dozvěděli o, můžeme skoro obrázek co přesně to je. Takže pojďme přes hlavu na CS50 IDE a podívat se. OK, takže jsme tady v mém CS50 IDE prostředí, a já přiblížit trochu takže můžete vidět trochu více. V mém okně terminálu, když jsem seznam obsah mého současného ředitele s LS, uvidíme, že já mají několik zdrojových souborů tady, včetně bylo popsáno dříve buggy1. Co přesně se děje, když Snažím se spustit buggy1. Tak pojďme zjistit. Píšu dot lomítko, buggy, a já stiskněte klávesu Enter. Segmentace závady. To není dobré. Pokud si vzpomínáte, je Porucha segmentace typicky nastane, když jsme se přístup k paměti že jsme není dovoleno dotýkat. Jsme nějak dosáhl venku hranic o tom, co program se kompilátor, nám dal. A tak už to je stopa, aby v panelu nástrojů jak začít proces ladění. Něco se už trochu špatně. V pořádku, takže začněme up na životní prostředí GDB a uvidíme, jestli se nám podaří zjistit, co přesně je problém. Chystám se pročistil obrazovku, a budu psát GDB opět vstoupit do životního prostředí GDB, a název programu že chci ladit, buggy1. Dostaneme malý vzkaz, čtení symboly z buggy1, hotovo. Vše, co znamená, že je to vytáhl spolu veškerý kód, a teď to bylo naloženo do GDB, a je připraven jít. A teď, co chci dělat? Vzpomínáš si, co se Prvním krokem je obvykle poté, co jsem si uvnitř tohoto prostředí? Doufejme, že zmíněná sada bod zlomu, protože Ve skutečnosti, že je to, co chci dělat. Teď už nemají zdrojový kód pro tuto přede mnou, což je asi není typický případ užití, mimochodem. Pravděpodobně jste nebude. Tak to je dobře. Ale za předpokladu, že ne, co je ta funkce, že víte, existuje v každém programu C? Bez ohledu na to, jak velký nebo jak složité to je, je tato funkce určitě existuje. Main, že jo? Takže není-li vše ostatní, my můžeme Nastavte místo přerušení na hlavní. A opět, jsem mohl jen zadat zlomit hlavní, místo toho, b. A pokud jste zvědaví, jestli někdy zadejte si dlouze příkaz a pak si uvědomit, že vás napsal něco špatného, a chcete se zbavit ze všeho, jak jsem právě udělal, si můžete převzít kontrolu U, který bude smazat všechno a přivést zpět na začátek kurzorových linek. Mnohem rychleji než jen podržte vymazat, nebo bít to banda krát nad. Takže budeme nastavit bod zlomu na hlavní. A jak můžete vidět, je to říká, že máme Nastavte místo přerušení v souboru buggy1.c, a zřejmě první řádek kódu z hlavní linky je sedm. Opět platí, že nemáme zdrojový soubor zde, ale budu předpokládat, že je to mi pravdu. A pak, jen se snažím a spustit program, r. Spuštění programu. Dobře, takže tato zpráva je trochu tajemný. Ale v podstatě to, co je děje, tady je to jen říkal mi, že jsem udeřil svou přestávku bod, bod zlomu číslo 1. A pak, že řádek kódu, Žádný takový soubor nebo adresář. Jediný důvod, proč Vidím tu zprávu je proto, že jsem nechtěně vypouští můj buggy.c souboru. Kdyby moje buggy1.c soubor existuje v aktuálním adresáři, že linka přímo tam by vlastně řekni mi, co řádek kódu doslova čte. Bohužel, Vymazal jsem ho. Budeme muset trochu navigaci přes to trochu víc slepě. OK, takže uvidíme, co se chci dělat? No, já bych rád věděl, co místní Proměnné Možná mám k dispozici. Já jsem začal můj program. Podívejme se, co by mohlo být již inicializován pro nás. Píšu Info místní obyvatelé, žádné místní obyvatelé. Dobře, takže není dej mi spoustu informací. Mohl bych zkusit a vytisknout proměnnou, ale já nevím, žádné názvy proměnných. Mohl bych zkusit zadní stopu, ale já jsem uvnitř hlavní, takže vím, že neučinily další volání funkce právě teď. Tak vypadá moje jediné možnosti jsou používat n nebo tak a začít do toho ponořit. Budu používat n. Tak jsem typ N. Ach můj bože, co se tu děje. Program přijímané signály, SIGSEGV chyba segmentace, a pak se celá parta věci. Já už jsem ohromen. No, je to vlastně Hodně se zde naučil. Takže to, co nám to říká? To, co nám říká, je tento program chystal, ale dosud nedošlo, seg chyba. A zejména, jdu přiblížíte ještě tady, je to o tom, aby Seg chybu o něco, co nazývá strcmp. Nyní, nemůžeme diskutovali Tato funkce značně. Ale to je--, protože nebudeme mluvit o všechny funkce, které existuje ve standardu C library-- ale všichni jsou vám k dispozici, zvláště pokud užíváte podívejte se na reference.cs50.net. A strcmp je opravdu silný funkce, která existuje uvnitř z string.h hlavičky Soubor, který je hlavička Soubor, který je věnován funkcím že práce se a manipulovat s řetězci. A především, co dělá, je strcmp srovnává hodnoty dvou řetězců. Takže jsem asi segmentace poruchy Na základě výzvy k strcmp se zdá. Jsem narazila n, a ve skutečnosti se zobrazí zpráva, Program ukončen signálem SIGSEGV chyba segmentace. Tak teď Vlastně jsem si seg vyčítáno, a můj program má dost mnohem efektivněji vzdal. To je konec programu. To se porouchal, havaroval. Takže nebylo moc, ale já ve skutečnosti se dozvěděl trochu z této malé zkušenosti. Co jsem se naučil? No, můj zhroucení programu skoro okamžitě. Můj zhroucení programu na výzva k strcmp, ale já nemají žádné lokální proměnné v mém Program v době, kdy došlo ke zhroucení. Takže to, co řetězce, nebo řetězce, bych mohl být porovnávání. Pokud nemám jakýkoli místní proměnné, můžete dohadovat, že jsem have-- tam možná je globální proměnná, která by mohla být pravda. Obecně ale, zdá se, jako bych porovnávání k něčemu, co neexistuje. Takže pojďme prozkoumat že o kousek dál. Takže jsem se, abych si pročistil obrazovku. Chystám se ukončit ven z GDB prostředí na vteřinu. A já jsem přemýšlel, OK, takže je tu žádné lokální proměnné v mém programu. Zajímalo by mě, jestli bys mám předat v řetězci jako argument příkazového řádku. Tak ať to jen vyzkoušet to. Neudělal jsem to předtím. Uvidíme, jestli Možná kdybych spustit tento program s argument příkazového řádku to funguje. Huh, žádná chyba tam segmentace. To mi řekl, že jsem na to přišel. Takže možná, že je to oprava sem. A skutečně, když jsem se vrátit a podívat se na aktuální zdrojový kód pro buggy1.c, se zdá, že to, co dělám, je Dělám volání strcmp bez ověření, zda ve skutečnosti argv [1] existuje. To je vlastně zdrojový kód pro buggy1.c. Takže to, co opravdu potřebujete učinit zde pro opravu můj program, za předpokladu, že mám mít soubor přede mnou, je jen přidat šek, aby se zda argc je roven 2. Takže tento příklad, opět, jak jsem řekl, je trochu nepřirozený, že jo? Ty obvykle nebude omylem smazat zdrojového kódu a pak se muset pokusit a ladění programu. Ale doufejme, že dal jste ilustrace z druhů věcí, které byste mohli myslet jak jste ladění programu. Jaký je stav věcí tady? Co dělat proměnné I mají přístup na mě? Kde přesně je můj program shazovat, na jakém linie, o tom, co volání jakou funkci? Jaké stopy však, že mi dal? A to je přesně druh myšlení, které vám by mělo být dostat se do, když jste přemýšlet o ladění programů. Jsem Doug Lloyd. To je CS50.