1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Molt bé GDB. 3 00:00:06,830 --> 00:00:08,480 Què és exactament? 4 00:00:08,480 --> 00:00:11,310 Així GDB, que significa per al depurador de GNU, 5 00:00:11,310 --> 00:00:15,040 és una eina molt impressionant que podem utilitzar per ajudar-nos a depurar nostres programes, 6 00:00:15,040 --> 00:00:18,210 o esbrinar on són les coses que va malament en els nostres programes. 7 00:00:18,210 --> 00:00:22,590 BGF és increïblement poderosa, però la sortida i la interacció amb ella 8 00:00:22,590 --> 00:00:23,830 pot ser una mica críptic. 9 00:00:23,830 --> 00:00:28,210 En general és una eina de línia d'ordres, i pot llançar una gran quantitat de missatges a vostè. 10 00:00:28,210 --> 00:00:31,144 I pot una mica difícil analitzar exactament el que està passant. 11 00:00:31,144 --> 00:00:33,560 Passos Afortunadament, ens hem pres per solucionar aquest problema per a vostè 12 00:00:33,560 --> 00:00:36,281 a mesura que treballa a través CS50. 13 00:00:36,281 --> 00:00:39,030 Si vostè no està utilitzant la gràfica depurador, que la meva col·lega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse ha parlat bastant una mica sobre un vídeo que 15 00:00:41,570 --> 00:00:44,740 ha de ser per aquí en aquest moment, és possible que necessiti 16 00:00:44,740 --> 00:00:48,270 utilitzar aquests línia d'ordres eines per treballar amb GDB. 17 00:00:48,270 --> 00:00:51,250 Si està treballant en el CS50 IDE, no cal fer això. 18 00:00:51,250 --> 00:00:53,550 Però si no estàs treballant en el CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 potser utilitzant una versió de CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 o un altre operatiu Linux sistema amb GDB instal·lat en ell, 21 00:00:58,860 --> 00:01:00,980 pot ser que hagi d'utilitzar aquestes eines de línia d'ordres. 22 00:01:00,980 --> 00:01:02,860 >> I ja que vostè podria té a veure això, és 23 00:01:02,860 --> 00:01:06,280 útil només per entendre com GDB funciona des de la línia d'ordres. 24 00:01:06,280 --> 00:01:09,650 Però, de nou, si vostè és utilitzant l'IDE CS50, que 25 00:01:09,650 --> 00:01:15,400 pot utilitzar el depurador gràfic que està integrat a l'IDE. 26 00:01:15,400 --> 00:01:18,750 Així que perquè funcioni amb GDB, per iniciar la depuració 27 00:01:18,750 --> 00:01:21,220 d'un procés particular, programa, tot el que heu de fer 28 00:01:21,220 --> 00:01:23,810 s'escrigui GDB seguit pel nom del programa. 29 00:01:23,810 --> 00:01:28,620 Així, per exemple, si el seu programa és hola, escriuria GDB hola. 30 00:01:28,620 --> 00:01:31,210 >> Quan fas això, vas per aixecar l'entorn GDB. 31 00:01:31,210 --> 00:01:33,800 La seva ràpida canviarà, i en lloc de ser el que en general 32 00:01:33,800 --> 00:01:35,841 és quan s'escriu coses en ls line-- comando, 33 00:01:35,841 --> 00:01:38,115 cd-- tota la seva típica Comandaments de Linux, l'indicador 34 00:01:38,115 --> 00:01:42,200 canviarà a, probablement, alguna cosa com parèntesi GDB parèntesis. 35 00:01:42,200 --> 00:01:46,630 Aquest és el teu nou indicador GDB, perquè estàs dins l'entorn del BGF. 36 00:01:46,630 --> 00:01:49,830 Un cop dins d'aquest entorn, hi ha dos principals ordres 37 00:01:49,830 --> 00:01:52,290 que és probable que utilitzi en el següent ordre. 38 00:01:52,290 --> 00:01:55,200 >> La primera és b, que és l'abreviatura de descans. 39 00:01:55,200 --> 00:01:58,690 I després d'escriure b, normalment escriviu el nom d'una funció, 40 00:01:58,690 --> 00:02:01,040 o si per casualitat vostè coneix tot el que el número de línia 41 00:02:01,040 --> 00:02:04,100 el programa està començant a comportar una mica estrany, 42 00:02:04,100 --> 00:02:06,370 pot escriure una línia nombre d'allà també. 43 00:02:06,370 --> 00:02:09,660 El que b, o ruptura, fa és que li permet al seu programa 44 00:02:09,660 --> 00:02:13,270 per funcionar fins a un cert punt, a saber, el nom de la funció 45 00:02:13,270 --> 00:02:15,880 que especifiqui o la línia nombre que especifiqueu. 46 00:02:15,880 --> 00:02:18,590 >> I en aquest punt, congelarà execució. 47 00:02:18,590 --> 00:02:21,670 Aquesta és una molt bona cosa, perquè una vegada que l'execució s'ha congelat, 48 00:02:21,670 --> 00:02:25,214 vostè pot començar a molt lentament pas a través del seu programa. 49 00:02:25,214 --> 00:02:28,130 Normalment, si has estat corrent seus programes, que són bastant curt. 50 00:02:28,130 --> 00:02:31,250 En general, s'escriu slash dot el el nom del seu programa, premeu Enter, 51 00:02:31,250 --> 00:02:33,470 i abans que pugui parpellejar, la seva programa ja ha acabat. 52 00:02:33,470 --> 00:02:36,620 En realitat no és un munt de temps per provar i esbrinar el que està passant malament. 53 00:02:36,620 --> 00:02:40,920 Així que realment sigui capaç de frenar les coses per l'establiment d'un punt de ruptura amb b, 54 00:02:40,920 --> 00:02:43,040 i després intervenir. 55 00:02:43,040 --> 00:02:46,169 >> Després, una vegada que hagi definit la seva ruptura punt, vostè pot executar el programa. 56 00:02:46,169 --> 00:02:47,960 I si vostè té qualsevol arguments de la línia d'ordres, 57 00:02:47,960 --> 00:02:51,610 especificats aquí, no quan escriu GDB seu nom del programa. 58 00:02:51,610 --> 00:02:55,980 S'especifica tota la línia d'ordres arguments prenent r, o córrer, 59 00:02:55,980 --> 00:03:00,270 i després els arguments de línia de comandes que sigui que necessita dins del seu programa. 60 00:03:00,270 --> 00:03:03,510 Hi ha un nombre d'altres realment ordres importants i útils 61 00:03:03,510 --> 00:03:04,970 dins de l'ambient del PIB. 62 00:03:04,970 --> 00:03:07,540 Així que permetin-me ràpidament repassar alguns d'ells. 63 00:03:07,540 --> 00:03:11,320 >> El primer és N, que és l'abreviatura per al pròxim, i vostè pot escriure al costat en lloc de n, 64 00:03:11,320 --> 00:03:12,304 tant funcionaria. 65 00:03:12,304 --> 00:03:13,470 I és només la taquigrafia. 66 00:03:13,470 --> 00:03:17,540 I com vostè probablement ja haurà arribat utilitzat per a, de ser capaç d'escriure coses 67 00:03:17,540 --> 00:03:20,520 més curt és generalment millor. 68 00:03:20,520 --> 00:03:24,100 I el que va a fer és que va a un pas endavant d'un bloc de codi. 69 00:03:24,100 --> 00:03:26,170 Així que seguirà endavant fins que una trucada a la funció. 70 00:03:26,170 --> 00:03:28,350 I llavors en lloc de capbussar-se en aquesta funció 71 00:03:28,350 --> 00:03:33,130 i passant per tots que les funcions codi, només tindrà la funció. 72 00:03:33,130 --> 00:03:34,400 >> La funció serà cridada. 73 00:03:34,400 --> 00:03:35,733 Es farà tant la seva tasca és. 74 00:03:35,733 --> 00:03:38,870 Es retornarà un valor de la funció que la va cridar. 75 00:03:38,870 --> 00:03:42,490 I llavors podràs passar a la següent línia d'aquesta funció que crida. 76 00:03:42,490 --> 00:03:44,555 Si vols fer un pas dins de la funció, 77 00:03:44,555 --> 00:03:46,430 en lloc de només tenir s'executa, especialment 78 00:03:46,430 --> 00:03:50,004 si vostè pensa que el problema podria estar dins d'aquesta funció, 79 00:03:50,004 --> 00:03:52,670 vostè podria, per descomptat, establir un trencament punt dins d'aquesta funció. 80 00:03:52,670 --> 00:03:57,820 O si ja s'està executant, pot utilitzi s per avançar una línia de codi. 81 00:03:57,820 --> 00:04:01,170 >> Així que això va a intervenir i submergir-se en funcions, 82 00:04:01,170 --> 00:04:04,750 en lloc de només tenir la execute i continuant en la funció de 83 00:04:04,750 --> 00:04:07,380 que vostè es trobarà amb la depuració. 84 00:04:07,380 --> 00:04:09,870 Si alguna vegada vols saber el valor d'una variable, 85 00:04:09,870 --> 00:04:12,507 pot escriure p, o impressió, i després el nom de la variable. 86 00:04:12,507 --> 00:04:15,090 I això va a imprimir a vostè, dins l'entorn del BGF, 87 00:04:15,090 --> 00:04:19,110 el nom de la variable, que usted-- excusar mi-- el valor de la variable 88 00:04:19,110 --> 00:04:20,064 que vostè ha nomenat. 89 00:04:20,064 --> 00:04:23,230 Si desitja conèixer els valors de tots els variable local accessible des d'on 90 00:04:23,230 --> 00:04:25,970 es troba actualment en la seva programa, pot escriure informació vilatans. 91 00:04:25,970 --> 00:04:28,332 És molt més ràpid que teclejant p i després el que sigui, 92 00:04:28,332 --> 00:04:30,540 llista a terme totes les les variables que sap que existeixen. 93 00:04:30,540 --> 00:04:34,370 Pot escriure informació locals, i imprimirà tot per a vostè. 94 00:04:34,370 --> 00:04:37,770 El següent és bt, que és abreviatura de Tornar Trace. 95 00:04:37,770 --> 00:04:41,680 Ara, en general, especialment d'hora en CS50, 96 00:04:41,680 --> 00:04:44,450 no realment tindrà ocasió utilitzar bt, o Back Trace, 97 00:04:44,450 --> 00:04:47,860 perquè no està tenint funcions que criden a altres funcions. 98 00:04:47,860 --> 00:04:50,450 >> És possible que tingui una trucada principal funció, però això és probablement la mateixa. 99 00:04:50,450 --> 00:04:53,199 No ha de altra funció trucar a una altra funció, que 100 00:04:53,199 --> 00:04:54,880 crida a una altra funció, i així successivament. 101 00:04:54,880 --> 00:04:57,550 Però a mesura que els programes es tornen més complexa, i en particular 102 00:04:57,550 --> 00:05:00,290 quan es comença a treballar amb recursivitat, rastreig 103 00:05:00,290 --> 00:05:05,150 pot ser una manera molt útil per permetre- tipus d'aconseguir una mica de context per on 104 00:05:05,150 --> 00:05:06,460 Jo estic en el meu programa. 105 00:05:06,460 --> 00:05:10,590 Així que dius que has escrit el codi, i vostè sap que la principal crida a una funció 106 00:05:10,590 --> 00:05:14,720 f, que crida a una funció g, que crida a una funció h. 107 00:05:14,720 --> 00:05:17,650 Així que tenim diverses capes d'implantació passa aquí. 108 00:05:17,650 --> 00:05:19,440 >> Si estàs dins de el seu entorn de GDB, 109 00:05:19,440 --> 00:05:21,640 i vostè sap que el seu interior de h, però s'oblida 110 00:05:21,640 --> 00:05:27,210 sobre el que va arribar a on tracti: pot escriure bt o rastreig, 111 00:05:27,210 --> 00:05:32,370 i s'imprimirà h, g, f principal, juntament amb alguna altra informació, que 112 00:05:32,370 --> 00:05:35,984 et dóna una pista que, OK principal anomenat f, f anomenat g, g crida h, 113 00:05:35,984 --> 00:05:37,900 i aquí és on jo Actualment estic en el meu programa. 114 00:05:37,900 --> 00:05:41,380 Així que pot ser realment útil, sobretot perquè el críptic-tat de GDB 115 00:05:41,380 --> 00:05:45,667 es converteix en una mica aclaparadora, a saber exactament on són les coses. 116 00:05:45,667 --> 00:05:48,500 Finalment, quan es porta a terme el programa, o quan hagi acabat depurar- 117 00:05:48,500 --> 00:05:50,125 i vol allunyar- des de l'entorn de GDB, 118 00:05:50,125 --> 00:05:51,940 ajuda a saber com sortir-ne. 119 00:05:51,940 --> 00:05:55,500 Pot escriure q, o Sortir, sortir. 120 00:05:55,500 --> 00:05:59,220 Ara, abans de vídeo d'avui Vaig preparar un programa amb errors 121 00:05:59,220 --> 00:06:03,900 anomenada buggy1, que compili des d'un arxiu conegut com buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Com era d'esperar, aquest programa és, de fet, amb errors. 123 00:06:06,500 --> 00:06:08,990 Alguna cosa va malament quan intento executar-lo. 124 00:06:08,990 --> 00:06:13,014 Ara, per desgràcia, sense adonar-me eliminat el meu arxiu buggy1.c, 125 00:06:13,014 --> 00:06:15,930 així que per a mi esbrinar ¿Què està passant malament amb aquest programa, 126 00:06:15,930 --> 00:06:18,770 Vaig a haver d'usar GDB tipus de cegues, tractant 127 00:06:18,770 --> 00:06:22,372 per navegar a través d'aquest programa per esbrinar exactament el que va malament. 128 00:06:22,372 --> 00:06:24,580 Però usant només les eines que ja hem après sobre, 129 00:06:24,580 --> 00:06:27,700 podem més o menys la figura exactament el que és. 130 00:06:27,700 --> 00:06:30,740 Així que anem a CS50 IDE i fer una ullada. 131 00:06:30,740 --> 00:06:33,155 OK, així que estem aquí al meu CS50 entorn IDE, 132 00:06:33,155 --> 00:06:35,697 i vaig a zoom en una mica perquè pugui veure una mica més. 133 00:06:35,697 --> 00:06:38,530 A la finestra de la meva terminal, si enumero el contingut del meu actual director 134 00:06:38,530 --> 00:06:41,250 amb ls, veurem que tenir un parell d'arxius de codi font 135 00:06:41,250 --> 00:06:44,982 aquí, incloent el buggy1 discutit prèviament. 136 00:06:44,982 --> 00:06:46,940 El que passa exactament quan Tracte de córrer buggy1. 137 00:06:46,940 --> 00:06:47,773 Bé anem a esbrinar. 138 00:06:47,773 --> 00:06:52,510 Escric barra de punt, amb errors, i em van colpejar Retorn. 139 00:06:52,510 --> 00:06:53,670 >> Errors de segmentació. 140 00:06:53,670 --> 00:06:55,000 Això no és bo. 141 00:06:55,000 --> 00:06:57,180 Si vostè recorda, un fallada de segmentació normalment 142 00:06:57,180 --> 00:07:01,540 passa quan s'accedeix a la memòria que no se'ns permet tocar. 143 00:07:01,540 --> 00:07:03,820 Hem arribat d'alguna manera fora dels límits 144 00:07:03,820 --> 00:07:05,995 del que el programa, el compilador, ens ha donat. 145 00:07:05,995 --> 00:07:08,310 I així, ja que és una clau a tenir a la caixa d'eines 146 00:07:08,310 --> 00:07:10,660 en començar el procés de depuració. 147 00:07:10,660 --> 00:07:13,620 Alguna cosa ha anat una mica malament aquí. 148 00:07:13,620 --> 00:07:15,935 >> Molt bé, així que començarem l'entorn de GDB 149 00:07:15,935 --> 00:07:19,030 i veure si podem esbrinar ¿Què és exactament el problema. 150 00:07:19,030 --> 00:07:21,674 Vaig a netejar la meva pantalla, i jo vaig a escriure BGF 151 00:07:21,674 --> 00:07:24,340 de nou, per entrar a l'entorn del BGF, i el nom del programa 152 00:07:24,340 --> 00:07:27,450 que vull depurar, buggy1. 153 00:07:27,450 --> 00:07:30,182 Tenim un petit missatge, llegint símbols de buggy1, fer. 154 00:07:30,182 --> 00:07:32,390 Tot el que significa és que va treure junts tot el codi, 155 00:07:32,390 --> 00:07:35,570 i ara que ha estat carregat en GDB, i està llest per anar. 156 00:07:35,570 --> 00:07:37,140 >> Ara, què és el que vull fer? 157 00:07:37,140 --> 00:07:39,130 ¿Recorda el que el primera etapa és típicament 158 00:07:39,130 --> 00:07:42,540 després que jo estic dins d'aquest ambient? 159 00:07:42,540 --> 00:07:44,540 Esperem que aquest conjunt un punt d'inflexió, perquè 160 00:07:44,540 --> 00:07:46,240 de fet, això és el que vull fer. 161 00:07:46,240 --> 00:07:47,990 Ara, jo no tinc la codi font d'aquest 162 00:07:47,990 --> 00:07:50,948 davant meu, que és, probablement, no és el cas d'ús típic, per cert. 163 00:07:50,948 --> 00:07:52,055 Vostè probablement ho farà. 164 00:07:52,055 --> 00:07:52,680 Així que això és bo. 165 00:07:52,680 --> 00:07:55,790 Però suposant que no, el que és la funció que vostè sap 166 00:07:55,790 --> 00:07:58,880 existeix en cada programa de C sola? 167 00:07:58,880 --> 00:08:04,420 No importa com de gran o complicat que és, aquesta funció sense dubte existeix. 168 00:08:04,420 --> 00:08:05,440 Principal, ¿no? 169 00:08:05,440 --> 00:08:08,870 >> Així que tota la resta si no, que pot establir un punt d'inflexió en el principal. 170 00:08:08,870 --> 00:08:12,200 I de nou, jo només vaig poder escriure trencar principal, en lloc de b. 171 00:08:12,200 --> 00:08:14,650 I si vostè és curiós, si mai escrigui un comando llarg 172 00:08:14,650 --> 00:08:16,800 i després adonar-se que escrit les coses malament, 173 00:08:16,800 --> 00:08:18,770 i vol desfer- tot el que acabo de fer, 174 00:08:18,770 --> 00:08:22,029 vostè pot controlar O, que va esborrar tot i portar de tornada 175 00:08:22,029 --> 00:08:23,570 al principi de les línies de cursor. 176 00:08:23,570 --> 00:08:26,569 Molt més ràpid que simplement premeu la eliminar o colpejant de vegades manat 177 00:08:26,569 --> 00:08:27,080 acabat. 178 00:08:27,080 --> 00:08:28,740 >> Així que anem a establir un punt d'inflexió en el principal. 179 00:08:28,740 --> 00:08:32,970 I com es pot veure, es diu que hem establir un punt d'inflexió en l'arxiu buggy1.c, 180 00:08:32,970 --> 00:08:36,330 i pel que sembla la primera línia del codi del principal és la línia de set. 181 00:08:36,330 --> 00:08:38,080 Un cop més, no tenim l'arxiu d'origen aquí, 182 00:08:38,080 --> 00:08:40,429 però vaig a suposar que es tracta d' dir-me la veritat. 183 00:08:40,429 --> 00:08:44,510 I llavors, només estic tractant i executar el programa, r. 184 00:08:44,510 --> 00:08:45,360 A partir del programa. 185 00:08:45,360 --> 00:08:48,160 Molt bé, de manera que aquest missatge és una mica críptic. 186 00:08:48,160 --> 00:08:50,160 Però bàsicament el que hi ha passant aquí és que és només 187 00:08:50,160 --> 00:08:53,350 dient-me que he colpejat el meu descans punt, trencar el punt número 1. 188 00:08:53,350 --> 00:08:55,877 >> I després, aquesta línia de codi, el fitxer o directori no existeix. 189 00:08:55,877 --> 00:08:57,710 L'única raó per la qual Estic veient aquest missatge 190 00:08:57,710 --> 00:09:00,800 és perquè sense adonar-me eliminat el meu arxiu buggy.c. 191 00:09:00,800 --> 00:09:04,050 Si existia meu arxiu buggy1.c en el directori actual, 192 00:09:04,050 --> 00:09:06,920 aquest dret línia hi ha realment faria digues-me el que la línia de codi 193 00:09:06,920 --> 00:09:08,214 literalment llegeix. 194 00:09:08,214 --> 00:09:09,380 Per desgràcia, jo vaig esborrar. 195 00:09:09,380 --> 00:09:14,790 Haurem de tipus de navegar a través d'aquest una mica més a cegues. 196 00:09:14,790 --> 00:09:17,330 >> OK, així que anem a veure, què Què vull fer aquí? 197 00:09:17,330 --> 00:09:21,770 Bé, m'agradaria saber què locals variables que potser estan disponibles per a mi. 198 00:09:21,770 --> 00:09:23,570 He començat el meu programa. 199 00:09:23,570 --> 00:09:28,515 Anem a veure el que podria ser ja inicialitzat per a nosaltres. 200 00:09:28,515 --> 00:09:31,430 Escric Info vilatans, no hi ha gent. 201 00:09:31,430 --> 00:09:33,960 Molt bé, així que no ho fa em dóna un munt d'informació. 202 00:09:33,960 --> 00:09:37,600 Jo podria tractar d'imprimir una variable, però jo no conec cap nom de les variables. 203 00:09:37,600 --> 00:09:39,930 Podria intentar un rastreig, però jo estic dins de la principal, 204 00:09:39,930 --> 00:09:43,710 així que sé que no he fet una altra crida a la funció en aquest moment. 205 00:09:43,710 --> 00:09:47,710 >> Així que sembla que les meves úniques opcions són utilitzar n o així i començar a bussejar en. 206 00:09:47,710 --> 00:09:49,630 Vaig a utilitzar n. 207 00:09:49,630 --> 00:09:51,180 Així que escric n. 208 00:09:51,180 --> 00:09:53,060 Oh, Déu meu, ¿què està passant aquí. 209 00:09:53,060 --> 00:09:56,260 Programa de les senyals rebudes, SIGSEGV error de segmentació, 210 00:09:56,260 --> 00:09:57,880 i després un munt de coses. 211 00:09:57,880 --> 00:09:58,880 Ja estic aclaparat. 212 00:09:58,880 --> 00:10:00,980 Bé, en realitat hi ha una molt per aprendre aquí. 213 00:10:00,980 --> 00:10:02,520 Llavors, què ens diu això? 214 00:10:02,520 --> 00:10:09,180 El que ens diu és que aquest programa és a punt, però no té, però, culpa seg. 215 00:10:09,180 --> 00:10:12,550 I en particular, vaig per apropar encara més aquí, 216 00:10:12,550 --> 00:10:18,980 està a punt de SEG culpa sobre una cosa anomenada strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Ara, pot ser que no hàgim discutit aquesta funció extensivament. 218 00:10:22,705 --> 00:10:25,580 Però és-- perquè no anem per parlar de totes les funcions que 219 00:10:25,580 --> 00:10:28,610 existeix en l'estàndard C library-- però tots estan disponibles per a vostè, 220 00:10:28,610 --> 00:10:32,110 sobretot si es pren un mira reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 I strcmp és un molt potent funció que existeix a l'interior 222 00:10:35,000 --> 00:10:38,070 de la capçalera string.h arxiu, que és una capçalera 223 00:10:38,070 --> 00:10:41,970 arxiu que es dedica a funcions que treballen amb i manipular cadenes. 224 00:10:41,970 --> 00:10:49,830 >> I, en particular, el que fa és strcmp compara els valors de dues cadenes. 225 00:10:49,830 --> 00:10:54,160 Així que estic a punt de segmentació culpa en una crida a strcmp sembla. 226 00:10:54,160 --> 00:10:58,530 Vaig colpejar n, i de fet em surt el missatge, programa va acabar amb SIGSEGV de senyal 227 00:10:58,530 --> 00:11:01,370 fallada de segmentació. Així que ara De fet, m'he criticat seg, 228 00:11:01,370 --> 00:11:06,479 i el meu programa té prou molt més efectivament renunciat. 229 00:11:06,479 --> 00:11:07,770 Aquest és el final del programa. 230 00:11:07,770 --> 00:11:10,370 Es va enfonsar, es va estavellar. 231 00:11:10,370 --> 00:11:14,740 Així que no era molt, però jo en realitat ho va fer aprendre una mica 232 00:11:14,740 --> 00:11:16,747 d'aquesta poca experiència. 233 00:11:16,747 --> 00:11:17,580 Què he après? 234 00:11:17,580 --> 00:11:22,020 Bé, el meu programa es bloqueja gairebé immediatament. 235 00:11:22,020 --> 00:11:26,300 El meu programa es bloqueja en Una crida a strcmp, però jo 236 00:11:26,300 --> 00:11:30,560 no tenen cap variables locals en el meu programa en el moment que s'estavella. 237 00:11:30,560 --> 00:11:37,320 Llavors, ¿quina cadena o cadenes, podria jo estar comparant. 238 00:11:37,320 --> 00:11:42,140 Si jo no tinc cap locals les variables, és possible que 239 00:11:42,140 --> 00:11:45,520 Conjecturo que tener-- pot haver és un variable global, que podria ser veritat. 240 00:11:45,520 --> 00:11:47,670 >> Però, en general, sembla com que estic comparant 241 00:11:47,670 --> 00:11:52,070 a una cosa que no existeix. 242 00:11:52,070 --> 00:11:54,130 Així que anem a investigar que una mica més enllà. 243 00:11:54,130 --> 00:11:55,120 Així que em vaig a netejar la meva pantalla. 244 00:11:55,120 --> 00:11:57,536 Vaig a deixar fora de la Entorn GDB per un segon. 245 00:11:57,536 --> 00:12:01,300 I estic pensant, bé, així que no no hi ha variables locals en el meu programa. 246 00:12:01,300 --> 00:12:06,444 Em pregunto si potser se suposa que he de passar en una cadena com un argument de línia d'ordres. 247 00:12:06,444 --> 00:12:07,610 Així que anem a provar això. 248 00:12:07,610 --> 00:12:09,020 No he fet això abans. 249 00:12:09,020 --> 00:12:14,244 >> Anem a veure si potser si executo aquest programa amb un argument de línia de comandes que funciona. 250 00:12:14,244 --> 00:12:16,140 Ei, no hi ha error de segmentació allà. 251 00:12:16,140 --> 00:12:17,870 Es m'acaba de dir que l'he descobert. 252 00:12:17,870 --> 00:12:19,170 Així que potser aquesta és la solució aquí. 253 00:12:19,170 --> 00:12:27,560 I de fet, si em vaig enrere i mirar el codi font real per buggy1.c, 254 00:12:27,560 --> 00:12:31,180 sembla com si el que estic fent és Estic fent una crida a strcmp sense 255 00:12:31,180 --> 00:12:34,010 comprovar si, de fet, argv [1] existeix. 256 00:12:34,010 --> 00:12:36,730 Això és en realitat la codi font per buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Així que el que realment necessito fer aquí per arreglar el meu programa, 258 00:12:38,855 --> 00:12:40,835 suposant que tinc el presentar al davant de mi, és 259 00:12:40,835 --> 00:12:44,740 simplement afegir un xec per fer assegurar-se que argc és igual a 2. 260 00:12:44,740 --> 00:12:47,780 Així que aquest exemple, un cop més, com he dit, és una mica artificial, oi? 261 00:12:47,780 --> 00:12:49,840 En general, vostè no va a esborrar accidentalment el seu codi font 262 00:12:49,840 --> 00:12:51,820 i després haver de tractar i depurar el programa. 263 00:12:51,820 --> 00:12:53,120 Però és d'esperar, l'hi va donar que una il·lustració 264 00:12:53,120 --> 00:12:55,120 dels tipus de coses que vostè podria estar pensant en 265 00:12:55,120 --> 00:12:56,610 com vostè està depurar el seu programa. 266 00:12:56,610 --> 00:12:58,760 >> Quin és l'estat de coses aquí? 267 00:12:58,760 --> 00:13:00,510 Quines variables fer jo tenir accés al meu? 268 00:13:00,510 --> 00:13:03,600 On exactament és el meu programa estavellar-se, en quina línia, 269 00:13:03,600 --> 00:13:05,240 en el cridat a quina funció? 270 00:13:05,240 --> 00:13:06,952 Quin tipus de pistes ¿això em donen? 271 00:13:06,952 --> 00:13:08,910 I això és exactament el tipus de mentalitat que 272 00:13:08,910 --> 00:13:12,820 ha d'entrar en quan estàs pensant en la depuració dels programes. 273 00:13:12,820 --> 00:13:13,820 >> Sóc Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Això és CS50. 275 00:13:16,140 --> 00:15:08,642