DOUG LLOYD: Dobre GDB. Čo je to presne? Takže GDB, ktorá stojí pre GNU Debugger, je naozaj skvelý nástroj, ktorý môžeme používajú, aby nám pomohli ladenie našich programov, alebo zistiť, kde veci sú deje zle v našich programoch. GDB je neuveriteľne silný, ale výstup a interakcie s ním môže byť trochu tajomný. Je to zvyčajne nástroj pre príkazový riadok, a to môže hodiť veľa správ na vás. A to môže trochu ťažké analyzovať presne to, čo sa deje. Našťastie sme prijali opatrenia, vyriešiť tento problém za vás ako si prácu prostredníctvom CS50. Ak nepoužívate grafickom debugger, ktoré môj kolega Dan Armandarse hovoril docela niečo o vo videu, ktorý by mala byť tu práve teraz, možno budete potrebovať Ak chcete tieto príkazový riadok nástroje pre prácu s GDB. Ak pracujete v CS50 IDE, nemusíte to urobiť. Ale ak si nie ste pracuje v CS50 IDE, Možno používate verziu z CS50 Appliance, alebo iný Linux operačný systém s GDB nainštalovaný na to, možno budete musieť použiť Tieto nástroje príkazového riadka. A pretože by ste mohli to robiť, je to užitočné len preto, aby pochopili, ako GDB práce z príkazového riadku. Ale na druhú stranu, ak ste pomocou CS50 IDE, vy môžete použiť grafický debugger ktorá je integrovaná do IDE. Tak, aby sa veci ísť s GDB, spustíte ladenie Proces konkrétny Program, všetko, čo potrebujete urobiť, je typ GDB nasledovaný podľa názvu programu. Tak napríklad, ak je váš program Dobrý deň, by zadajte GDB ahoj. Keď to urobíte, budete vytiahnuť prostredie GDB. Vaša výzva sa zmení, a namiesto toho, aby to, čo je zvyčajne je, keď napíšete niečo na príkaz line-- ls, cd-- všetky váš typický Príkazy Linux, svoju výzvu sa zmení na, pravdepodobne niečo ako zátvorkách GDB zátvorkách. To je váš nový GDB výzva, pretože ste vnútri prostredia GDB. Akonáhle ste vo vnútri tohto prostredia, tam dva hlavné príkazy že budete pravdepodobne používať v tomto poradí. Prvý z nich je b, ktorý je skratka pre prestávku. A potom, čo ste typ B, zvyčajne zadajte názov funkcie, alebo ak ste náhodou, okolo toho, čo číslo riadku váš program začína správať sa trochu divné, môžete zadať linku číslo aj tam. Čo b, alebo prestávka, robí Je to dovolí program bežať až do určitého bodu, menovite, názov funkcie že zadáte alebo linka číslo, ktoré zadáte. A v tomto bode to, zmrazí prevedení. To je naozaj dobrá vec, pretože akonáhle prevedení bol zmrazený, môžete začať veľmi pomaly krokovanie programu. Zvyčajne, ak ste boli beh vaše programy, sú to celkom krátke. Obvykle zadáte dot lomítko čokoľvek názov vášho programu, stlačte klávesu Enter, a predtým, než môžete mrknúť, vaše Program je už hotové. Nie je to naozaj veľa času, aby sa pokúsila a zistiť, čo sa deje zle. Tak sa skutočne byť schopný spomaliť veci nadol nastavením bod zlomu s B, a potom sa zapájať. Potom, akonáhle ste nastaviť prestávku bod, môžete spustiť program. A ak máte akýkoľvek argumenty príkazového riadku, ste je určiť tu, ak nie zadáte GDB Vaše meno programu. Môžete zadať všetky príkazového riadku Argumenty prijímaním r, alebo beh, a potom, čo argumenty príkazového riadku budete potrebovať vnútri vášho programu. Existuje celý rad ďalších naozaj dôležité a užitočné príkazy vnútri prostredia HDP. Tak mi dovoľte len rýchlo ísť cez niektoré z nich. Prvý z nich je n, čo je skratka pre ďalšie, a môžete zadať ďalšie miesto n, ako bude fungovať. A je to len skratka. A ako ste si pravdepodobne už dostali použitý k, je schopný zadať veci kratšie, je všeobecne lepšie. A čo to bude robiť, je, že to Krok vpred jeden blok kódu. Takže to bude pohybovať vpred až do volanie funkcie. A potom miesto potápanie do tejto funkcie a prechádzajú všetkými, ktorý funguje kód, bude to len mať funkciu. Táto funkcia bude volaná. To bude robiť, čo jej činnosť. To vráti hodnotu funkcia, ktorá ho nazýva. A potom budete presunúť na ďalší riadok tejto funkcie volania. Ak chcete krok vnútri funkcie, namiesto toho len s to vykonať, zvlášť ak si myslíte, že problém môže leží vnútri tejto funkcie, môžete samozrejme nastaviť si pauzu bod vnútri tejto funkcie. Alebo ak ste už beží, môžete Pomocou s krokom vpred jeden riadok kódu. Takže to bude krok v a ponoriť sa do funkcií, namiesto toho jednoducho execute a pokračujúce na vo funkcii že ste v pre ladenie. Ak ste niekedy chceli vedieť, hodnota premennej, môžete zadať p, alebo Tlač, a potom názov premennej. A to bude tlačiť na vás, vnútri prostredia GDB, meno premennej, že vás-- ospravedlňte me-- hodnotu premennej ktoré ste vymenoval. Ak chcete poznať hodnoty každý lokálna premenná prístupné z miesta, kde sa práve nachádzate vo vašom Program, môžete zadať info miestni obyvatelia. Je to oveľa rýchlejšie, než písanie P a potom čokoľvek, výpis z všetky premenné, ktoré viete, že existujú. Môžete zadať info miestnych obyvateľov, a to vytlačí všetko za vás. Ďalšia na rade je bt, čo je skratka pre Back Trace. Teraz, všeobecne, najmä na začiatku CS50, budete naozaj mať príležitosť používať BT, alebo Back Trace, preto, že ste nemajú funkcie že volať ďalšie funkcie. Môžete mať hlavné volať funkcie, ale to je asi to. Nemáte tú druhú funkciu volanie iné funkcie, ktoré volá inú funkciu, a tak ďalej. Ale ako vaše programy získať viac komplexu, a to najmä keď začnete pracovať s rekurzia, zadná stopa môže byť naozaj užitočný spôsob, ako vás nechať druh získať nejaké kontext, kde Ja som v mojom programe. Takže povedať, že ste napísali svoj kód, a viete, že hlavný volanie funkcie f, ktorý volá funkciu g, ktorý volá funkciu h. Takže máme niekoľko vrstiev hniezdenia deje. Ak ste vo vnútri Váš GDB prostredie, a poznáte vnútro H, ale zabudnete o tom, čo sa dostal na miesto, kde vás are-- môžete zadať BT, alebo zadnú stopu, a bude tlačiť h, g, f hlavné, popri ďalších informácií, ktoré vám dáva potuchy, že hlavné OK volal f, f zvané g, g nazvaný h, a to je, kde som V súčasnej dobe som vo svojom programe. Takže to môže byť naozaj užitočné, najmä ako kryptické-nosť GDB sa stáva trochu ohromujúce, na presne zistiť, kde sa veci majú. Nakoniec, keď sa vykonáva váš program, alebo keď ste to urobil ladenie a chcete ustúpiť z prostredia GDB, je dobré vedieť, ako sa z toho dostať. Môžete zadať Q, alebo Quit, sa dostať von. Teraz, pred dnešným videu Pripravil som kočík programu volal buggy1, ktorú som zostavil zo súboru známeho ako buggy1.c. Ako sa dalo očakávať, tento Program je v skutočnosti buggy. Niečo sa pokazí keď sa snažím a spustite ho. Teraz, bohužiaľ, som nechtiac vypúšťa môj buggy1.c súbor, tak, aby pre mňa prísť na to, čo sa deje zle s týmto programom, Budem musieť použiť GDB druh slepo, snažila navigovať prostredníctvom tohto programu zistiť, čo presne sa deje zle. Ale iba pomocou nástrojov už sme sa dozvedeli o, môžeme skoro obrázok čo presne to je. Takže poďme cez hlavu na CS50 IDE a pozrieť sa. OK, takže sme tu v mojom CS50 IDE prostredie, a ja priblížiť trochu takže môžete vidieť trochu viac. V mojom okne terminálu, keď som zoznam obsah môjho súčasného riaditeľa s LS, uvidíme, že ja majú niekoľko zdrojových súborov tu, vrátane bolo opísané skôr buggy1. Čo presne sa deje, keď Snažím sa spustiť buggy1. Tak poďme zistiť. Píšem dot lomítko, buggy, a ja stlačte Enter. Segmentácia závady. To nie je dobré. Ak si spomínate, je Porucha segmentácie typicky nastane, keď sme sa prístup k pamäti že sme nie je dovolené dotýkať. Sme nejako dosiahol vonku hraníc o tom, čo program sa kompilátor, nám dal. A tak už to je stopa, aby v paneli nástrojov ako začať proces ladenia. Niečo sa už trochu zle. V poriadku, takže začnime up na životné prostredie GDB a uvidíme, či sa nám podarí zistiť, čo presne je problém. Chystám sa prečistil obrazovku, a budem písať GDB opäť vstúpiť do životného prostredia GDB, a názov programu že chcem ladiť, buggy1. Dostaneme malý odkaz, čítanie symboly z buggy1, hotovo. Všetko, čo znamená, že je to vytiahol spolu všetok kód, a teraz to bolo naložené do GDB, a je pripravený ísť. A teraz, čo chcem robiť? Spomínaš si, čo sa Prvým krokom je zvyčajne potom, čo som si vo vnútri tohto prostredia? Dúfajme, že spomínaná sada bod zlomu, pretože V skutočnosti, že je to, čo chcem robiť. Teraz už nemajú zdrojový kód pre túto predo mnou, čo je asi nie je typický prípad použitia, mimochodom. Pravdepodobne ste nebude. Tak to je dobre. Ale za predpokladu, že nie, čo je tá funkcia, že viete, existuje v každom programe C? Bez ohľadu na to, ako veľký alebo ako zložité to je, je táto funkcia určite existuje. Main, že jo? Takže ak nie je všetko ostatné, my môžeme Nastavte miesto prerušenia na hlavnú. A opäť, som mohol len zadať zlomiť hlavné, namiesto toho, b. A ak ste zvedaví, či niekedy zadajte si dlho príkaz a potom si uvedomiť, že vás napísal niečo zlé, a chcete sa zbaviť zo všetkého, ako som práve urobil, si môžete prevziať kontrolu U, ktorý bude zmazať všetko a priviesť späť na začiatok kurzorových liniek. Oveľa rýchlejšie než len podržte vymazať, alebo biť to banda krát nad. Takže budeme nastaviť bod zlomu na hlavnú. A ako môžete vidieť, je to hovorí, že máme Nastavte miesto prerušenia v súbore buggy1.c, a zrejme prvý riadok kódu z hlavnej linky je sedem. Opäť platí, že nemáme zdrojový súbor tu, ale budem predpokladať, že je to mi pravdu. A potom, len sa snažím a spustiť program, r. Spustení programu. Dobre, takže táto správa je trochu tajomný. Ale v podstate to, čo je deje, tu je to len hovoril mi, že som udrel svoju prestávku bod, bod zlomu číslo 1. A potom, že riadok kódu, Súbor alebo adresár neexistuje. Jediný dôvod, prečo Vidím tú správu je preto, že som nechtiac vypúšťa môj buggy.c súboru. Keby moje buggy1.c súbor existuje v aktuálnom adresári, že linka priamo tam by vlastne povedz mi, čo riadok kódu doslova číta. Bohužiaľ, Vymazal som ho. Budeme musieť trochu navigáciu cez to trochu viac slepo. OK, takže uvidíme, čo sa chcem robiť? No, ja by som rád vedel, čo miestne Premenné Možno mám k dispozícii. Ja som začal môj program. Pozrime sa, čo by mohlo byť už inicializovaný pre nás. Píšem Info miestni obyvatelia, žiadne miestni obyvatelia. Dobre, takže nie je daj mi veľa informácií. Mohol by som skúsiť a vytlačiť premennú, ale ja neviem, žiadne názvy premenných. Mohol by som skúsiť zadné stopu, ale ja som vo vnútri hlavné, takže viem, že neurobili ďalšie volanie funkcie práve teraz. Tak vyzerá moje jediné možnosti sú používať n alebo tak a začať do toho ponoriť. Budem používať n. Tak som typ N. Ach môj bože, čo sa tu deje. Program prijímané signály, SIGSEGV chyba segmentácia, a potom sa celá partia veci. Ja už som ohromený. No, je to vlastne Veľa sa tu naučil. Takže to, čo nám to hovorí? To, čo nám hovorí, je tento program chystal, ale doteraz nedošlo, seg chyba. A najmä, idem priblížite ešte tu, je to o tom, aby Seg chybu o niečo, čo nazýva strcmp. Teraz, nemôžeme diskutovali Táto funkcia značne. Ale to je--, pretože nebudeme hovoriť o všetky funkcie, ktoré existuje v štandarde C library-- ale všetci sú vám k dispozícii, najmä ak užívate pozrite sa na reference.cs50.net. A strcmp je naozaj silný funkcia, ktorá existuje vo vnútri z string.h hlavičky Súbor, ktorý je hlavička Súbor, ktorý je venovaný funkciám že práca sa a manipulovať s reťazcami. A predovšetkým, čo robí, je strcmp porovnáva hodnoty dvoch reťazcov. Takže som asi segmentácie poruchy Na základe výzvy na strcmp sa zdá. Som narazila n, a v skutočnosti sa zobrazí správa, Program ukončený signálom SIGSEGV chyba segmentácie. Takže teraz Vlastne som si seg vyčítané, a môj program má dosť oveľa efektívnejšie vzdal. To je koniec programu. To sa pokazil, havaroval. Takže nebolo moc, ale ja v skutočnosti sa dozvedel trochu z tejto malej skúsenosti. Čo som sa naučil? No, môj zrútenie programu skoro okamžite. Môj zrútenie programu na výzva k strcmp, ale ja nemajú žiadne lokálne premenné v mojom Program v čase, keď došlo k zrúteniu. Takže to, čo reťazca, alebo reťazca, by som mohol byť porovnávanie. Ak nemám akýkoľvek miestny premenné, môžete dohadovať, že som have-- tam možno je globálna premenná, ktorá by mohla byť pravda. Všeobecne ale, zdá sa, ako by som porovnávanie k niečomu, čo neexistuje. Takže poďme preskúmať že o kúsok ďalej. Takže som sa, aby som si vyčistil obrazovku. Chystám sa ukončiť von z GDB prostredie na sekundu. A ja som premýšľal, OK, takže je tu žiadne lokálne premenné v mojom programe. Zaujímalo by ma, či by si mám odovzdať v reťazci ako argument príkazového riadku. Tak nech to len vyskúšať to. Neurobil som to predtým. Uvidíme, či Možno keby som spustiť tento program s argument príkazového riadka to funguje. Huh, žiadna chyba tam segmentácie. To mi povedal, že som na to prišiel. Takže možno, že je to oprava sem. A skutočne, keď som sa vrátiť a pozrieť sa na aktuálny zdrojový kód pre buggy1.c, sa zdá, že to, čo robím, je Robím volanie strcmp bez overenie, či v skutočnosti argv [1] existuje. To je vlastne zdrojový kód pre buggy1.c. Takže to, čo naozaj potrebujete urobiť tu pre opravu môj program, za predpokladu, že mám mať súbor predo mnou, je len pridať šek, aby sa či argc je rovný 2. Takže tento príklad, opäť, ako som povedal, je trochu neprirodzený, že jo? Tie zvyčajne nebude omylom zmazať zdrojového kódu a potom sa musieť pokúsiť a ladenie programu. Ale dúfajme, že dal ste ilustrácie z druhov vecí, ktoré by ste mohli myslieť ako ste ladenie programu. Aký je stav vecí tu? Čo robiť premenné I majú prístup na mňa? Kde presne je môj program zhadzovať, na akom línie, o tom, čo volanie akú funkciu? Aké stopy však, že mi dal? A to je presne druh myslenia, ktoré vám by malo byť dostať sa do, keď ste premýšľať o ladenie programov. Som Doug Lloyd. To je CS50.