Doug LLOYD: Todo ben GDB. ¿Que é iso exactamente? Entón GDB, que significa ao GNU Debugger, é unha ferramenta realmente incrible que podemos usar para axudarnos a depurar os nosos programas, ou descubrir onde as cousas son pasando mal nos nosos programas. GDB é incrible poderoso, pero a saída e interacción con el pode ser un pouco enigmática. Xeralmente é unha ferramenta de liña de comandos, e pode xogar unha morea de mensaxes para ti. E pode tipo de difícil analizar o que está a suceder. Pasos Afortunadamente, tivemos para corrixir este problema para vostede como traballa a través CS50. Se non está a usar a gráfica depurador, que o meu compañeiro Dan Armandarse falou bastante un pouco sobre un vídeo que debe ser por aquí agora, pode ter para usalos liña de comandos ferramentas para traballar co GDB. Se está a traballar no CS50 IDE, non facelo. Pero se non é traballando no CS50 IDE, quizais usando unha versión CS50 de Appliance, ou operar outro Linux sistema con GDB instalado nel, pode ter usar estas ferramentas de liña de comandos. E xa que pode Ten que facer iso, é útil para entender como GDB traballa na liña de comandos. Pero, de novo, se está usando a IDE CS50, vostede Pode utilizar o depurador gráfico que está incorporado no IDE. Entón, para comezar as cousas con GDB, para iniciar a depuración proceso dun determinado programa, o único que tes que facer é tipo GDB seguido polo nome do programa. Así, por exemplo, se o seu programa é Ola, debes introducir GDB Ola. Cando fai isto, está indo para puxar arriba o ambiente GDB. O poder vai cambiar, e en vez de ser o que é normalmente é cando escribe cousas nas ls linha-- mando, cd-- todo o seu típico Os comandos de Linux, o seu poder cambiará para, probablemente, algo como parénteses GDB parénteses. Ese é o seu novo poder GDB, porque está dentro do ámbito GDB. Unha vez dentro dese ambiente, hai dous grandes comandos que probablemente vai usar na seguinte orde. O primeiro é b, que é curto para o intervalo. E despois que escriba b, normalmente escriba o nome dunha función, ou se ocorrer de saber en torno ao que o número da liña o programa comeza comportarse-se un pouco raro, podes escribir unha liña Número de alí tamén. Que b, ou fin, fai é que permite que o seu programa para realizar ata un certo punto, en particular, o nome da función que se especifica ou a liña número que se especifica. E nese punto, vai conxelar a execución. Iso é unha cousa moi boa, porque xa que a execución fose conxelada, pode comezar a moi lentamente paso a través do seu programa. Normalmente, se estiven correndo seus programas, son moi curta. Normalmente, escribe o que quere barra dot o nome do seu programa, prema a tecla Intro, e antes de que pode palpebrar, o seu programa xa está rematado. Non é realmente unha morea de tempo para intentar e descubrir o que está a suceder de malo. Por iso, para ser realmente capaz de retardar as cousas abaixo, definindo un punto de ruptura con b, e, a continuación, pisar. Entón unha vez que teña definido a súa pausa punto, pode realizar o programa. E se ten calquera argumentos de liña de comandos, vostede especifica-los aquí, e non cando GDB escribe o seu nome do programa. Vostede especifica toda a liña de comandos argumentos, tomando r, ou correr, e logo argumentos da liña de comandos que quere precisa dentro do seu programa. Hai un número de outro realmente comandos importantes e útiles no interior do ámbito de PIB. Entón déixenme só rapidamente pasar por riba de algúns deles. A primeira é a N, que é a abreviación para a próxima, e podes escribir próximo en vez de n, tanto ía funcionar. E iso é só a taquigrafia. E, como probablemente xa obtido afeito, ser capaz de escribir cousas máis curto é xeralmente mellor. E o que vai facer é que vai avanzar un bloque de código. Polo que vai avanzar ata que unha chamada de función. E, a continuación, no canto de mergullo no que a función e pasando por todos que as funcións código, só terá a función. A función será chamado. Vai facer o que o seu traballo é. El pode voltar un valor para a función que o chamou. E entón vai pasar á seguinte liña de que a función de chamada. Se quere paso dentro da función, en vez de ter só el executar, especialmente se pensas que o problema podería estar dentro desa función, podería, por suposto, establecer unha pausa punto no interior desa función. Ou, se xa está en execución, pode usar s para avanzar unha liña de código. Entón, iso vai intervir e mergullo en funcións, no canto de só ter a realizar e continuando na función que está a depuración. Se vostede sempre quixo saber o valor dunha variable, podes escribir p, ou impresión, e, a continuación, o nome da variable. E que imprimirá a vostede, no interior do ámbito de GDB, o nome da variable, que vocę-- con permiso mim-- o valor da variable que teña nomeado. Se quere saber os valores de todos os variable accesible lugares de onde está actualmente na súa programa, pode introducir información locais. É moito máis rápido que escribindo p e, a continuación, calquera que sexa, list todos os variables que sabe que existen. Pode introducir información locals, e imprimirá todo para ti. A continuación é bt, que é curto para volver Trace. Agora, xeralmente, particularmente no inicio do CS50, realmente non vai ter ocasión usar bt, ou Back Trace, porque non está a ter funcións que chamar outras funcións. Pode ter unha páxina call función, pero isto pode ser iso. Non ten outra función que chamar outra función, que chama outra función, e así por diante. Pero, como os seus programas máis complexo, e particularmente cando comezar a traballar con recursividade, trazo de volta pode ser un xeito moi útil para deixalo tipo de obter un contexto onde Estou no meu programa. Entón, digamos que teña escrito o seu código, e vostede sabe que a principal chama unha función f, que chama unha función g, o que chama unha función h. Polo tanto, temos varias capas de nidificación suceder aquí. Se está dentro seu contorno GDB, e vostede sabe que o seu interior h, pero esquece sobre o que ten para onde é-- podes escribir bt, ou trazo de volta, e só pode imprimir h, g, f principal, xunto con algunhas outras informacións, que dálle un indicio de que, principal OK chamado f, f chamado g, h g de chamada, e é aí onde eu Actualmente estou no meu programa. Por iso, pode ser realmente útil, especialmente como o enigmático-Ness do GDB pasa a ser un pouco esmagadora, a descubrir exactamente onde as cousas están. Para rematar, cando o programa está feito, ou cando está feito depurá lo e quere afastarse desde o ámbito de GDB, que axuda a saber como saír dela. Podes escribir q, ou Saír, para saír. Agora, antes de vídeo de hoxe Preparei un programa de buggy chamado Buggy1, que eu compilar a partir dun ficheiro coñecido como buggy1.c. Como podería esperar, este programa é, de feito, buggy. Algo vai mal cando tentar executalo. Agora, por desgraza, eu inadvertidamente apaguei o meu arquivo buggy1.c, Entón, para min descubrir o que está a suceder de malo con este programa, Vou ter que usar GDB tipo de cegamente, intentando para navegar a través deste programa para descubrir o que está a suceder de malo. Pero usando só as ferramentas xa aprendemos sobre, que pode moi ben figura exactamente o que é. Entón imos cabeza para CS50 IDE e un ollo. OK, polo que estamos aquí na miña CS50 ambiente IDE, e eu vou facer zoom un pouco para que poida ver un pouco máis. Na miña fiestra da terminal, se eu listo o contido da miña actual director con ls, imos ver que eu teño un par de arquivos de orixe aquí, incluíndo o anteriormente discutida Buggy1. O que é exactamente acontece cando Eu intento e executar Buggy1. Ben, imos descubrir. Eu tecleo barra punto, cesta, e eu prema Intro. Fallos de segmentación. Iso non é bo. Se lembrar, unha fallo de segmento tipicamente ocorre cando acceder a memoria que non estamos autorizados a tocar. Temos algunha maneira acadar fóra dos límites que o programa, o compilador, nos deu. E así xa que é un pista para manterse na caixa de ferramentas a medida que comezamos o proceso de depuración. Algo deu un pouco mal aquí. Todo ben, entón imos comezar ambiente GDB para ver se podemos descubrir o que é exactamente o problema. Eu estou indo a limpar a pantalla do ordenador, e eu estou indo a escribir GDB de novo, para entrar no ambiente GDB, eo nome do programa que quero depurar, Buggy1. Recibimos unha pequena mensaxe, lendo símbolos de Buggy1, feito. Todo o que significa que tirou xuntos todo o código, e agora procede en GDB, e está preparado para ir. Agora, o que quero facer? Vostede recorda o que o primeiro paso é tipicamente despois de que eu estou dentro deste ambiente? Con sorte, referido conxunto un punto de ruptura, porque de feito, iso é o que quero facer. Agora, eu non teño o código fonte para este na miña fronte, o que é, probablemente, non é o caso de uso típico, por certo. Probablemente debería ocorrer. Entón, iso é bo. Pero supoñendo que non fai iso, o que é a unha función que sabe existe en cada programa C single? Non importa o grande ou quão complicado que é, en definitiva, esa función existe. Main, non? Entón, non de todo, podemos definir un punto de ruptura na principal. E de novo, eu podería simplemente escribir romper principal, en vez de b. E se está curioso, se nunca escribir un comando longo e, a continuación, entender que ingresaran as cousas mal, e quere desfacerse de todos, como eu fixen, pode asumir o control U, que será borrar todo e traer vostede ao para o inicio das liñas do cursor. Un moito máis rápido que manteña a eliminar ou bate-lo veces grupo over. Entón, imos establecer un break point no inicio. E como se pode ver, el di que temos definir un punto de interrupción no ficheiro buggy1.c, e ao parecer a primeira liña de código de liña principal é sete. De novo, non temos o ficheiro de orixe aquí, pero eu vou asumir que é me dicindo a verdade. E entón, eu só estou tentando e executar o programa, r. Desde o programa. Todo ben, entón esta mensaxe é un pouco enigmática. Pero, basicamente, o que é pasando aquí é que é só me dicindo que eu bati miña pausa punto, rompe punto número un. E entón, esta liña de código, non existe tal ficheiro ou directorio. A única razón que Estou vendo esta mensaxe é porque eu inadvertidamente apaguei o meu arquivo buggy.c. Se o meu arquivo buggy1.c existiu no directorio actual, este dereito liña habería realmente me diga o que a liña de código literalmente le. Desafortunadamente, eu delete. Nós imos ter que tipo de navegar a través deste algo máis cegamente. OK, entón imos ver, o que que quero facer aquí? Ben, gustaríame saber o que locais quizais variables están dispoñibles para min. Comece o meu programa. Imos ver o que se pode xa inicializada para nós. Eu tecleo veciños Info, non residentes. Todo ben, polo que non fai dáme unha tonelada de información. Podería tentar e imprimir unha variable, pero eu non sei todo nomes de variables. Podería tentar un trazo de volta, pero eu estou dentro principal, entón eu sei que non fixeron outra chamada agora función. Entón, parece que as miñas únicas opcións son usar n ou así e comezar a mergullo. Vou usar n. Entón eu tecleo n. Oh meu Deus, o que está pasando aquí. Programa de sinais recibidos, SIGSEGV fallo de segmento, e, a continuación, unha morea de cousas. Eu xa estou resaltado. Así, hai realmente unha moito por aprender aquí. Entón, o que iso nos di? O que isto nos di é, este programa é a punto de, pero non ten aínda, fallo seg. E, en particular, eu vou para ampliar aínda máis aquí, é a culpa sobre SEG algo chamado strcmp. Agora, non pode ter discutido esta función extensivamente. Pero é-- porque non imos para falar sobre cada función que existe no estándar C library-- pero eles están todos dispoñibles para ti, especialmente se tomar un mirar para reference.cs50.net. E strcmp é un realmente poderoso función que existe dentro da cabeceira string.h ficheiro, o que é unha cabeceira ficheiro que está dedicado a funcións que o traballo con e manipular cadeas. E, en particular, o que fai é strcmp compara os valores de dúas cordas. Entón, eu estou a piques de fallo de segmento nunha chamada á strcmp parece. Eu bati n, e de feito eu recibir a mensaxe, programa rematou co sinal SIGSEGV fallo de segmento. Entón agora En realidade, teño seg criticado, e meu programa ten bastante moi eficaz desistido. Este é o fin do programa. El rompe, el caeu. Entón non era moito, pero eu realmente fixo aprender un pouco dende esta pouca experiencia. O que aprendín? Ben, o meu programa falla practicamente inmediato. Meu programa traba en unha chamada strcmp, pero eu Non temos ningún variables locais na miña programa no momento en que el traba. Entón, o que cadea, ou cordas, eu podería ser comparando. Se eu non teño ningún lugar, variables, pode supoñer que eu have-- alí quizais é unha variable global, o que podería ser verdade. Pero xeralmente, parece como eu estou comparando a algo que non existe. Entón, imos investigar que un pouco máis. Entón, eu estou indo a limpar miña pantalla. Vou saír fóra do Ambiente GDB por un segundo. E eu estou pensando, OK, non hai hai variables locais no meu programa. Eu me pregunta se cadra debería pasar nunha secuencia de caracteres como un argumento de liña de comandos. Entón imos probar iso. Eu non fixen iso antes. A ver se é posible se eu executar este programa cun argumento da liña de comandos que funciona. Huh, non hai fallo de segmento. Só me dixo que eu entender iso. Entón, talvez esa sexa a solución aquí. E, de feito, se eu volver e buscar o código fonte real para buggy1.c, parece que o que estou facendo é Eu estou facendo unha chamada á strcmp sen comprobar que, de feito, argv [1] existe. Esta é realmente a o código fonte de buggy1.c. Entón, o que eu realmente teño facer aquí para resolver o meu programa, Supoñendo que eu teño a presentar diante de min, é só para engadir unha selección para facer seguro que argc é igual a 2. Así, neste exemplo, unha vez máis, como dixen, é un pouco artificial, non? Normalmente non vai accidentalmente borrar o seu código fonte e despois ten que tentar e depurar o programa. Pero espero que deu unha ilustración dos tipos de cousas que podería estar pensando en como está depuración do seu programa. Cal é o estado de cousas aquí? Que facer variables I teñen acceso a min? Onde exactamente o meu programa deixar de funcionar, en que liña, sobre o que chamada cal función? Que tipo de pistas que iso me dar? E iso é o tipo de mentalidade que debe ser metendo cando está pensando depurar os seus programas. Eu son Doug Lloyd. Este é CS50.