1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Muy bien GDB. 3 00:00:06,830 --> 00:00:08,480 ¿Qué es exactamente? 4 00:00:08,480 --> 00:00:11,310 Así GDB, que significa para el depurador de GNU, 5 00:00:11,310 --> 00:00:15,040 es una herramienta muy impresionante que podemos utilizar para ayudarnos a depurar nuestros programas, 6 00:00:15,040 --> 00:00:18,210 o averiguar dónde están las cosas que va mal en nuestros programas. 7 00:00:18,210 --> 00:00:22,590 BGF es increíblemente poderosa, pero la salida y la interacción con ella 8 00:00:22,590 --> 00:00:23,830 puede ser un poco críptico. 9 00:00:23,830 --> 00:00:28,210 Por lo general es una herramienta de línea de comandos, y puede lanzar una gran cantidad de mensajes a usted. 10 00:00:28,210 --> 00:00:31,144 Y puede un poco difícil analizar exactamente lo que está pasando. 11 00:00:31,144 --> 00:00:33,560 Pasos Afortunadamente, nos hemos tomado para solucionar este problema para usted 12 00:00:33,560 --> 00:00:36,281 a medida que trabaja a través CS50. 13 00:00:36,281 --> 00:00:39,030 Si usted no está utilizando la gráfica depurador, que mi colega Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse ha hablado bastante un poco acerca de un vídeo que 15 00:00:41,570 --> 00:00:44,740 debe ser por aquí en este momento, es posible que necesite 16 00:00:44,740 --> 00:00:48,270 utilizar estos línea de comandos herramientas para trabajar con GDB. 17 00:00:48,270 --> 00:00:51,250 Si está trabajando en el CS50 IDE, no es necesario hacer esto. 18 00:00:51,250 --> 00:00:53,550 Pero si no estás trabajando en el CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 tal vez utilizando una versión de CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 u otro operativo Linux sistema con GDB instalado en él, 21 00:00:58,860 --> 00:01:00,980 puede que tenga que utilizar estas herramientas de línea de comandos. 22 00:01:00,980 --> 00:01:02,860 >> Y ya que usted podría tiene que ver eso, es 23 00:01:02,860 --> 00:01:06,280 útil sólo para entender cómo GDB funciona desde la línea de comandos. 24 00:01:06,280 --> 00:01:09,650 Pero, de nuevo, si usted es utilizando el IDE CS50, que 25 00:01:09,650 --> 00:01:15,400 puede utilizar el depurador gráfico que está integrado en el IDE. 26 00:01:15,400 --> 00:01:18,750 Así que para que funcione con GDB, para iniciar la depuración 27 00:01:18,750 --> 00:01:21,220 de un proceso particular, programa, todo lo que necesita hacer 28 00:01:21,220 --> 00:01:23,810 se escriba GDB seguido por el nombre del programa. 29 00:01:23,810 --> 00:01:28,620 Así, por ejemplo, si su programa es hola, escribiría GDB hola. 30 00:01:28,620 --> 00:01:31,210 >> Cuando haces eso, vas para levantar el entorno GDB. 31 00:01:31,210 --> 00:01:33,800 Su pronta va a cambiar, y en lugar de ser lo que por lo general 32 00:01:33,800 --> 00:01:35,841 es cuando se escribe cosas en ls line-- comando, 33 00:01:35,841 --> 00:01:38,115 cd-- toda su típica Comandos de Linux, el indicador 34 00:01:38,115 --> 00:01:42,200 cambiará a, probablemente, algo como paréntesis GDB paréntesis. 35 00:01:42,200 --> 00:01:46,630 Ese es tu nuevo indicador GDB, porque estás dentro del entorno del BGF. 36 00:01:46,630 --> 00:01:49,830 Una vez dentro de ese entorno, hay dos principales comandos 37 00:01:49,830 --> 00:01:52,290 que es probable que utilice en el siguiente orden. 38 00:01:52,290 --> 00:01:55,200 >> La primera es b, que es la abreviatura de descanso. 39 00:01:55,200 --> 00:01:58,690 Y después de escribir b, normalmente escriba el nombre de una función, 40 00:01:58,690 --> 00:02:01,040 o si por casualidad usted conoce todo lo que el número de línea 41 00:02:01,040 --> 00:02:04,100 el programa está empezando a comportarse un poco raro, 42 00:02:04,100 --> 00:02:06,370 puede escribir una línea número de allí también. 43 00:02:06,370 --> 00:02:09,660 Lo que b, o ruptura, hace es que le permite a su programa 44 00:02:09,660 --> 00:02:13,270 para funcionar hasta un cierto punto, a saber, el nombre de la función 45 00:02:13,270 --> 00:02:15,880 que especifique o la línea número que usted especifique. 46 00:02:15,880 --> 00:02:18,590 >> Y en ese punto, congelará ejecución. 47 00:02:18,590 --> 00:02:21,670 Esta es una muy buena cosa, porque una vez que la ejecución se ha congelado, 48 00:02:21,670 --> 00:02:25,214 usted puede comenzar a muy lentamente paso a través de su programa. 49 00:02:25,214 --> 00:02:28,130 Normalmente, si has estado corriendo sus programas, que son bastante corto. 50 00:02:28,130 --> 00:02:31,250 Por lo general, se escribe slash dot lo el nombre de su programa, pulse Enter, 51 00:02:31,250 --> 00:02:33,470 y antes de que pueda parpadear, su programa ya ha terminado. 52 00:02:33,470 --> 00:02:36,620 En realidad no es un montón de tiempo para probar y averiguar lo que está pasando mal. 53 00:02:36,620 --> 00:02:40,920 Así que realmente sea capaz de frenar las cosas por el establecimiento de un punto de ruptura con b, 54 00:02:40,920 --> 00:02:43,040 y luego intervenir. 55 00:02:43,040 --> 00:02:46,169 >> Luego, una vez que haya definido su ruptura punto, usted puede ejecutar el programa. 56 00:02:46,169 --> 00:02:47,960 Y si usted tiene cualquiera argumentos de la línea de comandos, 57 00:02:47,960 --> 00:02:51,610 que especifique aquí, no cuando escribe GDB su nombre del programa. 58 00:02:51,610 --> 00:02:55,980 Se especifica toda la línea de comandos argumentos tomando r, o correr, 59 00:02:55,980 --> 00:03:00,270 y luego los argumentos de línea de comandos lo que sea que necesita dentro de su programa. 60 00:03:00,270 --> 00:03:03,510 Hay un número de otros realmente comandos importantes y útiles 61 00:03:03,510 --> 00:03:04,970 dentro del ambiente del PIB. 62 00:03:04,970 --> 00:03:07,540 Así que permítanme rápidamente repasar algunos de ellos. 63 00:03:07,540 --> 00:03:11,320 >> El primero es N, que es la abreviatura para el próximo, y usted puede escribir al lado en lugar de n, 64 00:03:11,320 --> 00:03:12,304 tanto funcionaría. 65 00:03:12,304 --> 00:03:13,470 Y es sólo la taquigrafía. 66 00:03:13,470 --> 00:03:17,540 Y como usted probablemente ya habrá llegado utilizado para, de ser capaz de escribir cosas 67 00:03:17,540 --> 00:03:20,520 más corto es generalmente mejor. 68 00:03:20,520 --> 00:03:24,100 Y lo que va a hacer es que va a un paso adelante de un bloque de código. 69 00:03:24,100 --> 00:03:26,170 Así que va a seguir adelante hasta que una llamada a la función. 70 00:03:26,170 --> 00:03:28,350 Y entonces en lugar de zambullirse en esa función 71 00:03:28,350 --> 00:03:33,130 y pasando por todos que las funciones código, sólo tendrá la función. 72 00:03:33,130 --> 00:03:34,400 >> La función será llamada. 73 00:03:34,400 --> 00:03:35,733 Se hará lo que su labor es. 74 00:03:35,733 --> 00:03:38,870 Se devolverá un valor de la función que la llamó. 75 00:03:38,870 --> 00:03:42,490 Y entonces podrás pasar a la siguiente línea de esa función que llama. 76 00:03:42,490 --> 00:03:44,555 Si quieres dar un paso dentro de la función, 77 00:03:44,555 --> 00:03:46,430 en lugar de sólo tener se ejecuta, especialmente 78 00:03:46,430 --> 00:03:50,004 si usted piensa que el problema podría estar dentro de esa función, 79 00:03:50,004 --> 00:03:52,670 usted podría, por supuesto, establecer una ruptura punto dentro de esa función. 80 00:03:52,670 --> 00:03:57,820 O si ya se está ejecutando, puede utilice s para avanzar una línea de código. 81 00:03:57,820 --> 00:04:01,170 >> Así que esto va a intervenir y sumergirse en funciones, 82 00:04:01,170 --> 00:04:04,750 en lugar de sólo tener la execute y continuando en la función de 83 00:04:04,750 --> 00:04:07,380 que usted se encontrará con la depuración. 84 00:04:07,380 --> 00:04:09,870 Si alguna vez quieres saber el valor de una variable, 85 00:04:09,870 --> 00:04:12,507 puede escribir p, o impresión, y luego el nombre de la variable. 86 00:04:12,507 --> 00:04:15,090 Y eso va a imprimir a usted, dentro del entorno del BGF, 87 00:04:15,090 --> 00:04:19,110 el nombre de la variable, que usted-- excusar mí-- el valor de la variable 88 00:04:19,110 --> 00:04:20,064 que usted ha nombrado. 89 00:04:20,064 --> 00:04:23,230 Si desea conocer los valores de todos los variable local accesible desde donde 90 00:04:23,230 --> 00:04:25,970 se encuentra actualmente en su programa, puede escribir información lugareños. 91 00:04:25,970 --> 00:04:28,332 Es mucho más rápido que tecleando p y luego lo que sea, 92 00:04:28,332 --> 00:04:30,540 lista a cabo todas las las variables que sabe que existen. 93 00:04:30,540 --> 00:04:34,370 Puede escribir información locales, y imprimirá todo para usted. 94 00:04:34,370 --> 00:04:37,770 El siguiente es bt, que es abreviatura de Volver Trace. 95 00:04:37,770 --> 00:04:41,680 Ahora, en general, especialmente temprano en CS50, 96 00:04:41,680 --> 00:04:44,450 no realmente tendrá ocasión utilizar bt, o Back Trace, 97 00:04:44,450 --> 00:04:47,860 porque no está teniendo funciones que llaman a otras funciones. 98 00:04:47,860 --> 00:04:50,450 >> Es posible que tenga una llamada principal función, pero eso es probablemente la misma. 99 00:04:50,450 --> 00:04:53,199 Usted no tiene que otra función llamar a otra función, que 100 00:04:53,199 --> 00:04:54,880 llama a otra función, y así sucesivamente. 101 00:04:54,880 --> 00:04:57,550 Pero a medida que los programas se vuelven más compleja, y en particular 102 00:04:57,550 --> 00:05:00,290 cuando se empieza a trabajar con recursividad, rastreo 103 00:05:00,290 --> 00:05:05,150 puede ser una manera muy útil para permitirle tipo de conseguir un poco de contexto para donde 104 00:05:05,150 --> 00:05:06,460 Yo estoy en mi programa. 105 00:05:06,460 --> 00:05:10,590 Así que dices que has escrito el código, y usted sabe que la principal llama a una función 106 00:05:10,590 --> 00:05:14,720 f, que llama a una función g, que llama a una función h. 107 00:05:14,720 --> 00:05:17,650 Así que tenemos varias capas de anidación ocurre aquí. 108 00:05:17,650 --> 00:05:19,440 >> Si estás dentro de su entorno de GDB, 109 00:05:19,440 --> 00:05:21,640 y usted sabe que su interior de h, pero se olvida 110 00:05:21,640 --> 00:05:27,210 acerca de lo que llegó a donde trate: puede escribir bt o rastreo, 111 00:05:27,210 --> 00:05:32,370 y se imprimirá h, g, f principal, junto con alguna otra información, que 112 00:05:32,370 --> 00:05:35,984 te da una pista de que, OK principal llamado f, f llamado g, g llama h, 113 00:05:35,984 --> 00:05:37,900 y ahí es donde yo Actualmente estoy en mi programa. 114 00:05:37,900 --> 00:05:41,380 Así que puede ser realmente útil, sobre todo porque el críptico-dad de GDB 115 00:05:41,380 --> 00:05:45,667 se convierte en un poco abrumadora, a saber exactamente dónde están las cosas. 116 00:05:45,667 --> 00:05:48,500 Por último, cuando se lleva a cabo el programa, o cuando haya terminado depurarlo 117 00:05:48,500 --> 00:05:50,125 y quiere alejarse desde el entorno de GDB, 118 00:05:50,125 --> 00:05:51,940 ayuda a saber cómo salir de ella. 119 00:05:51,940 --> 00:05:55,500 Puede escribir q, o Salir, salir. 120 00:05:55,500 --> 00:05:59,220 Ahora, antes de vídeo de hoy Preparé un programa con errores 121 00:05:59,220 --> 00:06:03,900 llamada buggy1, que compilé desde un archivo conocido como buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Como era de esperar, este programa es, de hecho, con errores. 123 00:06:06,500 --> 00:06:08,990 Algo va mal cuando intento ejecutarlo. 124 00:06:08,990 --> 00:06:13,014 Ahora, por desgracia, sin darme cuenta eliminado mi archivo buggy1.c, 125 00:06:13,014 --> 00:06:15,930 así que para mí averiguar ¿qué está pasando mal con este programa, 126 00:06:15,930 --> 00:06:18,770 Voy a tener que usar GDB tipo de ciegas, tratando 127 00:06:18,770 --> 00:06:22,372 para navegar a través de este programa para averiguar exactamente lo que va mal. 128 00:06:22,372 --> 00:06:24,580 Pero usando sólo las herramientas que ya hemos aprendido sobre, 129 00:06:24,580 --> 00:06:27,700 podemos más o menos la figura exactamente lo que es. 130 00:06:27,700 --> 00:06:30,740 Así que vayamos a CS50 IDE y echar un vistazo. 131 00:06:30,740 --> 00:06:33,155 OK, así que estamos aquí en mi CS50 entorno IDE, 132 00:06:33,155 --> 00:06:35,697 y voy a zoom en un poco para que pueda ver un poco más. 133 00:06:35,697 --> 00:06:38,530 En la ventana de mi terminal, si enumero el contenido de mi actual director 134 00:06:38,530 --> 00:06:41,250 con ls, veremos que tener un par de archivos de código fuente 135 00:06:41,250 --> 00:06:44,982 aquí, incluyendo el buggy1 discutido previamente. 136 00:06:44,982 --> 00:06:46,940 Lo que sucede exactamente cuando Trato de correr buggy1. 137 00:06:46,940 --> 00:06:47,773 Bueno vamos a averiguar. 138 00:06:47,773 --> 00:06:52,510 Escribo barra de punto, con errores, y me golpearon Intro. 139 00:06:52,510 --> 00:06:53,670 >> Fallos de segmentación. 140 00:06:53,670 --> 00:06:55,000 Eso no es bueno. 141 00:06:55,000 --> 00:06:57,180 Si usted recuerda, una fallo de segmentación normalmente 142 00:06:57,180 --> 00:07:01,540 ocurre cuando se accede a la memoria que no se nos permite tocar. 143 00:07:01,540 --> 00:07:03,820 Hemos llegado de alguna manera fuera de los límites 144 00:07:03,820 --> 00:07:05,995 de lo que el programa, el compilador, nos ha dado. 145 00:07:05,995 --> 00:07:08,310 Y así, ya que es una clave a tener en la caja de herramientas 146 00:07:08,310 --> 00:07:10,660 al comenzar el proceso de depuración. 147 00:07:10,660 --> 00:07:13,620 Algo ha ido un poco mal aquí. 148 00:07:13,620 --> 00:07:15,935 >> Muy bien, así que vamos a empezar el entorno de GDB 149 00:07:15,935 --> 00:07:19,030 y ver si podemos averiguar ¿qué es exactamente el problema. 150 00:07:19,030 --> 00:07:21,674 Voy a limpiar mi pantalla, y yo voy a escribir BGF 151 00:07:21,674 --> 00:07:24,340 de nuevo, para entrar en el entorno del BGF, y el nombre del programa 152 00:07:24,340 --> 00:07:27,450 que quiero depurar, buggy1. 153 00:07:27,450 --> 00:07:30,182 Tenemos un pequeño mensaje, leyendo símbolos de buggy1, hacer. 154 00:07:30,182 --> 00:07:32,390 Todo lo que significa es que sacó juntos todo el código, 155 00:07:32,390 --> 00:07:35,570 y ahora que ha sido cargado en GDB, y está listo para ir. 156 00:07:35,570 --> 00:07:37,140 >> Ahora, ¿qué es lo que quiero hacer? 157 00:07:37,140 --> 00:07:39,130 ¿Recuerda lo que el primera etapa es típicamente 158 00:07:39,130 --> 00:07:42,540 después de que yo estoy dentro de este ambiente? 159 00:07:42,540 --> 00:07:44,540 Esperemos que dicho conjunto un punto de quiebre, porque 160 00:07:44,540 --> 00:07:46,240 de hecho, eso es lo que quiero hacer. 161 00:07:46,240 --> 00:07:47,990 Ahora, yo no tengo la código fuente de este 162 00:07:47,990 --> 00:07:50,948 frente a mí, que es, probablemente, no es el caso de uso típico, por cierto. 163 00:07:50,948 --> 00:07:52,055 Usted probablemente lo hará. 164 00:07:52,055 --> 00:07:52,680 Así que eso es bueno. 165 00:07:52,680 --> 00:07:55,790 Pero suponiendo que no, lo que es la función que usted sabe 166 00:07:55,790 --> 00:07:58,880 existe en cada programa de C sola? 167 00:07:58,880 --> 00:08:04,420 No importa cuán grande o complicado que es, esta función sin duda existe. 168 00:08:04,420 --> 00:08:05,440 Principal, ¿no? 169 00:08:05,440 --> 00:08:08,870 >> Así que todo lo demás en su defecto, que puede establecer un punto de quiebre en el principal. 170 00:08:08,870 --> 00:08:12,200 Y de nuevo, yo sólo pude escribir romper principal, en lugar de b. 171 00:08:12,200 --> 00:08:14,650 Y si usted es curioso, si nunca escriba un comando largo 172 00:08:14,650 --> 00:08:16,800 y luego darse cuenta de que escrito las cosas mal, 173 00:08:16,800 --> 00:08:18,770 y quiere deshacerse todo lo que acabo de hacer, 174 00:08:18,770 --> 00:08:22,029 usted puede tomar control de U, que va borrar todo y traer de vuelta 175 00:08:22,029 --> 00:08:23,570 al principio de las líneas de cursor. 176 00:08:23,570 --> 00:08:26,569 Mucho más rápido que simplemente mantenga pulsada la eliminar o golpeándola a veces manojo 177 00:08:26,569 --> 00:08:27,080 encima. 178 00:08:27,080 --> 00:08:28,740 >> Así que vamos a establecer un punto de quiebre en el principal. 179 00:08:28,740 --> 00:08:32,970 Y como se puede ver, se dice que hemos establecer un punto de quiebre en el archivo buggy1.c, 180 00:08:32,970 --> 00:08:36,330 y al parecer la primera línea del código del principal es la línea de siete. 181 00:08:36,330 --> 00:08:38,080 Una vez más, no tenemos el archivo de origen aquí, 182 00:08:38,080 --> 00:08:40,429 pero voy a suponer que se trata de decirme la verdad. 183 00:08:40,429 --> 00:08:44,510 Y entonces, sólo estoy tratando y ejecutar 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 Muy bien, por lo que este mensaje es un poco críptico. 186 00:08:48,160 --> 00:08:50,160 Pero básicamente lo que hay pasando aquí es que es sólo 187 00:08:50,160 --> 00:08:53,350 diciéndome que he golpeado mi descanso punto, romper el punto número 1. 188 00:08:53,350 --> 00:08:55,877 >> Y luego, esa línea de código, El fichero o directorio no existe. 189 00:08:55,877 --> 00:08:57,710 La única razón por la que Estoy viendo ese mensaje 190 00:08:57,710 --> 00:09:00,800 es porque sin darme cuenta eliminado mi archivo buggy.c. 191 00:09:00,800 --> 00:09:04,050 Si existía mi archivo buggy1.c en el directorio actual, 192 00:09:04,050 --> 00:09:06,920 ese derecho línea hay realmente haría dime lo que la línea de código 193 00:09:06,920 --> 00:09:08,214 literalmente lee. 194 00:09:08,214 --> 00:09:09,380 Por desgracia, yo borré. 195 00:09:09,380 --> 00:09:14,790 Vamos a tener que tipo de navegar a través de este un poco más a ciegas. 196 00:09:14,790 --> 00:09:17,330 >> OK, así que vamos a ver, ¿qué Qué quiero hacer aquí? 197 00:09:17,330 --> 00:09:21,770 Bueno, me gustaría saber qué locales variables que quizá están disponibles para mí. 198 00:09:21,770 --> 00:09:23,570 He comenzado mi programa. 199 00:09:23,570 --> 00:09:28,515 Vamos a ver lo que podría ser ya inicializado para nosotros. 200 00:09:28,515 --> 00:09:31,430 Escribo Info lugareños, no hay gente. 201 00:09:31,430 --> 00:09:33,960 Muy bien, así que no lo hace me da un montón de información. 202 00:09:33,960 --> 00:09:37,600 Yo podría tratar de imprimir una variable, pero yo no conozco a ningún nombre de las variables. 203 00:09:37,600 --> 00:09:39,930 Podría intentar un rastreo, pero yo estoy dentro de la principal, 204 00:09:39,930 --> 00:09:43,710 así que sé que no he hecho otra llamada a la función en este momento. 205 00:09:43,710 --> 00:09:47,710 >> Así que parece que mis únicas opciones son utilizar n o así y empezar a bucear en. 206 00:09:47,710 --> 00:09:49,630 Voy a utilizar n. 207 00:09:49,630 --> 00:09:51,180 Así que escribo n. 208 00:09:51,180 --> 00:09:53,060 Oh, Dios mío, ¿qué está pasando aquí. 209 00:09:53,060 --> 00:09:56,260 Programa de las señales recibidas, SIGSEGV error de segmentación, 210 00:09:56,260 --> 00:09:57,880 y luego un montón de cosas. 211 00:09:57,880 --> 00:09:58,880 Ya estoy abrumado. 212 00:09:58,880 --> 00:10:00,980 Bueno, en realidad hay una mucho que aprender aquí. 213 00:10:00,980 --> 00:10:02,520 ¿Entonces qué nos dice esto? 214 00:10:02,520 --> 00:10:09,180 Lo que nos dice es que este programa es a punto, pero no tiene, sin embargo, culpa seg. 215 00:10:09,180 --> 00:10:12,550 Y en particular, voy para acercar aún más aquí, 216 00:10:12,550 --> 00:10:18,980 está a punto de SEG culpa acerca algo llamado strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Ahora, puede que no hayamos discutido esta función extensivamente. 218 00:10:22,705 --> 00:10:25,580 Pero es-- porque no vamos para hablar de todas las funciones que 219 00:10:25,580 --> 00:10:28,610 existe en el estándar C library-- pero todos están disponibles para usted, 220 00:10:28,610 --> 00:10:32,110 sobre todo si se toma un mira reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Y strcmp es un muy potente función que existe en el interior 222 00:10:35,000 --> 00:10:38,070 de la cabecera string.h archivo, que es una cabecera 223 00:10:38,070 --> 00:10:41,970 archivo que se dedica a funciones que trabajan con y manipular cadenas. 224 00:10:41,970 --> 00:10:49,830 >> Y, en particular, lo que hace es strcmp compara los valores de dos cadenas. 225 00:10:49,830 --> 00:10:54,160 Así que estoy a punto de segmentación culpa en una llamada a strcmp parece. 226 00:10:54,160 --> 00:10:58,530 Golpeé n, y de hecho me sale el mensaje, programa terminó con SIGSEGV de señal 227 00:10:58,530 --> 00:11:01,370 Fallo de segmentación. Y ahora De hecho, me he criticado seg, 228 00:11:01,370 --> 00:11:06,479 y mi programa tiene bastante mucho más efectivamente renunciado. 229 00:11:06,479 --> 00:11:07,770 Este es el final del programa. 230 00:11:07,770 --> 00:11:10,370 Se vino abajo, se estrelló. 231 00:11:10,370 --> 00:11:14,740 Así que no era mucho, pero yo en realidad lo hizo aprender un poco 232 00:11:14,740 --> 00:11:16,747 de esta poca experiencia. 233 00:11:16,747 --> 00:11:17,580 ¿Qué he aprendido? 234 00:11:17,580 --> 00:11:22,020 Bueno, mi programa se bloquea casi de inmediato. 235 00:11:22,020 --> 00:11:26,300 Mi programa se bloquea en Una llamada a strcmp, pero yo 236 00:11:26,300 --> 00:11:30,560 no tienen ningún variables locales en mi programa en el momento que se estrella. 237 00:11:30,560 --> 00:11:37,320 Entonces, ¿qué cadena o cadenas, podría yo estar comparando. 238 00:11:37,320 --> 00:11:42,140 Si yo no tengo ningún locales las variables, es posible que 239 00:11:42,140 --> 00:11:45,520 Conjeturo que tener-- puede haber es un variable global, que podría ser verdad. 240 00:11:45,520 --> 00:11:47,670 >> Pero, en general, parece como que estoy comparando 241 00:11:47,670 --> 00:11:52,070 a algo que no existe. 242 00:11:52,070 --> 00:11:54,130 Así que vamos a investigar que un poco más allá. 243 00:11:54,130 --> 00:11:55,120 Así que me voy a limpiar mi pantalla. 244 00:11:55,120 --> 00:11:57,536 Voy a dejar fuera de la Entorno GDB por un segundo. 245 00:11:57,536 --> 00:12:01,300 Y estoy pensando, bien, así que no no hay variables locales en mi programa. 246 00:12:01,300 --> 00:12:06,444 Me pregunto si tal vez se supone que debo pasar en una cadena como un argumento de línea de comandos. 247 00:12:06,444 --> 00:12:07,610 Así que vamos a probar esto. 248 00:12:07,610 --> 00:12:09,020 No he hecho esto antes. 249 00:12:09,020 --> 00:12:14,244 >> Vamos a ver si tal vez si ejecuto este programa con un argumento de línea de comandos que funciona. 250 00:12:14,244 --> 00:12:16,140 Eh, no hay fallo de segmentación allí. 251 00:12:16,140 --> 00:12:17,870 Se me acaba de decir que lo he descubierto. 252 00:12:17,870 --> 00:12:19,170 Así que tal vez esa es la solución aquí. 253 00:12:19,170 --> 00:12:27,560 Y de hecho, si me voy atrás y mirar el código fuente real para buggy1.c, 254 00:12:27,560 --> 00:12:31,180 parece como si lo que estoy haciendo es Estoy haciendo una llamada a strcmp sin 255 00:12:31,180 --> 00:12:34,010 comprobar si, de hecho, argv [1] existe. 256 00:12:34,010 --> 00:12:36,730 Esto es en realidad la código fuente para buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Así que lo que realmente necesito hacer aquí para arreglar mi programa, 258 00:12:38,855 --> 00:12:40,835 suponiendo que tengo el presentar en frente de mí, es 259 00:12:40,835 --> 00:12:44,740 simplemente añadir un cheque para hacer asegurarse de que argc es igual a 2. 260 00:12:44,740 --> 00:12:47,780 Así que este ejemplo, una vez más, como he dicho, es un poco artificial, ¿verdad? 261 00:12:47,780 --> 00:12:49,840 En general, usted no va a borrar accidentalmente su código fuente 262 00:12:49,840 --> 00:12:51,820 y luego tener que tratar y depurar el programa. 263 00:12:51,820 --> 00:12:53,120 Pero es de esperar, se lo dio que una ilustración 264 00:12:53,120 --> 00:12:55,120 de los tipos de cosas que usted podría estar pensando en 265 00:12:55,120 --> 00:12:56,610 como usted está depurar su programa. 266 00:12:56,610 --> 00:12:58,760 >> ¿Cuál es el estado de cosas aquí? 267 00:12:58,760 --> 00:13:00,510 ¿Qué variables hacer yo tener acceso a mi? 268 00:13:00,510 --> 00:13:03,600 ¿Dónde exactamente es mi programa estrellarse, en qué línea, 269 00:13:03,600 --> 00:13:05,240 en lo llamado a qué función? 270 00:13:05,240 --> 00:13:06,952 ¿Qué tipo de pistas ¿eso me dan? 271 00:13:06,952 --> 00:13:08,910 Y eso es exactamente lo tipo de mentalidad que 272 00:13:08,910 --> 00:13:12,820 debe entrar en cuando estás pensando en la depuración de los programas. 273 00:13:12,820 --> 00:13:13,820 >> Soy Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Esto es CS50. 275 00:13:16,140 --> 00:15:08,642