DOUG LLOYD: Muy bien GDB. ¿Qué es exactamente? Así GDB, que significa para el depurador de GNU, es una herramienta muy impresionante que podemos utilizar para ayudarnos a depurar nuestros programas, o averiguar dónde están las cosas que va mal en nuestros programas. BGF es increíblemente poderosa, pero la salida y la interacción con ella puede ser un poco críptico. Por lo general es una herramienta de línea de comandos, y puede lanzar una gran cantidad de mensajes a usted. Y puede un poco difícil analizar exactamente lo que está pasando. Pasos Afortunadamente, nos hemos tomado para solucionar este problema para usted a medida que trabaja a través CS50. Si usted no está utilizando la gráfica depurador, que mi colega Dan Armandarse ha hablado bastante un poco acerca de un vídeo que debe ser por aquí en este momento, es posible que necesite utilizar estos línea de comandos herramientas para trabajar con GDB. Si está trabajando en el CS50 IDE, no es necesario hacer esto. Pero si no estás trabajando en el CS50 IDE, tal vez utilizando una versión de CS50 Appliance, u otro operativo Linux sistema con GDB instalado en él, puede que tenga que utilizar estas herramientas de línea de comandos. Y ya que usted podría tiene que ver eso, es útil sólo para entender cómo GDB funciona desde la línea de comandos. Pero, de nuevo, si usted es utilizando el IDE CS50, que puede utilizar el depurador gráfico que está integrado en el IDE. Así que para que funcione con GDB, para iniciar la depuración de un proceso particular, programa, todo lo que necesita hacer se escriba GDB seguido por el nombre del programa. Así, por ejemplo, si su programa es hola, escribiría GDB hola. Cuando haces eso, vas para levantar el entorno GDB. Su pronta va a cambiar, y en lugar de ser lo que por lo general es cuando se escribe cosas en ls line-- comando, cd-- toda su típica Comandos de Linux, el indicador cambiará a, probablemente, algo como paréntesis GDB paréntesis. Ese es tu nuevo indicador GDB, porque estás dentro del entorno del BGF. Una vez dentro de ese entorno, hay dos principales comandos que es probable que utilice en el siguiente orden. La primera es b, que es la abreviatura de descanso. Y después de escribir b, normalmente escriba el nombre de una función, o si por casualidad usted conoce todo lo que el número de línea el programa está empezando a comportarse un poco raro, puede escribir una línea número de allí también. Lo que b, o ruptura, hace es que le permite a su programa para funcionar hasta un cierto punto, a saber, el nombre de la función que especifique o la línea número que usted especifique. Y en ese punto, congelará ejecución. Esta es una muy buena cosa, porque una vez que la ejecución se ha congelado, usted puede comenzar a muy lentamente paso a través de su programa. Normalmente, si has estado corriendo sus programas, que son bastante corto. Por lo general, se escribe slash dot lo el nombre de su programa, pulse Enter, y antes de que pueda parpadear, su programa ya ha terminado. En realidad no es un montón de tiempo para probar y averiguar lo que está pasando mal. Así que realmente sea capaz de frenar las cosas por el establecimiento de un punto de ruptura con b, y luego intervenir. Luego, una vez que haya definido su ruptura punto, usted puede ejecutar el programa. Y si usted tiene cualquiera argumentos de la línea de comandos, que especifique aquí, no cuando escribe GDB su nombre del programa. Se especifica toda la línea de comandos argumentos tomando r, o correr, y luego los argumentos de línea de comandos lo que sea que necesita dentro de su programa. Hay un número de otros realmente comandos importantes y útiles dentro del ambiente del PIB. Así que permítanme rápidamente repasar algunos de ellos. El primero es N, que es la abreviatura para el próximo, y usted puede escribir al lado en lugar de n, tanto funcionaría. Y es sólo la taquigrafía. Y como usted probablemente ya habrá llegado utilizado para, de ser capaz de escribir cosas más corto es generalmente mejor. Y lo que va a hacer es que va a un paso adelante de un bloque de código. Así que va a seguir adelante hasta que una llamada a la función. Y entonces en lugar de zambullirse en esa función y pasando por todos que las funciones código, sólo tendrá la función. La función será llamada. Se hará lo que su labor es. Se devolverá un valor de la función que la llamó. Y entonces podrás pasar a la siguiente línea de esa función que llama. Si quieres dar un paso dentro de la función, en lugar de sólo tener se ejecuta, especialmente si usted piensa que el problema podría estar dentro de esa función, usted podría, por supuesto, establecer una ruptura punto dentro de esa función. O si ya se está ejecutando, puede utilice s para avanzar una línea de código. Así que esto va a intervenir y sumergirse en funciones, en lugar de sólo tener la execute y continuando en la función de que usted se encontrará con la depuración. Si alguna vez quieres saber el valor de una variable, puede escribir p, o impresión, y luego el nombre de la variable. Y eso va a imprimir a usted, dentro del entorno del BGF, el nombre de la variable, que usted-- excusar mí-- el valor de la variable que usted ha nombrado. Si desea conocer los valores de todos los variable local accesible desde donde se encuentra actualmente en su programa, puede escribir información lugareños. Es mucho más rápido que tecleando p y luego lo que sea, lista a cabo todas las las variables que sabe que existen. Puede escribir información locales, y imprimirá todo para usted. El siguiente es bt, que es abreviatura de Volver Trace. Ahora, en general, especialmente temprano en CS50, no realmente tendrá ocasión utilizar bt, o Back Trace, porque no está teniendo funciones que llaman a otras funciones. Es posible que tenga una llamada principal función, pero eso es probablemente la misma. Usted no tiene que otra función llamar a otra función, que llama a otra función, y así sucesivamente. Pero a medida que los programas se vuelven más compleja, y en particular cuando se empieza a trabajar con recursividad, rastreo puede ser una manera muy útil para permitirle tipo de conseguir un poco de contexto para donde Yo estoy en mi programa. Así que dices que has escrito el código, y usted sabe que la principal llama a una función f, que llama a una función g, que llama a una función h. Así que tenemos varias capas de anidación ocurre aquí. Si estás dentro de su entorno de GDB, y usted sabe que su interior de h, pero se olvida acerca de lo que llegó a donde trate: puede escribir bt o rastreo, y se imprimirá h, g, f principal, junto con alguna otra información, que te da una pista de que, OK principal llamado f, f llamado g, g llama h, y ahí es donde yo Actualmente estoy en mi programa. Así que puede ser realmente útil, sobre todo porque el críptico-dad de GDB se convierte en un poco abrumadora, a saber exactamente dónde están las cosas. Por último, cuando se lleva a cabo el programa, o cuando haya terminado depurarlo y quiere alejarse desde el entorno de GDB, ayuda a saber cómo salir de ella. Puede escribir q, o Salir, salir. Ahora, antes de vídeo de hoy Preparé un programa con errores llamada buggy1, que compilé desde un archivo conocido como buggy1.c. Como era de esperar, este programa es, de hecho, con errores. Algo va mal cuando intento ejecutarlo. Ahora, por desgracia, sin darme cuenta eliminado mi archivo buggy1.c, así que para mí averiguar ¿qué está pasando mal con este programa, Voy a tener que usar GDB tipo de ciegas, tratando para navegar a través de este programa para averiguar exactamente lo que va mal. Pero usando sólo las herramientas que ya hemos aprendido sobre, podemos más o menos la figura exactamente lo que es. Así que vayamos a CS50 IDE y echar un vistazo. OK, así que estamos aquí en mi CS50 entorno IDE, y voy a zoom en un poco para que pueda ver un poco más. En la ventana de mi terminal, si enumero el contenido de mi actual director con ls, veremos que tener un par de archivos de código fuente aquí, incluyendo el buggy1 discutido previamente. Lo que sucede exactamente cuando Trato de correr buggy1. Bueno vamos a averiguar. Escribo barra de punto, con errores, y me golpearon Intro. Fallos de segmentación. Eso no es bueno. Si usted recuerda, una fallo de segmentación normalmente ocurre cuando se accede a la memoria que no se nos permite tocar. Hemos llegado de alguna manera fuera de los límites de lo que el programa, el compilador, nos ha dado. Y así, ya que es una clave a tener en la caja de herramientas al comenzar el proceso de depuración. Algo ha ido un poco mal aquí. Muy bien, así que vamos a empezar el entorno de GDB y ver si podemos averiguar ¿qué es exactamente el problema. Voy a limpiar mi pantalla, y yo voy a escribir BGF de nuevo, para entrar en el entorno del BGF, y el nombre del programa que quiero depurar, buggy1. Tenemos un pequeño mensaje, leyendo símbolos de buggy1, hacer. Todo lo que significa es que sacó juntos todo el código, y ahora que ha sido cargado en GDB, y está listo para ir. Ahora, ¿qué es lo que quiero hacer? ¿Recuerda lo que el primera etapa es típicamente después de que yo estoy dentro de este ambiente? Esperemos que dicho conjunto un punto de quiebre, porque de hecho, eso es lo que quiero hacer. Ahora, yo no tengo la código fuente de este frente a mí, que es, probablemente, no es el caso de uso típico, por cierto. Usted probablemente lo hará. Así que eso es bueno. Pero suponiendo que no, lo que es la función que usted sabe existe en cada programa de C sola? No importa cuán grande o complicado que es, esta función sin duda existe. Principal, ¿no? Así que todo lo demás en su defecto, que puede establecer un punto de quiebre en el principal. Y de nuevo, yo sólo pude escribir romper principal, en lugar de b. Y si usted es curioso, si nunca escriba un comando largo y luego darse cuenta de que escrito las cosas mal, y quiere deshacerse todo lo que acabo de hacer, usted puede tomar control de U, que va borrar todo y traer de vuelta al principio de las líneas de cursor. Mucho más rápido que simplemente mantenga pulsada la eliminar o golpeándola a veces manojo encima. Así que vamos a establecer un punto de quiebre en el principal. Y como se puede ver, se dice que hemos establecer un punto de quiebre en el archivo buggy1.c, y al parecer la primera línea del código del principal es la línea de siete. Una vez más, no tenemos el archivo de origen aquí, pero voy a suponer que se trata de decirme la verdad. Y entonces, sólo estoy tratando y ejecutar el programa, r. A partir del programa. Muy bien, por lo que este mensaje es un poco críptico. Pero básicamente lo que hay pasando aquí es que es sólo diciéndome que he golpeado mi descanso punto, romper el punto número 1. Y luego, esa línea de código, El fichero o directorio no existe. La única razón por la que Estoy viendo ese mensaje es porque sin darme cuenta eliminado mi archivo buggy.c. Si existía mi archivo buggy1.c en el directorio actual, ese derecho línea hay realmente haría dime lo que la línea de código literalmente lee. Por desgracia, yo borré. Vamos a tener que tipo de navegar a través de este un poco más a ciegas. OK, así que vamos a ver, ¿qué Qué quiero hacer aquí? Bueno, me gustaría saber qué locales variables que quizá están disponibles para mí. He comenzado mi programa. Vamos a ver lo que podría ser ya inicializado para nosotros. Escribo Info lugareños, no hay gente. Muy bien, así que no lo hace me da un montón de información. Yo podría tratar de imprimir una variable, pero yo no conozco a ningún nombre de las variables. Podría intentar un rastreo, pero yo estoy dentro de la principal, así que sé que no he hecho otra llamada a la función en este momento. Así que parece que mis únicas opciones son utilizar n o así y empezar a bucear en. Voy a utilizar n. Así que escribo n. Oh, Dios mío, ¿qué está pasando aquí. Programa de las señales recibidas, SIGSEGV error de segmentación, y luego un montón de cosas. Ya estoy abrumado. Bueno, en realidad hay una mucho que aprender aquí. ¿Entonces qué nos dice esto? Lo que nos dice es que este programa es a punto, pero no tiene, sin embargo, culpa seg. Y en particular, voy para acercar aún más aquí, está a punto de SEG culpa acerca algo llamado strcmp. Ahora, puede que no hayamos discutido esta función extensivamente. Pero es-- porque no vamos para hablar de todas las funciones que existe en el estándar C library-- pero todos están disponibles para usted, sobre todo si se toma un mira reference.cs50.net. Y strcmp es un muy potente función que existe en el interior de la cabecera string.h archivo, que es una cabecera archivo que se dedica a funciones que trabajan con y manipular cadenas. Y, en particular, lo que hace es strcmp compara los valores de dos cadenas. Así que estoy a punto de segmentación culpa en una llamada a strcmp parece. Golpeé n, y de hecho me sale el mensaje, programa terminó con SIGSEGV de señal Fallo de segmentación. Y ahora De hecho, me he criticado seg, y mi programa tiene bastante mucho más efectivamente renunciado. Este es el final del programa. Se vino abajo, se estrelló. Así que no era mucho, pero yo en realidad lo hizo aprender un poco de esta poca experiencia. ¿Qué he aprendido? Bueno, mi programa se bloquea casi de inmediato. Mi programa se bloquea en Una llamada a strcmp, pero yo no tienen ningún variables locales en mi programa en el momento que se estrella. Entonces, ¿qué cadena o cadenas, podría yo estar comparando. Si yo no tengo ningún locales las variables, es posible que Conjeturo que tener-- puede haber es un variable global, que podría ser verdad. Pero, en general, parece como que estoy comparando a algo que no existe. Así que vamos a investigar que un poco más allá. Así que me voy a limpiar mi pantalla. Voy a dejar fuera de la Entorno GDB por un segundo. Y estoy pensando, bien, así que no no hay variables locales en mi programa. Me pregunto si tal vez se supone que debo pasar en una cadena como un argumento de línea de comandos. Así que vamos a probar esto. No he hecho esto antes. Vamos a ver si tal vez si ejecuto este programa con un argumento de línea de comandos que funciona. Eh, no hay fallo de segmentación allí. Se me acaba de decir que lo he descubierto. Así que tal vez esa es la solución aquí. Y de hecho, si me voy atrás y mirar el código fuente real para buggy1.c, parece como si lo que estoy haciendo es Estoy haciendo una llamada a strcmp sin comprobar si, de hecho, argv [1] existe. Esto es en realidad la código fuente para buggy1.c. Así que lo que realmente necesito hacer aquí para arreglar mi programa, suponiendo que tengo el presentar en frente de mí, es simplemente añadir un cheque para hacer asegurarse de que argc es igual a 2. Así que este ejemplo, una vez más, como he dicho, es un poco artificial, ¿verdad? En general, usted no va a borrar accidentalmente su código fuente y luego tener que tratar y depurar el programa. Pero es de esperar, se lo dio que una ilustración de los tipos de cosas que usted podría estar pensando en como usted está depurar su programa. ¿Cuál es el estado de cosas aquí? ¿Qué variables hacer yo tener acceso a mi? ¿Dónde exactamente es mi programa estrellarse, en qué línea, en lo llamado a qué función? ¿Qué tipo de pistas ¿eso me dan? Y eso es exactamente lo tipo de mentalidad que debe entrar en cuando estás pensando en la depuración de los programas. Soy Doug Lloyd. Esto es CS50.