1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, GNU projekt Debugger, je mocný ladící nástroj pro C, 2 00:00:12,630 --> 00:00:14,300 spolu s mnoha dalšími jazyky. 3 00:00:14,300 --> 00:00:17,440 To vám umožní hrabat kolem uvnitř vašich programů v jazyce C, zatímco oni jsou provádění, 4 00:00:17,440 --> 00:00:20,880 a také vám dává možnost vidět přesně to, co se stane 5 00:00:20,880 --> 00:00:22,490 když váš program havaruje. 6 00:00:22,490 --> 00:00:24,690 Je to docela šikovný, že jo? 7 00:00:24,690 --> 00:00:27,980 GDB je svobodný software, a to běží na mnoha populárních UNIX a 8 00:00:27,980 --> 00:00:31,840 Windows-založené operační systémy, takže je to velmi rozšířený nástroj. 9 00:00:31,840 --> 00:00:33,560 >> Měli byste se naučit milovat. 10 00:00:33,560 --> 00:00:36,800 Gdb profesionálové mají mnohem snazší vystopování chyby 11 00:00:36,800 --> 00:00:39,150 než ti, kteří protloukat pomocí odhady 12 00:00:39,150 --> 00:00:41,420 a nekonečné množství Tiskový výstup výkazů. 13 00:00:41,420 --> 00:00:45,810 GDB je nástroj příkazového řádku, což znamená, že můžete pracovat s ním v terminálu 14 00:00:45,810 --> 00:00:49,720 vydávání příkazů pomocí klávesnice namísto klepnutím na tlačítka myší. 15 00:00:49,720 --> 00:00:54,960 >> Chcete-li spustit GDB, budete doslova jen zadejte gdb na příkazovém řádku a stiskněte klávesu Enter. 16 00:00:54,960 --> 00:00:58,230 Uvidíte několik řádků tištěných na obrazovku 17 00:00:58,230 --> 00:01:00,810 zobrazující verzi GDB, který vedete, 18 00:01:00,810 --> 00:01:07,890 jeho informace o autorských právech, a na konci uvidíte GDB řádku: (gdb). 19 00:01:07,890 --> 00:01:10,770 To vám vědět, že GDB je připraven pro příkazy. 20 00:01:10,770 --> 00:01:15,400 V tomto bodě, je ukončete nejdůležitější věc, vědět, jak to udělat. 21 00:01:15,400 --> 00:01:17,790 Naštěstí, to je docela jednoduchý. 22 00:01:17,790 --> 00:01:19,840 Ukončete příkaz dělá jen to. 23 00:01:19,840 --> 00:01:23,090 Jako zástupce, stačí použít q příliš. 24 00:01:23,090 --> 00:01:27,410 Jak zábavné, jak bootování GDB a pak rychle přestat kouřit, je, 25 00:01:27,410 --> 00:01:30,800 pojďme se teď mluví o používání GDB pomoci ladění programu. 26 00:01:30,800 --> 00:01:34,630 >> Chcete-li začít, mám program tady v factorial.c 27 00:01:34,630 --> 00:01:37,380 že dostane int a snaží se vypočítat jeho faktoriál. 28 00:01:37,380 --> 00:01:41,270 V případě, že jste ho ještě neviděli faktoriály před nebo ne pamatovat si je, 29 00:01:41,270 --> 00:01:47,840 Faktoriál čísla n se rovná součinu n - (n - 1), (n - 2), a tak dále - 30 00:01:47,840 --> 00:01:49,230 dokud nenarazíte 1. 31 00:01:49,230 --> 00:01:54,550 Proto, faktoriál 3 je 3 * 2 * 1, nebo 6, 32 00:01:54,550 --> 00:02:00,180 a faktoriál 4 je 4 * 3 * 2 * 1, nebo 24. 33 00:02:00,180 --> 00:02:03,970 Faktoriál nuly je zvláštní případ, je to 1, 34 00:02:03,970 --> 00:02:06,970 a faktoriály záporných celých čísel nejsou definovány. 35 00:02:06,970 --> 00:02:10,280 Každopádně, něco o mém faktoriálu programu je funky. 36 00:02:10,280 --> 00:02:15,410 Když jsem jej spustit, vypíše divné čísla, která mají co do činění s faktoriály. 37 00:02:15,410 --> 00:02:19,030 >> Takže, můžeme použít GDB pomoci zjistit, co se děje. 38 00:02:19,030 --> 00:02:21,720 GDB pracuje na spustitelné soubory, 39 00:02:21,720 --> 00:02:24,910 které jsou binární soubory vytvořené v procesu kompilace. 40 00:02:24,910 --> 00:02:30,940 To znamená, že nemůžeme běžet GDB na našem. C nebo. H soubory zdrojových kódů jako factorial.c. 41 00:02:30,940 --> 00:02:34,650 Chceme spustit na právě faktoriál místo. 42 00:02:34,650 --> 00:02:38,340 Pokud program vyžaduje nějaké argumenty příkazového řádku, 43 00:02:38,340 --> 00:02:40,230 toto je místo, kde bychom upřesnit. 44 00:02:40,230 --> 00:02:44,050 V tomto případě, faktoriál nevyžaduje žádné argumenty příkazového řádku, 45 00:02:44,050 --> 00:02:46,410 takže jsme jen zadejte běh nebo r pro krátké. 46 00:02:46,410 --> 00:02:50,440 >> To začne faktoriálovou běhu programu. 47 00:02:50,440 --> 00:02:53,940 Když program zastaví, tak jsem si moje GDB vyzve zpět. 48 00:02:53,940 --> 00:02:58,130 Dobře, zkusme stejnou věc znovu, faktoriál 4. 49 00:02:58,130 --> 00:03:02,910 Dobře, vidíme, že jsme stále stejný druh nevyžádané tady v GDB. 50 00:03:02,910 --> 00:03:04,850 Nyní, když program dokončil, 51 00:03:04,850 --> 00:03:06,870 nemůžeme jít a přístup k některé z jeho stavu, 52 00:03:06,870 --> 00:03:09,870 takže budeme muset začít to běží znovu předtím, než můžeme vidět, co se děje. 53 00:03:09,870 --> 00:03:13,570 Nicméně, potřebujeme způsob, jak zastavit, dokud je to v polovině jeho běhu. 54 00:03:13,570 --> 00:03:16,970 >> K tomu, že jsme se použít to, co se nazývá zarážku. 55 00:03:16,970 --> 00:03:21,880 Hraniční hodnoty říct, GDB pozastavit program na určitou funkci nebo zdrojového kódu linka 56 00:03:21,880 --> 00:03:24,070 takže je můžeme zkoumat stav programu, 57 00:03:24,070 --> 00:03:27,380 hodnoty proměnných, stav paměti a podobně, v tomto bodě. 58 00:03:27,380 --> 00:03:30,750 Vzhledem k tomu, já opravdu nevím, kde se věci vyvíjejí špatně, 59 00:03:30,750 --> 00:03:33,510 >> Chci jen začít ladění přímo na samém začátku, 60 00:03:33,510 --> 00:03:36,510 pravdu, když hlavní začíná. 61 00:03:36,510 --> 00:03:39,260 Budeme nastavit zarážku na začátku hlavní pomocí přerušení příkazu. 62 00:03:39,260 --> 00:03:42,640 Můžeme také použít b zkrátit přestávku. 63 00:03:42,640 --> 00:03:45,000 Začněme program běží znovu. 64 00:03:45,000 --> 00:03:48,140 Tady jsme na začátku hlavní, stejně jako GDB nám říká. 65 00:03:48,140 --> 00:03:51,970 Řádek kódu, který se chystá vykonat, ale nemá dosud 66 00:03:51,970 --> 00:03:53,480 je printf line. 67 00:03:53,480 --> 00:03:57,200 Můžeme říct, GDB k provedení tento řádek kódu a přechod na další řádek 68 00:03:57,200 --> 00:03:59,840 s další nebo n příkazu. 69 00:03:59,840 --> 00:04:04,120 >> Dobře, teď GDB nám říká, že jsme na GetInt řádku. 70 00:04:04,120 --> 00:04:06,630 Vím, že to vypadá, jako printf linka nebyla spuštěna 71 00:04:06,630 --> 00:04:10,070 protože nevidíme "Zadejte kladné číslo" tisk z obrazovky, 72 00:04:10,070 --> 00:04:12,040 ale to vlastně běží. 73 00:04:12,040 --> 00:04:16,029 Co vidíme, je operační systém potlačení psaní cokoliv na obrazovce 74 00:04:16,029 --> 00:04:19,649 dokud to absolutně musí, což proč ladění s výtisky 75 00:04:19,649 --> 00:04:21,730 může někdy zdát nespolehlivé. 76 00:04:21,730 --> 00:04:26,240 Každopádně, pojďme opět přejít na další řádek kódu a zadejte v int. 77 00:04:26,240 --> 00:04:30,070 Opět, pojďme typ 4. 78 00:04:30,070 --> 00:04:34,540 Tak to vypadá divně. Jsme na řádku 12 podle GDB, 79 00:04:34,540 --> 00:04:37,660 ale další řádek, který se chystá vykonat, je jen složená závorka. 80 00:04:37,660 --> 00:04:42,110 >> To znamená, že jsme jen na konci smyčky, naše udělat, zatímco smyčka ve skutečnosti, 81 00:04:42,110 --> 00:04:46,710 a GDB nám říká, že ukončení podmínka, a sice nikdo menší než nula, 82 00:04:46,710 --> 00:04:48,010 provede další. 83 00:04:48,010 --> 00:04:50,230 Pokud se to někdy dostane trochu matoucí, 84 00:04:50,230 --> 00:04:54,860 můžeme vytáhnout zdrojový kód v GDB se seznamem nebo l příkaz. 85 00:04:54,860 --> 00:04:56,880 To vytiskne zdrojový kód 86 00:04:56,880 --> 00:04:59,010 , který je soustředěný kolem trati, že jsme v současné době na. 87 00:04:59,010 --> 00:05:03,590 Pokud napíšeme seznam nebo l znovu, uvidíme další sada řádků vytisknout. 88 00:05:03,590 --> 00:05:06,070 Můžeme to udělat, dokud jsme narazila na konec souboru. 89 00:05:06,070 --> 00:05:11,210 >> Chcete-li získat zpátky tam, kde jsme byli, jsme schopni dodat seznam s číslo řádku, 90 00:05:11,210 --> 00:05:14,120 v tomto případě, řádek 12. 91 00:05:14,120 --> 00:05:16,040 Každopádně, pojďme dál. 92 00:05:16,040 --> 00:05:18,240 Teď jsme na 4 smyčce. 93 00:05:18,240 --> 00:05:21,490 Pojďme se ujistěte, že naše proměnná num obsahuje 4. 94 00:05:21,490 --> 00:05:26,170 Děláme to s potiskem, nebo p, příkaz. 95 00:05:26,170 --> 00:05:31,140 Takže, GDB nám říká, že num je skutečně ukládání 4, jak jsme očekávali. 96 00:05:31,140 --> 00:05:35,180 $ 1, které GDB vytiskne je speciální proměnná GDB 97 00:05:35,180 --> 00:05:37,720 že je nyní nastavena k ukládání číslo 4 stejně. 98 00:05:37,720 --> 00:05:42,240 Můžete ignorovat to pro teď, ale tyto gdb proměnné přijít superpohodlná 99 00:05:42,240 --> 00:05:46,380 ve více pokročilých případech, kdy chcete vzpomenout, co jste dělali v minulosti. 100 00:05:46,380 --> 00:05:50,970 Každopádně, pohybující se na s další, vidíme, že se rozběhnou přes smyčky for. 101 00:05:50,970 --> 00:05:54,790 Pojďme dál tudy s n bitu po kousku. 102 00:05:54,790 --> 00:05:58,280 Spíše než psaní n pokaždé, můžete také jen stiskněte enter. 103 00:05:58,280 --> 00:06:03,710 Pokud stisknete klávesu Enter bez zadání cokoliv, GDB jen opakuje předchozí příkaz. 104 00:06:03,710 --> 00:06:05,910 Takže teď jsme hit printf hovor. 105 00:06:05,910 --> 00:06:09,520 Vypadá to, že jsme skutečně prošli naší pro smyčce 4 krát, 106 00:06:09,520 --> 00:06:13,750 který je co chceme udělat, aby se násobit 1, 2, 3, a 4. 107 00:06:13,750 --> 00:06:15,870 >> Všechno vypadá, že to funguje, 108 00:06:15,870 --> 00:06:19,680 kromě případů, kdy jsme narazili další jsme opět stáhni obrovské množství namísto 24. 109 00:06:19,680 --> 00:06:23,100 Pokud se vytisknout hodnotu faktoriálu pomocí p, 110 00:06:23,100 --> 00:06:26,120 vidíme, že faktoriál nemá tuto masivní množství v něm. 111 00:06:26,120 --> 00:06:28,740 Něco to určitě špatně. 112 00:06:28,740 --> 00:06:31,960 V tomto bodě, i když, jsme téměř na konci programu, 113 00:06:31,960 --> 00:06:34,610 a to je příliš pozdě na to, opravit cokoliv. 114 00:06:34,610 --> 00:06:39,750 >> Nicméně, my můžeme restartovat program zadáním r znovu a pak y potvrďte. 115 00:06:39,750 --> 00:06:43,460 Teď jsme zpátky v našem zarážky na začátku main. 116 00:06:43,460 --> 00:06:46,600 Víme, že se vše zdá být v pořádku s čtení v n. 117 00:06:46,600 --> 00:06:48,630 takže můžeme přeskočit s n. 118 00:06:48,630 --> 00:06:52,280 Případně můžeme nastavit nový zarážku po dělat, když smyčka 119 00:06:52,280 --> 00:06:54,910 a skákat tam. Pojďme udělat. 120 00:06:54,910 --> 00:06:59,080 Vypadá to, že linka 14 přichází právě po smyčce. 121 00:06:59,080 --> 00:07:01,070 Pojďme nastavit zarážku tam. 122 00:07:01,070 --> 00:07:05,220 Je dobrým zvykem zadat název souboru v tomto breakpointů příkazu 123 00:07:05,220 --> 00:07:08,480 protože GDB lze zmást, pokud pracujete s více soubory. 124 00:07:08,480 --> 00:07:13,230 Chcete-li přesunout před tímto zarážka, budeme používat Pokračovat nebo c příkaz. 125 00:07:13,230 --> 00:07:16,570 >> Dobře, tady jsme pro smyčce. 126 00:07:16,570 --> 00:07:19,060 Pojďme 1 další linku do smyčky for, 127 00:07:19,060 --> 00:07:21,630 a pak začneme s tiskem proměnných vidět, co se děje. 128 00:07:21,630 --> 00:07:26,410 Pojďme se ujistěte, že i je skutečně 1, jak se očekávalo. 129 00:07:26,410 --> 00:07:28,300 Jo, to je všechno dobré. 130 00:07:28,300 --> 00:07:30,270 Co faktoriál když? 131 00:07:30,270 --> 00:07:33,760 Whoa, to není dobré. 132 00:07:33,760 --> 00:07:35,800 Máme velký záporné číslo zde. 133 00:07:35,800 --> 00:07:38,190 Jak se to stalo? 134 00:07:38,190 --> 00:07:40,040 No, podíváme-li se zpět na kód, 135 00:07:40,040 --> 00:07:44,800 vidíme, že nikdy inicializován, takže jsme právě dostali odpadky tam. 136 00:07:44,800 --> 00:07:46,820 To bude určitě shodit náš výpočet. 137 00:07:46,820 --> 00:07:49,930 >> Naštěstí, nemáme nechat GDB to opravit. 138 00:07:49,930 --> 00:07:54,590 Můžeme ji inicializovat přímo zde a opravit v kódu později pomocí příkazu tisku. 139 00:07:54,590 --> 00:07:59,500 Budeme ji inicializovat na 1, protože faktoriály nule a 1, tak 1, 140 00:07:59,500 --> 00:08:03,940 a pokud budeme inicializovat na nulu, pak jsme vždycky skončit s nulou jako náš výsledek. 141 00:08:03,940 --> 00:08:08,370 Můžete nastavit libovolnou proměnnou tuto cestu, která je super šikovný. 142 00:08:08,370 --> 00:08:10,920 Nyní, pojďme pokračovat náš program. 143 00:08:10,920 --> 00:08:14,040 Pojďme ujistit, že všechno je místo, kde to má být. 144 00:08:14,040 --> 00:08:19,090 Num by měl být 4, by i být 1, a faktoriálu má být 1 příliš. 145 00:08:19,090 --> 00:08:23,990 Můžeme zkratku tento proces a tisk všech našich lokálních proměnných 146 00:08:23,990 --> 00:08:26,440 s super-užitečné místních příkaz info, 147 00:08:26,440 --> 00:08:29,190 který vytiskne všechny naše in-působnosti lokálních proměnných. 148 00:08:29,190 --> 00:08:31,980 Každopádně to vypadá, že všechno, co je dobré jít. 149 00:08:31,980 --> 00:08:34,700 >> Pojďme udělat další průlet na smyčku, aby se ujistil. 150 00:08:34,700 --> 00:08:38,789 Dobře, všechno vypadá skvěle. 151 00:08:38,789 --> 00:08:41,659 Nyní můžeme použít continue příkaz jít až do konce. 152 00:08:41,659 --> 00:08:46,170 Sweet! 4 faktoriál vytisknout 24, jak se očekávalo. 153 00:08:46,170 --> 00:08:48,690 Teď můžeme jít opravit v našem kódu. 154 00:08:48,690 --> 00:08:53,710 Spíše než opustit z GDB, budeme používat jiný terminál kartu k tomu. 155 00:08:53,710 --> 00:08:58,080 Vraťme se zpět k našemu GDB kartu, nyní musíme překompilovat náš spustitelný soubor. 156 00:08:58,080 --> 00:09:03,180 Jedna z nejlepších věcí, o GDB je, že nemusíte opustit GDB spustit dělat. 157 00:09:03,180 --> 00:09:06,570 Takže nemáme držet bít staré zarážky, 158 00:09:06,570 --> 00:09:10,440 pojďme zakázat s, uhodli jste, příkaz disable. 159 00:09:10,440 --> 00:09:13,320 Tímto zakážete všechny naše zarážky. 160 00:09:13,320 --> 00:09:18,180 Nyní můžeme restartovat program s r a ujistěte se, že všechno je v pořádku. 161 00:09:18,180 --> 00:09:21,300 Vypadá to, že všechno, co je dobré jít. 162 00:09:21,300 --> 00:09:24,410 Faktoriál 4 tisků z 24, stejně jako jsme si mysleli. 163 00:09:24,410 --> 00:09:28,830 GDB je jedním z nejvíce užitečných nástrojů, které jste dostali v panelu nástrojů. 164 00:09:28,830 --> 00:09:31,970 >> Existují tuny dalších věcí, které můžete udělat s GDB, 165 00:09:31,970 --> 00:09:34,030 mnohem víc, než se dá dělat s jednoduchými výtisků. 166 00:09:34,030 --> 00:09:36,730 Příště váš program není to, co byste chtěli, 167 00:09:36,730 --> 00:09:39,740 zkuste GDB, aby zjistili, co se děje uvnitř. 168 00:09:39,740 --> 00:09:44,380 S trochou praxe, budete moci přecházet přímo na vaše chyba v žádném okamžiku. 169 00:09:44,380 --> 00:09:48,180 Mé jméno je Nate Hardison. To je CS50.