1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DONEN ARMADARAS :?] Hola, Estic [? Donen Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Avui, anem a es busca en la depuració. 4 00:00:04,410 --> 00:00:06,697 No només anem a parlar d'algunes tècniques, 5 00:00:06,697 --> 00:00:09,280 sinó que també anem a mirar algunes de les característiques contingudes 6 00:00:09,280 --> 00:00:14,170 dins de l'IDE CS50 que permeten depurar fàcilment un programa. 7 00:00:14,170 --> 00:00:16,272 >> Només un exemple de cosa que pot sortir malament 8 00:00:16,272 --> 00:00:18,730 i de fet és una cosa que ja hem vist abans. 9 00:00:18,730 --> 00:00:23,200 En aquest cas, aquest és un programa C que accepta un nombre enter d'usuari, 10 00:00:23,200 --> 00:00:27,580 el divideix per dos, i proporciona la sortida de nou a l'usuari. 11 00:00:27,580 --> 00:00:30,610 Ara del que hem vist anteriorment en conferències, 12 00:00:30,610 --> 00:00:34,370 sabem que això causarà tipus específics de problemes de divisió 13 00:00:34,370 --> 00:00:35,860 quan tenim números imparells. 14 00:00:35,860 --> 00:00:40,330 >> En concret, només haurem que llencem res després de la coma decimal. 15 00:00:40,330 --> 00:00:43,170 Ara, sabem que aquest passa a ser el cas. 16 00:00:43,170 --> 00:00:47,430 I si correm, podem confirmar les nostres sospites, primer, per la compilació. 17 00:00:47,430 --> 00:00:50,460 I després, corrent i entrar en un nombre imparell. 18 00:00:50,460 --> 00:00:51,720 >> Això no és res de nou. 19 00:00:51,720 --> 00:00:54,490 Però això és en realitat un exemple d'un error que 20 00:00:54,490 --> 00:00:58,810 pot existir dins d'un programa més ampli que es converteix en més difícil de rastrejar. 21 00:00:58,810 --> 00:01:02,640 Tot i que sabem quin és el problema és a dir, el veritable quid de la qüestió 22 00:01:02,640 --> 00:01:06,250 podria tractar d'identificar específicament on es produeix l'error, 23 00:01:06,250 --> 00:01:09,750 identificar el que aquest problema és, i després arreglar-ho. 24 00:01:09,750 --> 00:01:14,400 Així que oferir això com un exemple del que podria ser alguna cosa 25 00:01:14,400 --> 00:01:19,030 que ja sabem, però pot ser enterrat dins d'altres elements del codi. 26 00:01:19,030 --> 00:01:23,090 >> Per tant l'obertura d'aquesta altra font arxiu de codi com un exemple, 27 00:01:23,090 --> 00:01:27,165 aquest problema de divisió és ara part d'un programa més ampli. 28 00:01:27,165 --> 00:01:29,040 Encara podria ser una mica poc artificial, i nosaltres 29 00:01:29,040 --> 00:01:31,076 podria ser capaç de facilitat identificar-lo, especialment 30 00:01:31,076 --> 00:01:32,450 ja que només estem discutint això. 31 00:01:32,450 --> 00:01:38,250 Però podem imaginar que aquesta problema pot existir en una escala més gran. 32 00:01:38,250 --> 00:01:45,450 >> Si Va compilar això i ara executar, introduïu un nombre imparell, 33 00:01:45,450 --> 00:01:49,816 podem veure que no obtenim precisament la sortida que podem haver esperat. 34 00:01:49,816 --> 00:01:51,690 En aquest cas particular, podríem dir que ens 35 00:01:51,690 --> 00:01:56,060 volen comptar tots els números des d'un fins algun número específic. 36 00:01:56,060 --> 00:01:58,130 I podem veure que tenir una varietat de temes 37 00:01:58,130 --> 00:02:03,880 aquí si estem sortida, simplement, 0 i 1 quan proporcionem una entrada de 5. 38 00:02:03,880 --> 00:02:07,380 >> Així que ja sabem que hi ha un problema aquí. 39 00:02:07,380 --> 00:02:11,662 Però no podem saber amb precisió on aquest problema realment existeix. 40 00:02:11,662 --> 00:02:13,620 Ara una de les formes en què podem tractar de fer això 41 00:02:13,620 --> 00:02:15,745 és una cosa que hem ja s'ha introduït a. 42 00:02:15,745 --> 00:02:18,880 Només podem usar-lo en una escala més gran. 43 00:02:18,880 --> 00:02:21,680 >> En la línia 14, que tenim aquesta funció printf, 44 00:02:21,680 --> 00:02:25,620 el que ens permet imprimir l'estat de diverses peces d'informació. 45 00:02:25,620 --> 00:02:28,880 I això és una cosa que vostè ha d'aprofitar dins del seu programa 46 00:02:28,880 --> 00:02:33,100 per intentar esbrinar exactament el que és succeint en diverses línies de codi. 47 00:02:33,100 --> 00:02:36,350 Així que fins i tot si aquest no és el sortida final que en realitat 48 00:02:36,350 --> 00:02:39,830 voler produir de aquest programa, encara 49 00:02:39,830 --> 00:02:42,300 podrien tenir certa depuració declaracions on ens 50 00:02:42,300 --> 00:02:46,970 pot tractar d'esbrinar exactament el que està succeint dins del nostre codi. 51 00:02:46,970 --> 00:02:51,210 >> Així que en aquest cas, ho faré printf amb l'etiqueta de depuració. 52 00:02:51,210 --> 00:02:53,540 En aquest cas, això és només una cadena de depuració 53 00:02:53,540 --> 00:02:56,840 que estic fins desagradable perquè es converteixi molt clar en la sortida de la meva codi 54 00:02:56,840 --> 00:02:59,200 què és el que vull mostrar. 55 00:02:59,200 --> 00:03:04,410 I aquí el nombre de sortida que hem calculat. 56 00:03:04,410 --> 00:03:06,800 >> En aquest cas, podria digui de forma precisa 57 00:03:06,800 --> 00:03:11,380 el que està passant abans i després d'un càlcul específic. 58 00:03:11,380 --> 00:03:16,224 Així que jo podria utilitzar un printf abans i després d'aquesta línia de codi. 59 00:03:16,224 --> 00:03:18,640 En aquest cas, podria fins i tot que sigui una mica més clara 60 00:03:18,640 --> 00:03:21,960 dient depuració abans i depuració després de tant 61 00:03:21,960 --> 00:03:26,540 que jo no confonc a mi mateix amb múltiples línies que semblen idèntics. 62 00:03:26,540 --> 00:03:32,290 >> Ara bé, si a compilar i executar aquest ella, entrar un nombre com de cinc més, 63 00:03:32,290 --> 00:03:35,090 podem veure que tenim ara de sortida abans i després de 64 00:03:35,090 --> 00:03:40,670 i trobem que no hem fet una clara divisió o transparent que té el nombre 65 00:03:40,670 --> 00:03:43,680 que en realitat volem fer. 66 00:03:43,680 --> 00:03:48,660 Ara bé, en aquest cas, es tracta de no és realment una sortida clara. 67 00:03:48,660 --> 00:03:52,440 En realitat no és un resultat clar que volem sortir d'aquest programa en particular. 68 00:03:52,440 --> 00:03:54,427 >> I això és, de nou, un poc artificial. 69 00:03:54,427 --> 00:03:57,510 Però, potser, una de les coses que que podríem fer si l'especificació dir 70 00:03:57,510 --> 00:04:01,900 que volem dividir això 2 i afegir 1-- pel que en altres paraules, 71 00:04:01,900 --> 00:04:04,550 volem arrodonir up-- continuació podríem saber que vam poder 72 00:04:04,550 --> 00:04:08,060 fer aquesta cosa en particular, en aquest cas. 73 00:04:08,060 --> 00:04:14,010 Ara, aquí sabem que serem capaç de sumar 1 al nostre número reduït a la meitat. 74 00:04:14,010 --> 00:04:16,490 >> Anem a recompilar aquest i confirmar que aquesta 75 00:04:16,490 --> 00:04:18,860 es comporta de la manera que volem. 76 00:04:18,860 --> 00:04:21,980 Podem veure que ara abans que tenir, tenim el número 5. 77 00:04:21,980 --> 00:04:26,620 Després de tenir, tenim el número 3, que d'acord amb la nostra especificació, 78 00:04:26,620 --> 00:04:29,292 és el que volíem fer. 79 00:04:29,292 --> 00:04:31,000 Però si ens fixem en el sortida d'aquí, podem 80 00:04:31,000 --> 00:04:33,760 veure que podríem tenir una altra error per complet, que és 81 00:04:33,760 --> 00:04:36,940 que estem començant nostre compte des de 0. 82 00:04:36,940 --> 00:04:39,390 >> Ara, de nou, això és una cosa que hem vist en el passat 83 00:04:39,390 --> 00:04:42,500 i podem fixar amb força facilitat. 84 00:04:42,500 --> 00:04:44,790 Però en aquest cas, També tenia l'avantatge 85 00:04:44,790 --> 00:04:48,940 d'utilitzar la instrucció printf directament a l'interior del bucle for 86 00:04:48,940 --> 00:04:52,930 saber amb precisió on que l'error estava passant. 87 00:04:52,930 --> 00:04:55,150 Declaracions Així printf són molt útil per ajudar 88 00:04:55,150 --> 00:04:57,940 a determinar on, precisament en el seu codi font, 89 00:04:57,940 --> 00:05:00,620 s'està produint un error específic. 90 00:05:00,620 --> 00:05:03,650 >> I també és important tenir en compte que, com estem programant, 91 00:05:03,650 --> 00:05:06,052 podríem tenir supòsits sobre l'estat d'un programa. 92 00:05:06,052 --> 00:05:08,510 O pot ser que tinguem supòsits sobre quina part del programa 93 00:05:08,510 --> 00:05:13,020 és realment correcte o incorrecte quan més endavant a mesura que construïm en aquest programa 94 00:05:13,020 --> 00:05:15,950 i que sigui part d'un complex i més gran programa 95 00:05:15,950 --> 00:05:19,700 que ens adonem que algun aspecte que és en realitat buggy. 96 00:05:19,700 --> 00:05:22,680 >> L'ús de printf realment pot ajudar delimitar i identificar 97 00:05:22,680 --> 00:05:26,430 les regions d'un programa que no pot es comporta exactament de la manera que nosaltres 98 00:05:26,430 --> 00:05:29,500 esperar que, amb base en les nostres suposicions. 99 00:05:29,500 --> 00:05:31,460 Però hi ha altres eines disponibles, així, 100 00:05:31,460 --> 00:05:34,860 que ens permeten tractar d'entendre on s'està produint un error 101 00:05:34,860 --> 00:05:39,930 i també, específicament, quines coses estan succeint dins del programa. 102 00:05:39,930 --> 00:05:41,990 >> Així que fent servir printf és molt quan volem útil 103 00:05:41,990 --> 00:05:45,900 per identificar les àrees específiques de un programa que té alguns errors. 104 00:05:45,900 --> 00:05:47,730 Però també es converteix avorrit després d'un temps. 105 00:05:47,730 --> 00:05:50,500 En aquest cas, es tracta d'una programa relativament simple 106 00:05:50,500 --> 00:05:52,750 amb només una o dues variables. 107 00:05:52,750 --> 00:05:57,260 I es fa molt fàcil per a nosaltres imprimir el valor d'aquestes variables 108 00:05:57,260 --> 00:05:59,670 en el context del programa més gran. 109 00:05:59,670 --> 00:06:02,670 >> Però podríem tenir un diferent programa que té moltes variables. 110 00:06:02,670 --> 00:06:06,530 I pot no ser prou tan fàcil d'usar printf 111 00:06:06,530 --> 00:06:10,120 per tractar d'avaluar el que està succeint a cadascuna d'aquestes variables 112 00:06:10,120 --> 00:06:13,590 ja que el programa s'està executant. 113 00:06:13,590 --> 00:06:16,960 Hi ha un programa que existeix anomenat un programa depurador. 114 00:06:16,960 --> 00:06:20,320 En aquest cas, el que ho farem ús és el depurador de GNU, o GDB, 115 00:06:20,320 --> 00:06:24,260 que ens permet inspeccionar l'interior funcionament d'un programa en una forma molt més 116 00:06:24,260 --> 00:06:25,700 manera detallada. 117 00:06:25,700 --> 00:06:28,810 >> De fet, podem executar BGF des de la línia d'ordres 118 00:06:28,810 --> 00:06:35,370 aquí simplement escrivint el BGF i ​​la comandes que volem depurar. 119 00:06:35,370 --> 00:06:37,550 En aquest cas, explicar. 120 00:06:37,550 --> 00:06:41,650 Ara bé, en aquest cas, podem veure que ens porta a un missatge que diu GDB. 121 00:06:41,650 --> 00:06:44,020 I podem realitat executar comandaments de GDB 122 00:06:44,020 --> 00:06:48,260 per començar realment l'execució de la programa, detenir-lo en certs punts, 123 00:06:48,260 --> 00:06:51,060 avaluar les variables i inspeccionar les variables que 124 00:06:51,060 --> 00:06:54,152 existir en l'estat del programa en aquest moment particular, 125 00:06:54,152 --> 00:06:55,110 i així successivament i així successivament. 126 00:06:55,110 --> 00:06:57,240 Proporciona una gran quantitat d'energia per a nosaltres. 127 00:06:57,240 --> 00:06:59,960 >> Però dóna la casualitat que l'IDE CS50 també 128 00:06:59,960 --> 00:07:05,870 proporciona una interfície gràfica d'usuari o d'un usuari interfície perquè GDB 129 00:07:05,870 --> 00:07:11,120 ens permet fer això sense necessitat la interfície de línia d'ordres en absolut 130 00:07:11,120 --> 00:07:13,560 o en tot fins i tot. 131 00:07:13,560 --> 00:07:16,930 La forma en què jo pugui accedir a aquesta és mitjançant el botó de depuració 132 00:07:16,930 --> 00:07:20,120 a la part superior de l'IDE CS50. 133 00:07:20,120 --> 00:07:24,280 Ara bé, en el passat, el que tenim vist és que usem la comanda 134 00:07:24,280 --> 00:07:27,660 line per compilar i executar un programa. 135 00:07:27,660 --> 00:07:29,790 >> El botó de depuració fa dos d'aquests passos. 136 00:07:29,790 --> 00:07:34,380 Però també s'obre la pestanya depurador a l'extrem dret 137 00:07:34,380 --> 00:07:38,280 que ens permet inspeccionar una varietat de les propietats del programa 138 00:07:38,280 --> 00:07:40,500 ja que s'està executant. 139 00:07:40,500 --> 00:07:44,280 Si faig clic depuració, en aquest cas, s'obrirà 140 00:07:44,280 --> 00:07:48,230 una nova pestanya a la consola finestra a la part inferior. 141 00:07:48,230 --> 00:07:51,160 >> I es pot veure que aquesta fitxa té una mica d'informació a la part superior. 142 00:07:51,160 --> 00:07:52,670 I podem ignorar en gran mesura això. 143 00:07:52,670 --> 00:07:54,800 Però una de les coses que volem notar 144 00:07:54,800 --> 00:07:57,170 és que emet el mateix que nosaltres 145 00:07:57,170 --> 00:08:03,000 obtindria si tractem de fer funcionar el el programa de C a la finestra de terminal. 146 00:08:03,000 --> 00:08:06,230 >> Aquí, podem veure que s'està executant so metàl·lic, i té una varietat de banderes, 147 00:08:06,230 --> 00:08:12,660 i s'està recopilant nostre arxiu count.c, que va ser la fitxa seleccionada en el moment 148 00:08:12,660 --> 00:08:15,100 que em va colpejar de depuració. 149 00:08:15,100 --> 00:08:18,010 Així que això és molt útil perquè ara amb aquest botó de depuració, 150 00:08:18,010 --> 00:08:23,280 podem recopilar de forma simultània i després executar el programa que en realitat 151 00:08:23,280 --> 00:08:24,460 que desitgi executar. 152 00:08:24,460 --> 00:08:27,880 >> Un dels indicadors que es important, en aquest cas, 153 00:08:27,880 --> 00:08:30,190 que en realitat hem estat utilitzant per al temps més llarg 154 00:08:30,190 --> 00:08:32,450 sinó que també acaba de fer una mica de la mà agitant [inaudible], que 155 00:08:32,450 --> 00:08:33,820 és aquesta d'aquí. 156 00:08:33,820 --> 00:08:35,790 En Clang, diu -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 En aquest cas, el que som dient so metàl·lic, el nostre compilador, 159 00:08:41,250 --> 00:08:43,820 és que volem compilar el nostre programa. 160 00:08:43,820 --> 00:08:46,810 Però també proporcionar el que són anomenada informació de símbols 161 00:08:46,810 --> 00:08:50,940 perquè el compilador en realitat té accés a una gran quantitat de la informació subjacent 162 00:08:50,940 --> 00:08:52,610 continguda dins del programa. 163 00:08:52,610 --> 00:08:55,260 >> Més específicament, el nombre de les funcions que tinc, 164 00:08:55,260 --> 00:08:58,000 els noms de les funcions, les variables, els tipus 165 00:08:58,000 --> 00:09:01,730 que aquestes variables són, i una varietat d'altres coses que ajuden a que el depurador 166 00:09:01,730 --> 00:09:04,350 realitzar la seva operació. 167 00:09:04,350 --> 00:09:06,600 Ara hi ha alguna cosa més això és important esmentar 168 00:09:06,600 --> 00:09:10,280 quan estem discutint en execució un programa d'aquesta manera. 169 00:09:10,280 --> 00:09:13,660 >> Recordeu que no té realitat criat una nova pestanya en la nostra consola 170 00:09:13,660 --> 00:09:14,780 al llarg de la part inferior. 171 00:09:14,780 --> 00:09:18,600 Ja no ens enfrontem directament amb la finestra de terminal. 172 00:09:18,600 --> 00:09:21,420 Però aquesta nova pestanya és en realitat una finestra de terminal. 173 00:09:21,420 --> 00:09:26,710 Només és específic per al funcionament programa que hem creat. 174 00:09:26,710 --> 00:09:29,270 >> Observi que en la part inferior, en combinació amb alguna sortida 175 00:09:29,270 --> 00:09:33,500 per Clang el compilador i el BGF, que podem ignorar en gran mesura, 176 00:09:33,500 --> 00:09:37,570 que en realitat mostra la sortida de nostre programa a la part inferior. 177 00:09:37,570 --> 00:09:41,240 Ara és important tenir en compte que aquesta en realitat una finestra 178 00:09:41,240 --> 00:09:43,360 li mostrarà la sortida del seu programa 179 00:09:43,360 --> 00:09:47,190 però també pot acceptar l'entrada per a aquest programa, també. 180 00:09:47,190 --> 00:09:49,260 >> Així avís que indica si us plau escriu un nombre, 181 00:09:49,260 --> 00:09:53,050 que és la mateixa sortida que teníem tenia a la finestra de terminal abans. 182 00:09:53,050 --> 00:09:55,510 Però es mostra ara en aquesta nova pestanya. 183 00:09:55,510 --> 00:09:56,550 Em pot introduir un número. 184 00:09:56,550 --> 00:10:00,900 I ho farà realitat funció que esperem 185 00:10:00,900 --> 00:10:05,890 mostrant-nos la nostra depuració, la producció, la sortida que podria ser amb errors, 186 00:10:05,890 --> 00:10:07,010 com hem vist abans. 187 00:10:07,010 --> 00:10:10,460 I a la part inferior, es en realitat té una sortida addicional 188 00:10:10,460 --> 00:10:14,550 del PIB només dir que aquest programa s'ha completat. 189 00:10:14,550 --> 00:10:16,655 >> Ara bé, com es va veure en aquest en particular cursa a través de, 190 00:10:16,655 --> 00:10:19,370 no era particularment útil perquè fins i tot 191 00:10:19,370 --> 00:10:23,740 tot i que havia arribat el menú depurador dalt, això era encara un programa en execució. 192 00:10:23,740 --> 00:10:26,790 En cap moment va fer realitat aturar l'execució per a nosaltres 193 00:10:26,790 --> 00:10:30,767 ser capaç d'inspeccionar tots les variables contingudes dins. 194 00:10:30,767 --> 00:10:32,850 Hi ha alguna cosa més que hem de fer per 195 00:10:32,850 --> 00:10:36,910 per obtenir GDB reconèixer que volem per aturar l'execució del programa 196 00:10:36,910 --> 00:10:42,820 i no només permetre que es procedeixi normalment com ho faríem en qualsevol altre cas. 197 00:10:42,820 --> 00:10:45,530 >> Per tal d'aturar l'execució, en algun línia específica, 198 00:10:45,530 --> 00:10:47,830 hem de crear el que és anomenat un punt d'inflexió. 199 00:10:47,830 --> 00:10:52,670 I un punt d'inflexió es crea amb molta facilitat en aquest CS50 IDE prenent el punter del ratolí 200 00:10:52,670 --> 00:10:57,090 i fent clic directament a l'esquerra d'un número de línia específic. 201 00:10:57,090 --> 00:10:59,920 Una vegada que ho faig, un punt vermell apareix, que indica 202 00:10:59,920 --> 00:11:02,300 que aquesta línia és ara un punt d'inflexió. 203 00:11:02,300 --> 00:11:07,540 >> I la propera vegada que corro GDB, que s'aturarà l'execució en aquest punt de ruptura 204 00:11:07,540 --> 00:11:10,280 quan arriba a aquesta línia de codi. 205 00:11:10,280 --> 00:11:12,230 Ara bé, aquest és un important és adonar- 206 00:11:12,230 --> 00:11:16,140 que no és necessàriament el cas que cada línia de codi 207 00:11:16,140 --> 00:11:17,880 és realment accessible. 208 00:11:17,880 --> 00:11:23,780 Si hagués de crear una funció aquí, per exemple-- buit F-- 209 00:11:23,780 --> 00:11:31,230 i acaba de fer una línia d'impressió aquí-- hola món-- si no torno a trucar a aquesta funció, 210 00:11:31,230 --> 00:11:34,770 serà el cas que, si em vaig posar un punt de descans aquí, 211 00:11:34,770 --> 00:11:36,220 la funció mai es dirà. 212 00:11:36,220 --> 00:11:38,310 I per tant, aquest en particular punt d'inflexió 213 00:11:38,310 --> 00:11:43,040 serà en realitat mai fer una pausa execució del programa. 214 00:11:43,040 --> 00:11:48,020 >> Així que diguem que jo crec correctament un punt d'inflexió en alguna línia de codi 215 00:11:48,020 --> 00:11:50,340 que realment s'executa. 216 00:11:50,340 --> 00:11:53,470 Ara bé, en aquest cas, aquest és el primera línia de la funció principal. 217 00:11:53,470 --> 00:11:56,630 Així que sens dubte serà el cas que, tan aviat com començo execució, 218 00:11:56,630 --> 00:11:58,580 s'arribarà a la primera línia. 219 00:11:58,580 --> 00:12:00,230 GDB s'aturarà l'execució. 220 00:12:00,230 --> 00:12:04,100 I després, seré capaç de interactuar amb el depurador. 221 00:12:04,100 --> 00:12:08,480 >> Podeu establir diverses línies com punts de ruptura, si vol. 222 00:12:08,480 --> 00:12:11,365 També podem crear una línia cap amunt aquí en aquest segment de codi 223 00:12:11,365 --> 00:12:12,490 això mai s'aconseguirà. 224 00:12:12,490 --> 00:12:14,744 I també podem establir un més endavant. 225 00:12:14,744 --> 00:12:16,660 La raó que ho faríem voler fer això anem a 226 00:12:16,660 --> 00:12:19,119 entrar en una mica més detall en un moment. 227 00:12:19,119 --> 00:12:21,660 Així que per ara, permetin-me inhabilitar aquests punts de trencament addicionals 228 00:12:21,660 --> 00:12:24,940 perquè puguem veure el que succeeix quan tinc una sola ruptura 229 00:12:24,940 --> 00:12:27,650 punt del meu programa. 230 00:12:27,650 --> 00:12:29,410 He fet alguns canvis en aquest programa. 231 00:12:29,410 --> 00:12:30,750 Així que he de guardar-lo. 232 00:12:30,750 --> 00:12:34,490 Vaig a fer clic de depuració perquè jo pugui començar la compilació i després 233 00:12:34,490 --> 00:12:36,880 execució del depurador. 234 00:12:36,880 --> 00:12:40,632 >> Anem a veure que, després de moments, els línia que hem seleccionat com el descans 235 00:12:40,632 --> 00:12:43,360 punt es ressalta en groc. 236 00:12:43,360 --> 00:12:47,440 També podem notar que en el superior dreta del panell de depuració 237 00:12:47,440 --> 00:12:50,940 que la icona de pausa s'ha convertit en una petita icona de reproducció. 238 00:12:50,940 --> 00:12:54,710 Això vol dir que hem de fer una pausa execució, en aquest cas particular. 239 00:12:54,710 --> 00:12:57,840 I colpejar el botó de reproducció es ens permet reprendre l'execució 240 00:12:57,840 --> 00:13:00,000 en aquest punt específic. 241 00:13:00,000 --> 00:13:03,240 >> Observi que hi ha un parell d'altres botons disponibles en aquest panell de depuració, 242 00:13:03,240 --> 00:13:04,220 tant be. 243 00:13:04,220 --> 00:13:09,470 Passar per sobre, el que em permet executar que una línia de codi 244 00:13:09,470 --> 00:13:14,030 i passar per sobre d'aquesta línia a la següent, que, en aquest cas, 245 00:13:14,030 --> 00:13:17,060 que significaria que el printf s'executa comunicat. 246 00:13:17,060 --> 00:13:22,310 I a continuació, farà una pausa l'execució de la línia 13, com a tal. 247 00:13:22,310 --> 00:13:25,090 >> I hi ha també un pas en funció, que 248 00:13:25,090 --> 00:13:28,950 és útil si he creat una altra funcions en el codi font en altres llocs. 249 00:13:28,950 --> 00:13:31,420 I vull entrar en aquestes funcions en lloc de 250 00:13:31,420 --> 00:13:33,050 executar aquesta funció com un tot. 251 00:13:33,050 --> 00:13:37,279 Però anem a veure més en el pas en funció en un moment. 252 00:13:37,279 --> 00:13:40,320 Ara noti algunes altres coses que realment existir dins d'aquest panell de depuració. 253 00:13:40,320 --> 00:13:44,110 >> Tenim aquest panell anomenat Pila de trucades, el que ens mostra 254 00:13:44,110 --> 00:13:45,300 on exactament que som. 255 00:13:45,300 --> 00:13:48,550 En aquest cas, estem dins de la funció principal. 256 00:13:48,550 --> 00:13:50,880 El nostre script es diu count.c. 257 00:13:50,880 --> 00:13:53,820 I ens toca estar en línia 13, columna un, que 258 00:13:53,820 --> 00:13:58,950 és precisament el que la regió ressaltada del codi font indica, també. 259 00:13:58,950 --> 00:14:02,435 >> Ara noti que això demostra també a la secció variable local 260 00:14:02,435 --> 00:14:06,710 totes les variables que existir dins d'aquesta funció. 261 00:14:06,710 --> 00:14:08,930 És important tenir en compte que totes les variables 262 00:14:08,930 --> 00:14:12,580 apareixerà en aquesta variable local secció dins d'una funció, 263 00:14:12,580 --> 00:14:14,380 fins i tot abans que es defineixen. 264 00:14:14,380 --> 00:14:19,160 Podem veure aquí que tenim una variable anomenada num, té un valor predeterminat de 0, 265 00:14:19,160 --> 00:14:21,280 i és de tipus int. 266 00:14:21,280 --> 00:14:24,110 >> Ara abans que realment inicialitzem totes aquestes variables, 267 00:14:24,110 --> 00:14:26,685 no estem necessàriament garantit per veure un valor de 0. 268 00:14:26,685 --> 00:14:29,200 I depenent d'altres execucions que ha realitzat 269 00:14:29,200 --> 00:14:32,020 i l'estat de la seva memòria quan en realitat s'executa aquest programa, 270 00:14:32,020 --> 00:14:34,605 vostè podria trobar que vostè no veuen els valors de 0 271 00:14:34,605 --> 00:14:36,550 i, en canvi, alguns altres números de bojos. 272 00:14:36,550 --> 00:14:38,390 >> Però no et preocupis per això. 273 00:14:38,390 --> 00:14:44,610 No va ser rellevant fins que realment inicialitzar el valor. 274 00:14:44,610 --> 00:14:49,630 Ara bé, en aquest cas, podem veure que He fet algunes sortides. 275 00:14:49,630 --> 00:14:52,131 I estic, ara mateix, vaig aturar l'execució. 276 00:14:52,131 --> 00:14:53,880 Però en aquest cas, el Tinc moltes ganes de fer 277 00:14:53,880 --> 00:14:58,060 és fer un pas ara sobre aquesta línia de codi perquè pugui realment 278 00:14:58,060 --> 00:15:04,390 consultar l'usuari per a aquest int que volem utilitzar en el nostre programa. 279 00:15:04,390 --> 00:15:07,060 >> Ara bé, en aquest cas, quan Vaig colpejar passar per sobre, previ avís 280 00:15:07,060 --> 00:15:11,940 que la pausa o més aviat la represa botó ha canviat a aquest botó Pausa 281 00:15:11,940 --> 00:15:14,022 ja que aquest codi s'executa en realitat. 282 00:15:14,022 --> 00:15:15,730 Que està passant en aquest moment és que es tracta 283 00:15:15,730 --> 00:15:21,630 esperant per nosaltres per introduir alguna informació com podem veure pel nostre text de sortida 284 00:15:21,630 --> 00:15:23,600 a la part inferior. 285 00:15:23,600 --> 00:15:25,787 >> Així que ara mateix, això és en realitat no es va aturar, 286 00:15:25,787 --> 00:15:28,620 tot i que, en certa manera, sembla ser perquè res està succeint. 287 00:15:28,620 --> 00:15:32,360 Però dóna la casualitat que en meu cas concret en la línia 13, 288 00:15:32,360 --> 00:15:34,210 Estic esperant a l'entrada de l'usuari. 289 00:15:34,210 --> 00:15:39,130 I així BGF no és capaç d'inspeccionar un programa a mida que s'està executant. 290 00:15:39,130 --> 00:15:43,370 >> Ara, la propera vegada que entro en alguna input-- així que vaig a entrar en aquest número 5, 291 00:15:43,370 --> 00:15:46,140 com hem vist en el past-- prem Intro, i nosaltres 292 00:15:46,140 --> 00:15:51,430 notar que, immediatament, pauses GDB i, de nou, es destaca la següent línia. 293 00:15:51,430 --> 00:15:55,320 Però cal notar que ara, com un resultat de la nostra ingressar un valor, 294 00:15:55,320 --> 00:15:58,930 hem actualitzat aquest valor a l'interior de les nostres variables locals, que 295 00:15:58,930 --> 00:16:05,560 és molt útil saber amb precisió el que aquest nombre era a la memòria. 296 00:16:05,560 --> 00:16:10,650 >> Ara puc permetre que aquest programa continuï jugant fins al final de la seva execució 297 00:16:10,650 --> 00:16:12,570 prement Reprendre. 298 00:16:12,570 --> 00:16:16,410 Podem veure que molt ràpidament fa l'acabat programa en execució 299 00:16:16,410 --> 00:16:19,790 amb la mateixa sortida que ens tingut abans, el depurador es tanca, 300 00:16:19,790 --> 00:16:23,170 i ara aquest programa s'ha aturat completament. 301 00:16:23,170 --> 00:16:25,320 >> Mostro que només per al efectes de veure el que 302 00:16:25,320 --> 00:16:27,280 que succeeix quan en realitat ens colpegem Reprendre. 303 00:16:27,280 --> 00:16:30,640 Però que en realitat anem a vull tornar a aquest programa 304 00:16:30,640 --> 00:16:33,820 perquè puguem tractar de depuració precisament el que està succeint. 305 00:16:33,820 --> 00:16:37,980 Ara que estic utilitzant el depurador, m'ho permet no necessita aquestes declaracions de depuració printf. 306 00:16:37,980 --> 00:16:43,860 >> Així que podria eliminar-los com faré ara acaba de tornar al nostre codi més simple 307 00:16:43,860 --> 00:16:45,950 que teníem fa un moment. 308 00:16:45,950 --> 00:16:48,790 Ara, quan m'estalvio el programar i executar-lo, 309 00:16:48,790 --> 00:16:53,700 serà, de nou, anar a aquesta inicial trencar el punt que jo tenia a la línia 11. 310 00:16:53,700 --> 00:16:57,700 I seré capaç d'inspeccionar la meva variables com ho volen fer. 311 00:16:57,700 --> 00:17:00,695 >> El que passa és que aquesta part no és molt interessant, 312 00:17:00,695 --> 00:17:04,364 I sé que vaig imprimir aquesta declaració. 313 00:17:04,364 --> 00:17:05,280 Si us plau, introdueixi un nombre. 314 00:17:05,280 --> 00:17:08,099 I després, sé que vaig preguntar a l'usuari per aquest nombre sencer. 315 00:17:08,099 --> 00:17:13,329 Així que potser, jo en realitat vull moure el meu punt de trencar una mica més avall. 316 00:17:13,329 --> 00:17:16,710 >> Podeu eliminar punts de trencament fent clic, de nou, directament 317 00:17:16,710 --> 00:17:18,460 a l'esquerra d'aquest número de línia. 318 00:17:18,460 --> 00:17:22,200 Aquest punt vermell desapareixerà, indicant que aquest punt de ruptura s'ha anat. 319 00:17:22,200 --> 00:17:24,780 Ara bé, en aquest cas, execució està en pausa. 320 00:17:24,780 --> 00:17:27,770 I el que no és en realitat va a reprendre en aquest cas particular. 321 00:17:27,770 --> 00:17:30,210 Però puc configurar un descans apuntar una mica més tard. 322 00:17:30,210 --> 00:17:33,880 >> I quan Reprenc ara la meva codi, es reprendrà i comptar 323 00:17:33,880 --> 00:17:36,190 al punt que el punt d'inflexió. 324 00:17:36,190 --> 00:17:37,374 Un cop més, em va colpejar a Reprèn. 325 00:17:37,374 --> 00:17:39,040 No sembla res està succeint. 326 00:17:39,040 --> 00:17:41,450 Però això és perquè el meu codi està a l'espera per a l'entrada. 327 00:17:41,450 --> 00:17:47,900 Vaig a introduir un nombre 5, premeu Enter, i Ara es va donar en el següent punt de ruptura. 328 00:17:47,900 --> 00:17:50,570 >> Ara, en aquest cas, aquesta és la línia de codi 329 00:17:50,570 --> 00:17:53,820 que, abans, sabíem va passar a ser buggy. 330 00:17:53,820 --> 00:17:57,590 Així que anem a avaluar el que succeeix en aquest punt particular en el temps. 331 00:17:57,590 --> 00:18:02,620 Quan es ressalta una línia, aquesta línia encara no ha estat executat. 332 00:18:02,620 --> 00:18:06,490 Així que en aquest cas, podem veure que tinc un número, que 333 00:18:06,490 --> 00:18:11,610 Tinc un sencer anomenat num que té un valor de 5. 334 00:18:11,610 --> 00:18:15,090 I jo vaig a realitzar una mica de matemàtica en aquest nombre. 335 00:18:15,090 --> 00:18:20,130 >> Si em pas més d'això, podem notar que el valor de num 336 00:18:20,130 --> 00:18:23,780 ha canviat d'acord amb el aritmètica que realment hem fet. 337 00:18:23,780 --> 00:18:26,810 I ara que estem dins d'aquest bucle 338 00:18:26,810 --> 00:18:29,090 o ara que el bucle for sí està ressaltat, 339 00:18:29,090 --> 00:18:32,450 veiem que tenim una nova variable i crida que 340 00:18:32,450 --> 00:18:35,370 va ser utilitzat en aquest bucle. 341 00:18:35,370 --> 00:18:38,230 >> Ara recordar abans que jo esmentar que a vegades ets 342 00:18:38,230 --> 00:18:43,470 anar a veure algun tipus de bogeria números per defecte abans d'aquest número 343 00:18:43,470 --> 00:18:45,530 o aquesta variable és en realitat inicialitzat. 344 00:18:45,530 --> 00:18:49,040 Podem veure que, precisament, aquí a la aquesta variable 345 00:18:49,040 --> 00:18:51,345 anomenada I, que no té però, ha inicialitzat 346 00:18:51,345 --> 00:18:53,560 en el moment de posar en relleu. 347 00:18:53,560 --> 00:18:57,070 Però podem veure que té un nombre que no anàvem realment esperar. 348 00:18:57,070 --> 00:18:57,620 >> Està bé. 349 00:18:57,620 --> 00:18:59,661 No es preocupi perquè tenim en realitat no 350 00:18:59,661 --> 00:19:04,970 inicialitzat aquest nombre fins que passar per sobre d'aquesta línia i el valor 351 00:19:04,970 --> 00:19:08,560 I ha estat inicialitzat amb el valor 1. 352 00:19:08,560 --> 00:19:11,400 Així que a veure que això és en realitat el cas, anem a passar per sobre. 353 00:19:11,400 --> 00:19:14,420 Ara podem veure que aquest línia ha estat executada. 354 00:19:14,420 --> 00:19:17,000 I ara estem destacant aquesta línia printf. 355 00:19:17,000 --> 00:19:22,230 >> I ara podem veure com els nostres valors d'i i 3 he canviat amb el temps. 356 00:19:22,230 --> 00:19:26,450 Això és molt útil per fer, de fet, és passar per sobre de les línies en diverses ocasions. 357 00:19:26,450 --> 00:19:30,480 I vostè pot trobar el que realment que succeeix dins del seu bucle for 358 00:19:30,480 --> 00:19:33,660 i el que li passa a la les variables dins d'aquest bucle for 359 00:19:33,660 --> 00:19:39,200 com que l'execució del programa es produeix un pas a la vegada. 360 00:19:39,200 --> 00:19:41,110 >> Ara, en aquest punt, va passar per sobre del que és just 361 00:19:41,110 --> 00:19:44,210 que ara estic al final del meu programa. 362 00:19:44,210 --> 00:19:46,980 Si em pas més d'això, ho farà de fet cessar l'execució 363 00:19:46,980 --> 00:19:48,860 com hem vist en el passat. 364 00:19:48,860 --> 00:19:52,110 Permetin-me recomençament això, un cop més, de manera que que puc assenyalar alguna cosa més, 365 00:19:52,110 --> 00:19:53,320 tant be. 366 00:19:53,320 --> 00:19:55,350 >> En aquest cas, és ara em demana, una vegada més, 367 00:19:55,350 --> 00:19:57,100 per a un nombre, el qual Jo, de nou, entrar. 368 00:19:57,100 --> 00:20:00,300 Però aquesta vegada, vaig a entrar en un nombre més gran perquè el bucle for 369 00:20:00,300 --> 00:20:02,540 iterará més vegades. 370 00:20:02,540 --> 00:20:06,090 En aquest cas, em vaig per introduir un valor d'11. 371 00:20:06,090 --> 00:20:08,390 >> Ara, de nou perquè em vaig posar un punt de trencament en la línia 15, 372 00:20:08,390 --> 00:20:10,490 es posarà en relleu aquesta línia. 373 00:20:10,490 --> 00:20:12,980 Podem veure que el nostre número 11 és correcta 374 00:20:12,980 --> 00:20:15,560 representat en les nostres variables locals. 375 00:20:15,560 --> 00:20:22,460 Passant per sobre d'això, podem ara observa el que succeeix al nostre valor d'i 376 00:20:22,460 --> 00:20:25,680 a mesura que avancem en l'interior d'aquest bucle. 377 00:20:25,680 --> 00:20:31,960 Es posa s'incrementa cada vegada que arribar al cim d'aquest bucle. 378 00:20:31,960 --> 00:20:35,110 >> Ara una de les coses que podria ser útil per fer durant l'execució 379 00:20:35,110 --> 00:20:40,490 d'aquest programa és per a mi realment canviar el mitjà del corrent de variables per veure 380 00:20:40,490 --> 00:20:42,450 el que passa al meu programa. 381 00:20:42,450 --> 00:20:46,540 En aquest cas, no puc realment feu doble clic al valor. 382 00:20:46,540 --> 00:20:48,040 Observi que es converteix en un camp de text. 383 00:20:48,040 --> 00:20:50,280 >> Ara puc entrar en diferent valorar completament 384 00:20:50,280 --> 00:20:55,700 per veure com es comporta el meu programa quan he canviat aquesta variable. 385 00:20:55,700 --> 00:20:59,560 Ara, en aquest cas, la variable i ara conté el valor 10. 386 00:20:59,560 --> 00:21:02,810 Però el programa segueix sent pausa en l'execució. 387 00:21:02,810 --> 00:21:07,610 Quan faig un pas més, veig que la i valor, que vaig entrar al 10, 388 00:21:07,610 --> 00:21:12,170 no és més gran que el valor de num, que immediatament fa que el bucle for 389 00:21:12,170 --> 00:21:14,240 per aturar l'execució. 390 00:21:14,240 --> 00:21:16,210 >> Ara això no és l'únic raó per la qual ho faria 391 00:21:16,210 --> 00:21:19,450 voler definir la variable al seu lloc. 392 00:21:19,450 --> 00:21:22,210 Vostè pot ser que realment vol per intentar modificar-lo per 393 00:21:22,210 --> 00:21:24,590 que pot continuar execució d'un bucle 394 00:21:24,590 --> 00:21:27,370 o perquè vostè pot ajustar algun valor abans que es 395 00:21:27,370 --> 00:21:32,630 arriba a un conjunt específic de l'aritmètica que està a punt de realitzar. 396 00:21:32,630 --> 00:21:36,210 >> Així que ara que en realitat canviem el valor d'i que el programa s'executa, 397 00:21:36,210 --> 00:21:39,540 va causar el bucle for per deixar de fumar prematurament perquè, de sobte, em 398 00:21:39,540 --> 00:21:42,770 va passar a ser major que el valor de num, el que significa que aquest bucle for 399 00:21:42,770 --> 00:21:45,410 ja no és necessari per a ser executat. 400 00:21:45,410 --> 00:21:48,780 A més, va passar a ser el cas que canviem el valor d'i 401 00:21:48,780 --> 00:21:53,270 quan es va posar en relleu la línia 17, que era el punt en el temps 402 00:21:53,270 --> 00:21:56,280 perquè l'execució del bucle va ser en realitat s'està avaluant. 403 00:21:56,280 --> 00:22:00,210 >> Si jo hagués canviat el valor de I en una línia diferent, dic 19, 404 00:22:00,210 --> 00:22:03,360 hauríem vist diferent comportament perquè la línia 19 ho faria 405 00:22:03,360 --> 00:22:08,310 haver executat abans del bucle condició va ser reevaluado. 406 00:22:08,310 --> 00:22:11,900 Ara en aquest moment, estic, de nou, al final d'aquest programa. 407 00:22:11,900 --> 00:22:15,707 I puc permetre que això continuï amb permeti que el meu programa per deixar de fumar de forma natural. 408 00:22:15,707 --> 00:22:18,290 Però hi ha un parell de coses que són importants per a dur 409 00:22:18,290 --> 00:22:19,960 d'aquesta discussió particular. 410 00:22:19,960 --> 00:22:22,490 Cal avaluar les seves pròpies suposicions 411 00:22:22,490 --> 00:22:24,710 sobre com el codi ha de ser comportant. 412 00:22:24,710 --> 00:22:28,220 Cada vegada que vostè pensa que alguna peça de codi que saps passa a treballar, 413 00:22:28,220 --> 00:22:30,940 que podria ser una bandera vermella per anar enrere i avaluar, i assegureu-vos 414 00:22:30,940 --> 00:22:33,470 que assumit com aquest codi està funcionant 415 00:22:33,470 --> 00:22:38,290 és realment fidel a la forma en què és expressat en el codi font. 416 00:22:38,290 --> 00:22:41,300 >> Però encara més a punt era, quan estem fent servir el depurador, 417 00:22:41,300 --> 00:22:43,920 vostè pot posar punts de ruptura en diferents línies de codi, 418 00:22:43,920 --> 00:22:48,110 el que provocarà que el depurador aturar l'execució en cadascuna d'aquestes línies 419 00:22:48,110 --> 00:22:52,210 perquè pugui avaluar la memòria o fins i tot canviar al seu lloc. 420 00:22:52,210 --> 00:22:55,630 I de nou, recordi que vostè pot crear múltiples punts d'interrupció perquè 421 00:22:55,630 --> 00:23:00,390 També pot reprendre l'execució, ometi sobre grans porcions de codi, 422 00:23:00,390 --> 00:23:04,790 i que va a fer una pausa de forma automàtica en el següent punt de ruptura. 423 00:23:04,790 --> 00:23:07,760 >> De fet, hi ha més avançat característiques del depurador, també. 424 00:23:07,760 --> 00:23:10,170 Però anem a haver de fer referència que a alguns vídeos posteriors 425 00:23:10,170 --> 00:23:14,090 amb la finalitat de burlar-se de veritat, a part de com utilitzar aquestes funcions particulars. 426 00:23:14,090 --> 00:23:15,990 Per ara, gràcies molt per veure. 427 00:23:15,990 --> 00:23:18,080 I bona sort depuració.