1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, el Projecte GNU Debugger, és una potent eina de depuració per a C, 2 00:00:12,630 --> 00:00:14,300 juntament amb molts altres idiomes. 3 00:00:14,300 --> 00:00:17,440 Que li permet furgar dins dels seus programes en C mentre estan executant, 4 00:00:17,440 --> 00:00:20,880 i també li dóna l'oportunitat de veure exactament el que succeeix 5 00:00:20,880 --> 00:00:22,490 quan es bloqueja el programa. 6 00:00:22,490 --> 00:00:24,690 És molt enginyós, no? 7 00:00:24,690 --> 00:00:27,980 GDB és programari lliure, i s'executa en els models més usuals UNIX i 8 00:00:27,980 --> 00:00:31,840 Basats en Windows sistemes operatius, de manera que és una eina molt estesa. 9 00:00:31,840 --> 00:00:33,560 >> Vostè ha d'aprendre a estimar-la. 10 00:00:33,560 --> 00:00:36,800 Pros GDB tindrà un temps molt més fàcil rastrejar errors 11 00:00:36,800 --> 00:00:39,150 que els de sortir del pas amb conjectures 12 00:00:39,150 --> 00:00:41,420 i una quantitat infinita d'enunciats impressions. 13 00:00:41,420 --> 00:00:45,810 GDB és una eina de línia de comandes, el que significa que pot interactuar amb ell en una terminal 14 00:00:45,810 --> 00:00:49,720 donant ordres a través del teclat en lloc de botons fent clic amb el ratolí. 15 00:00:49,720 --> 00:00:54,960 >> Per iniciar GDB, que, literalment, només gdb escriu a l'indicador i premeu Enter. 16 00:00:54,960 --> 00:00:58,230 Veuràs unes línies impreses a la pantalla 17 00:00:58,230 --> 00:01:00,810 mostrant la versió del BGF que s'està executant, 18 00:01:00,810 --> 00:01:07,890 seva informació de drets d'autor, i al final veurà l'indicador GDB: (gdb). 19 00:01:07,890 --> 00:01:10,770 Això li permet saber que el BGF està llest per als comandaments. 20 00:01:10,770 --> 00:01:15,400 En aquest punt, la cosa més important que saber fer és deixar de fumar. 21 00:01:15,400 --> 00:01:17,790 Afortunadament, això és bastant simple. 22 00:01:17,790 --> 00:01:19,840 La comanda quit fa precisament això. 23 00:01:19,840 --> 00:01:23,090 Com a mètode abreujat, pot simplement usar q també. 24 00:01:23,090 --> 00:01:27,410 Tan divertit com arrencar el BGF i ​​després deixar de fumar immediatament és, 25 00:01:27,410 --> 00:01:30,800 Parlem ara una mica sobre l'ús de GDB per ajudar a depurar un programa. 26 00:01:30,800 --> 00:01:34,630 >> Per començar, tinc un programa aquí a factorial.c 27 00:01:34,630 --> 00:01:37,380 que rep un enter i tracta de calcular el factorial. 28 00:01:37,380 --> 00:01:41,270 En cas que vostè no ha vist abans factorials o no els recordo, 29 00:01:41,270 --> 00:01:47,840 El factorial del nombre n és igual al producte de n - (n - 1), (n - 2), i així successivament - 30 00:01:47,840 --> 00:01:49,230 fins arribar a 1. 31 00:01:49,230 --> 00:01:54,550 Per tant, el factorial de 3 és 3 * 2 * 1, o 6, 32 00:01:54,550 --> 00:02:00,180 i el factorial de 4 és 4 * 3 * 2 * 1, o 24. 33 00:02:00,180 --> 00:02:03,970 El factorial de zero és un cas estrany, és 1, 34 00:02:03,970 --> 00:02:06,970 i els factorials dels nombres enters negatius no estan definides. 35 00:02:06,970 --> 00:02:10,280 De tota manera, hi ha alguna cosa en el meu programa factorial és funky. 36 00:02:10,280 --> 00:02:15,410 Quan ho executo, imprimeix nombres estranys que no tenen res a veure amb els factorials. 37 00:02:15,410 --> 00:02:19,030 >> Per tant, podem usar GDB per ajudar a entendre el que està passant. 38 00:02:19,030 --> 00:02:21,720 GDB opera en arxius executables, 39 00:02:21,720 --> 00:02:24,910 que són els arxius binaris produïts pel procés de compilació. 40 00:02:24,910 --> 00:02:30,940 És a dir, no es pot executar en el nostre GDB. Co H fitxers de codi font com factorial.c. 41 00:02:30,940 --> 00:02:34,650 Volem que s'executi en un sol lloc factorial. 42 00:02:34,650 --> 00:02:38,340 Si el programa requereix cap argument de línia d'ordres, 43 00:02:38,340 --> 00:02:40,230 aquí és on ens agradaria donar més detalls. 44 00:02:40,230 --> 00:02:44,050 En aquest cas, factorial no requereix cap argument de línia d'ordres, 45 00:02:44,050 --> 00:02:46,410 així que només has de escriure d'execució o r per abreujar. 46 00:02:46,410 --> 00:02:50,440 >> Això iniciarà el programa executant factorial. 47 00:02:50,440 --> 00:02:53,940 Quan el programa deixa de funcionar, em posaré el meu GDB demanarà de nou. 48 00:02:53,940 --> 00:02:58,130 Bé, intentarem fer el mateix una altra vegada, factorial de 4. 49 00:02:58,130 --> 00:03:02,910 Molt bé, veiem que estem rebent el mateix tipus d'escombraries aquí a GDB. 50 00:03:02,910 --> 00:03:04,850 Ara que el programa ha acabat, 51 00:03:04,850 --> 00:03:06,870 no podem entrar i accedir al seu estat, 52 00:03:06,870 --> 00:03:09,870 per la qual cosa haurem de començar a funcionar una altra vegada abans de poder veure el que està succeint. 53 00:03:09,870 --> 00:03:13,570 No obstant això, necessitem una manera de detenir mentre està a la meitat de la seva carrera. 54 00:03:13,570 --> 00:03:16,970 >> Per això, s'utilitza el que s'anomena un punt d'interrupció. 55 00:03:16,970 --> 00:03:21,880 Punts d'interrupció dir GDB per aturar el programa en una determinada funció o línia de codi font 56 00:03:21,880 --> 00:03:24,070 de manera que es pot examinar l'estat del programa, 57 00:03:24,070 --> 00:03:27,380 els valors de les variables, l'estat de la memòria i tal, en aquest punt. 58 00:03:27,380 --> 00:03:30,750 Com que no se sap molt bé on van les coses malament, 59 00:03:30,750 --> 00:03:33,510 >> Només vull començar a depurar la dreta en el començament, 60 00:03:33,510 --> 00:03:36,510 just quan comença principal. 61 00:03:36,510 --> 00:03:39,260 Anem a establir un punt d'interrupció al principi del principal mitjançant la comanda break. 62 00:03:39,260 --> 00:03:42,640 També es pot utilitzar per abreujar b break. 63 00:03:42,640 --> 00:03:45,000 Ara anem a llançar el programa torni a funcionar. 64 00:03:45,000 --> 00:03:48,140 Aquí estem en el començament de la principal, igual que el BGF ens diu. 65 00:03:48,140 --> 00:03:51,970 La línia de codi que està a punt d'executar, però encara no ha 66 00:03:51,970 --> 00:03:53,480 és la línia printf. 67 00:03:53,480 --> 00:03:57,200 Podem dir GDB per executar aquesta línia de codi i anar a la següent línia 68 00:03:57,200 --> 00:03:59,840 amb la següent comanda o núm. 69 00:03:59,840 --> 00:04:04,120 >> Molt bé, ara GDB ens diu que estem en la línia de getInt. 70 00:04:04,120 --> 00:04:06,630 Sé que sembla que la línia printf no s'ha executat 71 00:04:06,630 --> 00:04:10,070 ja que no es veu "Introduïu un nombre enter positiu" lletra a la pantalla, 72 00:04:10,070 --> 00:04:12,040 però s'ha executat realment. 73 00:04:12,040 --> 00:04:16,029 El que estem veient és el sistema operatiu suprimir qualsevol cosa per escrit a la pantalla 74 00:04:16,029 --> 00:04:19,649 fins que absolutament ha de fer, que per què la depuració amb impressions 75 00:04:19,649 --> 00:04:21,730 de vegades pot semblar poc fiable. 76 00:04:21,730 --> 00:04:26,240 De tota manera, anirem de nou a la següent línia de codi i entrar en un int. 77 00:04:26,240 --> 00:04:30,070 Un cop més, anem a tipus 4. 78 00:04:30,070 --> 00:04:34,540 Així que això sembla estrany. Estem en la línia 12 d'acord amb GDB, 79 00:04:34,540 --> 00:04:37,660 però la següent línia que està a punt d'executar és només una clau de tancament. 80 00:04:37,660 --> 00:04:42,110 >> Això només significa que estem al final d'un cicle, el nostre cicle do while, de fet, 81 00:04:42,110 --> 00:04:46,710 GDB i ens està dient que la condició de terminació, és a dir, ni més ni menys que zero, 82 00:04:46,710 --> 00:04:48,010 executarà a continuació. 83 00:04:48,010 --> 00:04:50,230 Si alguna vegada es posa una mica confús, 84 00:04:50,230 --> 00:04:54,860 podem treure el codi font en GDB amb la llista d'ordres o l. 85 00:04:54,860 --> 00:04:56,880 Això imprimeix el codi font 86 00:04:56,880 --> 00:04:59,010 que està centrat al voltant de la línia que estem actualment. 87 00:04:59,010 --> 00:05:03,590 Si teclegem llista o l altra vegada, anem a veure el següent conjunt de línies d'impressió. 88 00:05:03,590 --> 00:05:06,070 Podem fer això fins que arribem al final de l'arxiu. 89 00:05:06,070 --> 00:05:11,210 >> Per tornar a on estàvem, podem subministrar llista amb un nombre de línia, 90 00:05:11,210 --> 00:05:14,120 en aquest cas, la línia 12. 91 00:05:14,120 --> 00:05:16,040 De tota manera, seguirem endavant. 92 00:05:16,040 --> 00:05:18,240 Ara que estem en el bucle 4. 93 00:05:18,240 --> 00:05:21,490 Anem a fer de la nostra variable num conté 4. 94 00:05:21,490 --> 00:05:26,170 Fem això amb la impressió, op, comanda. 95 00:05:26,170 --> 00:05:31,140 Per tant, el BGF ens diu quin número és, en efecte emmagatzemar 4, tal com esperàvem. 96 00:05:31,140 --> 00:05:35,180 Els $ 1 que imprimeix GDB és una variable GDB especial 97 00:05:35,180 --> 00:05:37,720 que ja està configurat per emmagatzemar el número 4 també. 98 00:05:37,720 --> 00:05:42,240 Pot passar per alt aquesta per ara, però aquestes variables GDB vénen en súper pràctic 99 00:05:42,240 --> 00:05:46,380 en casos més avançats quan es desitja recordar el que has fet en el passat. 100 00:05:46,380 --> 00:05:50,970 De tota manera, seguir endavant amb el següent, veiem que comencem a anar a través del bucle for. 101 00:05:50,970 --> 00:05:54,790 Seguim per aquí amb n bits a poc. 102 00:05:54,790 --> 00:05:58,280 En lloc d'escriure n cada vegada, també pot simplement prem enter. 103 00:05:58,280 --> 00:06:03,710 Quan es prem enter sense escriure res, el BGF només repeteix la comanda anterior. 104 00:06:03,710 --> 00:06:05,910 Així que ara ens hem topat amb l'anomenada printf. 105 00:06:05,910 --> 00:06:09,520 Sembla que hem fet passat pel nostre bucle for 4 vegades, 106 00:06:09,520 --> 00:06:13,750 que és el que volem fer per tal de multiplicar per 1, 2, 3, i 4. 107 00:06:13,750 --> 00:06:15,870 >> Tot sembla que està funcionant, 108 00:06:15,870 --> 00:06:19,680 excepte quan colpegem propera vegada tenim aquesta enorme quantitat en lloc de 24. 109 00:06:19,680 --> 00:06:23,100 Si s'imprimeix el valor de p factorial utilitzant, 110 00:06:23,100 --> 00:06:26,120 veiem que factorial té aquest nombre massiu-hi. 111 00:06:26,120 --> 00:06:28,740 Alguna cosa definitivament va malament. 112 00:06:28,740 --> 00:06:31,960 En aquest punt, però, que són gairebé al final del programa, 113 00:06:31,960 --> 00:06:34,610 i és massa tard per arreglar qualsevol cosa. 114 00:06:34,610 --> 00:06:39,750 >> No obstant això, es pot reiniciar el programa escrivint r altra vegada i després i per confirmar. 115 00:06:39,750 --> 00:06:43,460 Ara estem de tornada al nostre punt d'interrupció al principi del principal. 116 00:06:43,460 --> 00:06:46,600 Sabem que tot sembla estar bé amb la lectura en el núm. 117 00:06:46,600 --> 00:06:48,630 perquè puguem anar per davant amb n. 118 00:06:48,630 --> 00:06:52,280 Alternativament, pot establir un nou punt d'interrupció després que el cicle do while 119 00:06:52,280 --> 00:06:54,910 i salta allà. Farem això. 120 00:06:54,910 --> 00:06:59,080 Sembla que la línia 14 arriba just després del bucle. 121 00:06:59,080 --> 00:07:01,070 Anem a posar un breakpoint allà. 122 00:07:01,070 --> 00:07:05,220 És una bona pràctica per especificar el nom del fitxer en la comanda breakpoint 123 00:07:05,220 --> 00:07:08,480 des GDB pot confondre si està treballant amb diversos arxius. 124 00:07:08,480 --> 00:07:13,230 Per moure per davant d'aquest punt d'interrupció, usarem la comanda continuï o c. 125 00:07:13,230 --> 00:07:16,570 >> Bé, aquí estem en el bucle for. 126 00:07:16,570 --> 00:07:19,060 Anem a anar en la línia 1 més el bucle for, 127 00:07:19,060 --> 00:07:21,630 i llavors començarem variables d'impressió per veure què està passant. 128 00:07:21,630 --> 00:07:26,410 Anem a fer de i és en realitat 1, com s'esperava. 129 00:07:26,410 --> 00:07:28,300 Sí, això és tot bo. 130 00:07:28,300 --> 00:07:30,270 I factorial però? 131 00:07:30,270 --> 00:07:33,760 Vaja, això no és bo. 132 00:07:33,760 --> 00:07:35,800 Tenim un nombre negatiu gran aquí. 133 00:07:35,800 --> 00:07:38,190 Com va passar això? 134 00:07:38,190 --> 00:07:40,040 Bé, si mirem cap enrere en el codi, 135 00:07:40,040 --> 00:07:44,800 es veu que mai ho inicialitzat, així que només tinc escombraries en aquest país. 136 00:07:44,800 --> 00:07:46,820 Això definitivament desfer del nostre càlcul. 137 00:07:46,820 --> 00:07:49,930 >> Afortunadament, no hem de deixar GDB per solucionar aquest problema. 138 00:07:49,930 --> 00:07:54,590 Podem inicialitzar la dreta i fixar-la en el codi més endavant mitjançant la comanda d'impressió. 139 00:07:54,590 --> 00:07:59,500 Anem a inicialitzar a 1, ja que els factorials de zero i 1 són dos 1, 140 00:07:59,500 --> 00:08:03,940 i si ho inicialitza a zero, llavors sempre acabaria amb el zero com el nostre resultat. 141 00:08:03,940 --> 00:08:08,370 Pot establir qualsevol variable d'aquesta manera, que és súper pràctic. 142 00:08:08,370 --> 00:08:10,920 Ara, continuarem amb el nostre programa. 143 00:08:10,920 --> 00:08:14,040 Anem a fer de tot està on ha d'estar. 144 00:08:14,040 --> 00:08:19,090 Num ha de ser de 4, que hauria de ser 1, i factorial ha de ser 1 també. 145 00:08:19,090 --> 00:08:23,990 Podem abreujar aquest procés i imprimir totes les nostres variables locals 146 00:08:23,990 --> 00:08:26,440 amb els vilatans informació super-útil de comandament, 147 00:08:26,440 --> 00:08:29,190 que imprimeix tots els nostres considerades en l'estudi les variables locals. 148 00:08:29,190 --> 00:08:31,980 De tota manera, sembla que tot està a punt per sortir. 149 00:08:31,980 --> 00:08:34,700 >> Anem a fer un altre go-around del bucle per curar-se. 150 00:08:34,700 --> 00:08:38,789 Bé, tot es veu molt bé. 151 00:08:38,789 --> 00:08:41,659 Ara podem usar la comanda Continuar per passar a la final. 152 00:08:41,659 --> 00:08:46,170 Sweet! 4 factorial imprimir 24 com s'esperava. 153 00:08:46,170 --> 00:08:48,690 Ara podem arreglar això en el nostre codi. 154 00:08:48,690 --> 00:08:53,710 En lloc de deixar fora de GDB, utilitzarem una altra fitxa terminal per fer això. 155 00:08:53,710 --> 00:08:58,080 Tornant al nostre compte GDB, ara hem de tornar a compilar el nostre executable. 156 00:08:58,080 --> 00:09:03,180 Una de les millors coses de GDB és que vostè no necessita sortir de GDB a executar make. 157 00:09:03,180 --> 00:09:06,570 Així que no deixen de colpejar els punts de tall d'edat, 158 00:09:06,570 --> 00:09:10,440 anem a desactivar amb ell, l'has endevinat, desactivar comandes. 159 00:09:10,440 --> 00:09:13,320 Això desactivarà tots els nostres punts d'interrupció. 160 00:09:13,320 --> 00:09:18,180 Ara, podem reiniciar el programa amb r i assegurar-se que tot està bé. 161 00:09:18,180 --> 00:09:21,300 Sembla que tot està a punt per sortir. 162 00:09:21,300 --> 00:09:24,410 Factorial de 4 imprimeix 24, igual que el que pensàvem. 163 00:09:24,410 --> 00:09:28,830 GDB és una de les eines més útils que tens al caixa d'eines. 164 00:09:28,830 --> 00:09:31,970 >> Hi ha coses que una tona més que pots fer amb GDB, 165 00:09:31,970 --> 00:09:34,030 molt més del que pots fer amb les impressions simples. 166 00:09:34,030 --> 00:09:36,730 La propera vegada que el seu programa no és fer el que volgués, 167 00:09:36,730 --> 00:09:39,740 proveu d'executar GDB per esbrinar el que està passant dins. 168 00:09:39,740 --> 00:09:44,380 Amb una mica de pràctica, vostè serà capaç d'aprofundir en el teu error en cap moment. 169 00:09:44,380 --> 00:09:48,180 El meu nom és Nate Hardison. Això és CS50.