1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> Doug LLOYD: Todo ben GDB. 3 00:00:06,830 --> 00:00:08,480 ¿Que é iso exactamente? 4 00:00:08,480 --> 00:00:11,310 Entón GDB, que significa ao GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 é unha ferramenta realmente incrible que podemos usar para axudarnos a depurar os nosos programas, 6 00:00:15,040 --> 00:00:18,210 ou descubrir onde as cousas son pasando mal nos nosos programas. 7 00:00:18,210 --> 00:00:22,590 GDB é incrible poderoso, pero a saída e interacción con el 8 00:00:22,590 --> 00:00:23,830 pode ser un pouco enigmática. 9 00:00:23,830 --> 00:00:28,210 Xeralmente é unha ferramenta de liña de comandos, e pode xogar unha morea de mensaxes para ti. 10 00:00:28,210 --> 00:00:31,144 E pode tipo de difícil analizar o que está a suceder. 11 00:00:31,144 --> 00:00:33,560 Pasos Afortunadamente, tivemos para corrixir este problema para vostede 12 00:00:33,560 --> 00:00:36,281 como traballa a través CS50. 13 00:00:36,281 --> 00:00:39,030 Se non está a usar a gráfica depurador, que o meu compañeiro Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse falou bastante un pouco sobre un vídeo que 15 00:00:41,570 --> 00:00:44,740 debe ser por aquí agora, pode ter 16 00:00:44,740 --> 00:00:48,270 para usalos liña de comandos ferramentas para traballar co GDB. 17 00:00:48,270 --> 00:00:51,250 Se está a traballar no CS50 IDE, non facelo. 18 00:00:51,250 --> 00:00:53,550 Pero se non é traballando no CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 quizais usando unha versión CS50 de Appliance, 20 00:00:55,750 --> 00:00:58,860 ou operar outro Linux sistema con GDB instalado nel, 21 00:00:58,860 --> 00:01:00,980 pode ter usar estas ferramentas de liña de comandos. 22 00:01:00,980 --> 00:01:02,860 >> E xa que pode Ten que facer iso, é 23 00:01:02,860 --> 00:01:06,280 útil para entender como GDB traballa na liña de comandos. 24 00:01:06,280 --> 00:01:09,650 Pero, de novo, se está usando a IDE CS50, vostede 25 00:01:09,650 --> 00:01:15,400 Pode utilizar o depurador gráfico que está incorporado no IDE. 26 00:01:15,400 --> 00:01:18,750 Entón, para comezar as cousas con GDB, para iniciar a depuración 27 00:01:18,750 --> 00:01:21,220 proceso dun determinado programa, o único que tes que facer 28 00:01:21,220 --> 00:01:23,810 é tipo GDB seguido polo nome do programa. 29 00:01:23,810 --> 00:01:28,620 Así, por exemplo, se o seu programa é Ola, debes introducir GDB Ola. 30 00:01:28,620 --> 00:01:31,210 >> Cando fai isto, está indo para puxar arriba o ambiente GDB. 31 00:01:31,210 --> 00:01:33,800 O poder vai cambiar, e en vez de ser o que é normalmente 32 00:01:33,800 --> 00:01:35,841 é cando escribe cousas nas ls linha-- mando, 33 00:01:35,841 --> 00:01:38,115 cd-- todo o seu típico Os comandos de Linux, o seu poder 34 00:01:38,115 --> 00:01:42,200 cambiará para, probablemente, algo como parénteses GDB parénteses. 35 00:01:42,200 --> 00:01:46,630 Ese é o seu novo poder GDB, porque está dentro do ámbito GDB. 36 00:01:46,630 --> 00:01:49,830 Unha vez dentro dese ambiente, hai dous grandes comandos 37 00:01:49,830 --> 00:01:52,290 que probablemente vai usar na seguinte orde. 38 00:01:52,290 --> 00:01:55,200 >> O primeiro é b, que é curto para o intervalo. 39 00:01:55,200 --> 00:01:58,690 E despois que escriba b, normalmente escriba o nome dunha función, 40 00:01:58,690 --> 00:02:01,040 ou se ocorrer de saber en torno ao que o número da liña 41 00:02:01,040 --> 00:02:04,100 o programa comeza comportarse-se un pouco raro, 42 00:02:04,100 --> 00:02:06,370 podes escribir unha liña Número de alí tamén. 43 00:02:06,370 --> 00:02:09,660 Que b, ou fin, fai é que permite que o seu programa 44 00:02:09,660 --> 00:02:13,270 para realizar ata un certo punto, en particular, o nome da función 45 00:02:13,270 --> 00:02:15,880 que se especifica ou a liña número que se especifica. 46 00:02:15,880 --> 00:02:18,590 >> E nese punto, vai conxelar a execución. 47 00:02:18,590 --> 00:02:21,670 Iso é unha cousa moi boa, porque xa que a execución fose conxelada, 48 00:02:21,670 --> 00:02:25,214 pode comezar a moi lentamente paso a través do seu programa. 49 00:02:25,214 --> 00:02:28,130 Normalmente, se estiven correndo seus programas, son moi curta. 50 00:02:28,130 --> 00:02:31,250 Normalmente, escribe o que quere barra dot o nome do seu programa, prema a tecla Intro, 51 00:02:31,250 --> 00:02:33,470 e antes de que pode palpebrar, o seu programa xa está rematado. 52 00:02:33,470 --> 00:02:36,620 Non é realmente unha morea de tempo para intentar e descubrir o que está a suceder de malo. 53 00:02:36,620 --> 00:02:40,920 Por iso, para ser realmente capaz de retardar as cousas abaixo, definindo un punto de ruptura con b, 54 00:02:40,920 --> 00:02:43,040 e, a continuación, pisar. 55 00:02:43,040 --> 00:02:46,169 >> Entón unha vez que teña definido a súa pausa punto, pode realizar o programa. 56 00:02:46,169 --> 00:02:47,960 E se ten calquera argumentos de liña de comandos, 57 00:02:47,960 --> 00:02:51,610 vostede especifica-los aquí, e non cando GDB escribe o seu nome do programa. 58 00:02:51,610 --> 00:02:55,980 Vostede especifica toda a liña de comandos argumentos, tomando r, ou correr, 59 00:02:55,980 --> 00:03:00,270 e logo argumentos da liña de comandos que quere precisa dentro do seu programa. 60 00:03:00,270 --> 00:03:03,510 Hai un número de outro realmente comandos importantes e útiles 61 00:03:03,510 --> 00:03:04,970 no interior do ámbito de PIB. 62 00:03:04,970 --> 00:03:07,540 Entón déixenme só rapidamente pasar por riba de algúns deles. 63 00:03:07,540 --> 00:03:11,320 >> A primeira é a N, que é a abreviación para a próxima, e podes escribir próximo en vez de n, 64 00:03:11,320 --> 00:03:12,304 tanto ía funcionar. 65 00:03:12,304 --> 00:03:13,470 E iso é só a taquigrafia. 66 00:03:13,470 --> 00:03:17,540 E, como probablemente xa obtido afeito, ser capaz de escribir cousas 67 00:03:17,540 --> 00:03:20,520 máis curto é xeralmente mellor. 68 00:03:20,520 --> 00:03:24,100 E o que vai facer é que vai avanzar un bloque de código. 69 00:03:24,100 --> 00:03:26,170 Polo que vai avanzar ata que unha chamada de función. 70 00:03:26,170 --> 00:03:28,350 E, a continuación, no canto de mergullo no que a función 71 00:03:28,350 --> 00:03:33,130 e pasando por todos que as funcións código, só terá a función. 72 00:03:33,130 --> 00:03:34,400 >> A función será chamado. 73 00:03:34,400 --> 00:03:35,733 Vai facer o que o seu traballo é. 74 00:03:35,733 --> 00:03:38,870 El pode voltar un valor para a función que o chamou. 75 00:03:38,870 --> 00:03:42,490 E entón vai pasar á seguinte liña de que a función de chamada. 76 00:03:42,490 --> 00:03:44,555 Se quere paso dentro da función, 77 00:03:44,555 --> 00:03:46,430 en vez de ter só el executar, especialmente 78 00:03:46,430 --> 00:03:50,004 se pensas que o problema podería estar dentro desa función, 79 00:03:50,004 --> 00:03:52,670 podería, por suposto, establecer unha pausa punto no interior desa función. 80 00:03:52,670 --> 00:03:57,820 Ou, se xa está en execución, pode usar s para avanzar unha liña de código. 81 00:03:57,820 --> 00:04:01,170 >> Entón, iso vai intervir e mergullo en funcións, 82 00:04:01,170 --> 00:04:04,750 no canto de só ter a realizar e continuando na función 83 00:04:04,750 --> 00:04:07,380 que está a depuración. 84 00:04:07,380 --> 00:04:09,870 Se vostede sempre quixo saber o valor dunha variable, 85 00:04:09,870 --> 00:04:12,507 podes escribir p, ou impresión, e, a continuación, o nome da variable. 86 00:04:12,507 --> 00:04:15,090 E que imprimirá a vostede, no interior do ámbito de GDB, 87 00:04:15,090 --> 00:04:19,110 o nome da variable, que vocę-- con permiso mim-- o valor da variable 88 00:04:19,110 --> 00:04:20,064 que teña nomeado. 89 00:04:20,064 --> 00:04:23,230 Se quere saber os valores de todos os variable accesible lugares de onde 90 00:04:23,230 --> 00:04:25,970 está actualmente na súa programa, pode introducir información locais. 91 00:04:25,970 --> 00:04:28,332 É moito máis rápido que escribindo p e, a continuación, calquera que sexa, 92 00:04:28,332 --> 00:04:30,540 list todos os variables que sabe que existen. 93 00:04:30,540 --> 00:04:34,370 Pode introducir información locals, e imprimirá todo para ti. 94 00:04:34,370 --> 00:04:37,770 A continuación é bt, que é curto para volver Trace. 95 00:04:37,770 --> 00:04:41,680 Agora, xeralmente, particularmente no inicio do CS50, 96 00:04:41,680 --> 00:04:44,450 realmente non vai ter ocasión usar bt, ou Back Trace, 97 00:04:44,450 --> 00:04:47,860 porque non está a ter funcións que chamar outras funcións. 98 00:04:47,860 --> 00:04:50,450 >> Pode ter unha páxina call función, pero isto pode ser iso. 99 00:04:50,450 --> 00:04:53,199 Non ten outra función que chamar outra función, que 100 00:04:53,199 --> 00:04:54,880 chama outra función, e así por diante. 101 00:04:54,880 --> 00:04:57,550 Pero, como os seus programas máis complexo, e particularmente 102 00:04:57,550 --> 00:05:00,290 cando comezar a traballar con recursividade, trazo de volta 103 00:05:00,290 --> 00:05:05,150 pode ser un xeito moi útil para deixalo tipo de obter un contexto onde 104 00:05:05,150 --> 00:05:06,460 Estou no meu programa. 105 00:05:06,460 --> 00:05:10,590 Entón, digamos que teña escrito o seu código, e vostede sabe que a principal chama unha función 106 00:05:10,590 --> 00:05:14,720 f, que chama unha función g, o que chama unha función h. 107 00:05:14,720 --> 00:05:17,650 Polo tanto, temos varias capas de nidificación suceder aquí. 108 00:05:17,650 --> 00:05:19,440 >> Se está dentro seu contorno GDB, 109 00:05:19,440 --> 00:05:21,640 e vostede sabe que o seu interior h, pero esquece 110 00:05:21,640 --> 00:05:27,210 sobre o que ten para onde é-- podes escribir bt, ou trazo de volta, 111 00:05:27,210 --> 00:05:32,370 e só pode imprimir h, g, f principal, xunto con algunhas outras informacións, que 112 00:05:32,370 --> 00:05:35,984 dálle un indicio de que, principal OK chamado f, f chamado g, h g de chamada, 113 00:05:35,984 --> 00:05:37,900 e é aí onde eu Actualmente estou no meu programa. 114 00:05:37,900 --> 00:05:41,380 Por iso, pode ser realmente útil, especialmente como o enigmático-Ness do GDB 115 00:05:41,380 --> 00:05:45,667 pasa a ser un pouco esmagadora, a descubrir exactamente onde as cousas están. 116 00:05:45,667 --> 00:05:48,500 Para rematar, cando o programa está feito, ou cando está feito depurá lo 117 00:05:48,500 --> 00:05:50,125 e quere afastarse desde o ámbito de GDB, 118 00:05:50,125 --> 00:05:51,940 que axuda a saber como saír dela. 119 00:05:51,940 --> 00:05:55,500 Podes escribir q, ou Saír, para saír. 120 00:05:55,500 --> 00:05:59,220 Agora, antes de vídeo de hoxe Preparei un programa de buggy 121 00:05:59,220 --> 00:06:03,900 chamado Buggy1, que eu compilar a partir dun ficheiro coñecido como buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Como podería esperar, este programa é, de feito, buggy. 123 00:06:06,500 --> 00:06:08,990 Algo vai mal cando tentar executalo. 124 00:06:08,990 --> 00:06:13,014 Agora, por desgraza, eu inadvertidamente apaguei o meu arquivo buggy1.c, 125 00:06:13,014 --> 00:06:15,930 Entón, para min descubrir o que está a suceder de malo con este programa, 126 00:06:15,930 --> 00:06:18,770 Vou ter que usar GDB tipo de cegamente, intentando 127 00:06:18,770 --> 00:06:22,372 para navegar a través deste programa para descubrir o que está a suceder de malo. 128 00:06:22,372 --> 00:06:24,580 Pero usando só as ferramentas xa aprendemos sobre, 129 00:06:24,580 --> 00:06:27,700 que pode moi ben figura exactamente o que é. 130 00:06:27,700 --> 00:06:30,740 Entón imos cabeza para CS50 IDE e un ollo. 131 00:06:30,740 --> 00:06:33,155 OK, polo que estamos aquí na miña CS50 ambiente IDE, 132 00:06:33,155 --> 00:06:35,697 e eu vou facer zoom un pouco para que poida ver un pouco máis. 133 00:06:35,697 --> 00:06:38,530 Na miña fiestra da terminal, se eu listo o contido da miña actual director 134 00:06:38,530 --> 00:06:41,250 con ls, imos ver que eu teño un par de arquivos de orixe 135 00:06:41,250 --> 00:06:44,982 aquí, incluíndo o anteriormente discutida Buggy1. 136 00:06:44,982 --> 00:06:46,940 O que é exactamente acontece cando Eu intento e executar Buggy1. 137 00:06:46,940 --> 00:06:47,773 Ben, imos descubrir. 138 00:06:47,773 --> 00:06:52,510 Eu tecleo barra punto, cesta, e eu prema Intro. 139 00:06:52,510 --> 00:06:53,670 >> Fallos de segmentación. 140 00:06:53,670 --> 00:06:55,000 Iso non é bo. 141 00:06:55,000 --> 00:06:57,180 Se lembrar, unha fallo de segmento tipicamente 142 00:06:57,180 --> 00:07:01,540 ocorre cando acceder a memoria que non estamos autorizados a tocar. 143 00:07:01,540 --> 00:07:03,820 Temos algunha maneira acadar fóra dos límites 144 00:07:03,820 --> 00:07:05,995 que o programa, o compilador, nos deu. 145 00:07:05,995 --> 00:07:08,310 E así xa que é un pista para manterse na caixa de ferramentas 146 00:07:08,310 --> 00:07:10,660 a medida que comezamos o proceso de depuración. 147 00:07:10,660 --> 00:07:13,620 Algo deu un pouco mal aquí. 148 00:07:13,620 --> 00:07:15,935 >> Todo ben, entón imos comezar ambiente GDB 149 00:07:15,935 --> 00:07:19,030 para ver se podemos descubrir o que é exactamente o problema. 150 00:07:19,030 --> 00:07:21,674 Eu estou indo a limpar a pantalla do ordenador, e eu estou indo a escribir GDB 151 00:07:21,674 --> 00:07:24,340 de novo, para entrar no ambiente GDB, eo nome do programa 152 00:07:24,340 --> 00:07:27,450 que quero depurar, Buggy1. 153 00:07:27,450 --> 00:07:30,182 Recibimos unha pequena mensaxe, lendo símbolos de Buggy1, feito. 154 00:07:30,182 --> 00:07:32,390 Todo o que significa que tirou xuntos todo o código, 155 00:07:32,390 --> 00:07:35,570 e agora procede en GDB, e está preparado para ir. 156 00:07:35,570 --> 00:07:37,140 >> Agora, o que quero facer? 157 00:07:37,140 --> 00:07:39,130 Vostede recorda o que o primeiro paso é tipicamente 158 00:07:39,130 --> 00:07:42,540 despois de que eu estou dentro deste ambiente? 159 00:07:42,540 --> 00:07:44,540 Con sorte, referido conxunto un punto de ruptura, porque 160 00:07:44,540 --> 00:07:46,240 de feito, iso é o que quero facer. 161 00:07:46,240 --> 00:07:47,990 Agora, eu non teño o código fonte para este 162 00:07:47,990 --> 00:07:50,948 na miña fronte, o que é, probablemente, non é o caso de uso típico, por certo. 163 00:07:50,948 --> 00:07:52,055 Probablemente debería ocorrer. 164 00:07:52,055 --> 00:07:52,680 Entón, iso é bo. 165 00:07:52,680 --> 00:07:55,790 Pero supoñendo que non fai iso, o que é a unha función que sabe 166 00:07:55,790 --> 00:07:58,880 existe en cada programa C single? 167 00:07:58,880 --> 00:08:04,420 Non importa o grande ou quão complicado que é, en definitiva, esa función existe. 168 00:08:04,420 --> 00:08:05,440 Main, non? 169 00:08:05,440 --> 00:08:08,870 >> Entón, non de todo, podemos definir un punto de ruptura na principal. 170 00:08:08,870 --> 00:08:12,200 E de novo, eu podería simplemente escribir romper principal, en vez de b. 171 00:08:12,200 --> 00:08:14,650 E se está curioso, se nunca escribir un comando longo 172 00:08:14,650 --> 00:08:16,800 e, a continuación, entender que ingresaran as cousas mal, 173 00:08:16,800 --> 00:08:18,770 e quere desfacerse de todos, como eu fixen, 174 00:08:18,770 --> 00:08:22,029 pode asumir o control U, que será borrar todo e traer vostede ao 175 00:08:22,029 --> 00:08:23,570 para o inicio das liñas do cursor. 176 00:08:23,570 --> 00:08:26,569 Un moito máis rápido que manteña a eliminar ou bate-lo veces grupo 177 00:08:26,569 --> 00:08:27,080 over. 178 00:08:27,080 --> 00:08:28,740 >> Entón, imos establecer un break point no inicio. 179 00:08:28,740 --> 00:08:32,970 E como se pode ver, el di que temos definir un punto de interrupción no ficheiro buggy1.c, 180 00:08:32,970 --> 00:08:36,330 e ao parecer a primeira liña de código de liña principal é sete. 181 00:08:36,330 --> 00:08:38,080 De novo, non temos o ficheiro de orixe aquí, 182 00:08:38,080 --> 00:08:40,429 pero eu vou asumir que é me dicindo a verdade. 183 00:08:40,429 --> 00:08:44,510 E entón, eu só estou tentando e executar o programa, r. 184 00:08:44,510 --> 00:08:45,360 Desde o programa. 185 00:08:45,360 --> 00:08:48,160 Todo ben, entón esta mensaxe é un pouco enigmática. 186 00:08:48,160 --> 00:08:50,160 Pero, basicamente, o que é pasando aquí é que é só 187 00:08:50,160 --> 00:08:53,350 me dicindo que eu bati miña pausa punto, rompe punto número un. 188 00:08:53,350 --> 00:08:55,877 >> E entón, esta liña de código, non existe tal ficheiro ou directorio. 189 00:08:55,877 --> 00:08:57,710 A única razón que Estou vendo esta mensaxe 190 00:08:57,710 --> 00:09:00,800 é porque eu inadvertidamente apaguei o meu arquivo buggy.c. 191 00:09:00,800 --> 00:09:04,050 Se o meu arquivo buggy1.c existiu no directorio actual, 192 00:09:04,050 --> 00:09:06,920 este dereito liña habería realmente me diga o que a liña de código 193 00:09:06,920 --> 00:09:08,214 literalmente le. 194 00:09:08,214 --> 00:09:09,380 Desafortunadamente, eu delete. 195 00:09:09,380 --> 00:09:14,790 Nós imos ter que tipo de navegar a través deste algo máis cegamente. 196 00:09:14,790 --> 00:09:17,330 >> OK, entón imos ver, o que que quero facer aquí? 197 00:09:17,330 --> 00:09:21,770 Ben, gustaríame saber o que locais quizais variables están dispoñibles para min. 198 00:09:21,770 --> 00:09:23,570 Comece o meu programa. 199 00:09:23,570 --> 00:09:28,515 Imos ver o que se pode xa inicializada para nós. 200 00:09:28,515 --> 00:09:31,430 Eu tecleo veciños Info, non residentes. 201 00:09:31,430 --> 00:09:33,960 Todo ben, polo que non fai dáme unha tonelada de información. 202 00:09:33,960 --> 00:09:37,600 Podería tentar e imprimir unha variable, pero eu non sei todo nomes de variables. 203 00:09:37,600 --> 00:09:39,930 Podería tentar un trazo de volta, pero eu estou dentro principal, 204 00:09:39,930 --> 00:09:43,710 entón eu sei que non fixeron outra chamada agora función. 205 00:09:43,710 --> 00:09:47,710 >> Entón, parece que as miñas únicas opcións son usar n ou así e comezar a mergullo. 206 00:09:47,710 --> 00:09:49,630 Vou usar n. 207 00:09:49,630 --> 00:09:51,180 Entón eu tecleo n. 208 00:09:51,180 --> 00:09:53,060 Oh meu Deus, o que está pasando aquí. 209 00:09:53,060 --> 00:09:56,260 Programa de sinais recibidos, SIGSEGV fallo de segmento, 210 00:09:56,260 --> 00:09:57,880 e, a continuación, unha morea de cousas. 211 00:09:57,880 --> 00:09:58,880 Eu xa estou resaltado. 212 00:09:58,880 --> 00:10:00,980 Así, hai realmente unha moito por aprender aquí. 213 00:10:00,980 --> 00:10:02,520 Entón, o que iso nos di? 214 00:10:02,520 --> 00:10:09,180 O que isto nos di é, este programa é a punto de, pero non ten aínda, fallo seg. 215 00:10:09,180 --> 00:10:12,550 E, en particular, eu vou para ampliar aínda máis aquí, 216 00:10:12,550 --> 00:10:18,980 é a culpa sobre SEG algo chamado strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Agora, non pode ter discutido esta función extensivamente. 218 00:10:22,705 --> 00:10:25,580 Pero é-- porque non imos para falar sobre cada función que 219 00:10:25,580 --> 00:10:28,610 existe no estándar C library-- pero eles están todos dispoñibles para ti, 220 00:10:28,610 --> 00:10:32,110 especialmente se tomar un mirar para reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 E strcmp é un realmente poderoso función que existe dentro 222 00:10:35,000 --> 00:10:38,070 da cabeceira string.h ficheiro, o que é unha cabeceira 223 00:10:38,070 --> 00:10:41,970 ficheiro que está dedicado a funcións que o traballo con e manipular cadeas. 224 00:10:41,970 --> 00:10:49,830 >> E, en particular, o que fai é strcmp compara os valores de dúas cordas. 225 00:10:49,830 --> 00:10:54,160 Entón, eu estou a piques de fallo de segmento nunha chamada á strcmp parece. 226 00:10:54,160 --> 00:10:58,530 Eu bati n, e de feito eu recibir a mensaxe, programa rematou co sinal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 fallo de segmento. Entón agora En realidade, teño seg criticado, 228 00:11:01,370 --> 00:11:06,479 e meu programa ten bastante moi eficaz desistido. 229 00:11:06,479 --> 00:11:07,770 Este é o fin do programa. 230 00:11:07,770 --> 00:11:10,370 El rompe, el caeu. 231 00:11:10,370 --> 00:11:14,740 Entón non era moito, pero eu realmente fixo aprender un pouco 232 00:11:14,740 --> 00:11:16,747 dende esta pouca experiencia. 233 00:11:16,747 --> 00:11:17,580 O que aprendín? 234 00:11:17,580 --> 00:11:22,020 Ben, o meu programa falla practicamente inmediato. 235 00:11:22,020 --> 00:11:26,300 Meu programa traba en unha chamada strcmp, pero eu 236 00:11:26,300 --> 00:11:30,560 Non temos ningún variables locais na miña programa no momento en que el traba. 237 00:11:30,560 --> 00:11:37,320 Entón, o que cadea, ou cordas, eu podería ser comparando. 238 00:11:37,320 --> 00:11:42,140 Se eu non teño ningún lugar, variables, pode 239 00:11:42,140 --> 00:11:45,520 supoñer que eu have-- alí quizais é unha variable global, o que podería ser verdade. 240 00:11:45,520 --> 00:11:47,670 >> Pero xeralmente, parece como eu estou comparando 241 00:11:47,670 --> 00:11:52,070 a algo que non existe. 242 00:11:52,070 --> 00:11:54,130 Entón, imos investigar que un pouco máis. 243 00:11:54,130 --> 00:11:55,120 Entón, eu estou indo a limpar miña pantalla. 244 00:11:55,120 --> 00:11:57,536 Vou saír fóra do Ambiente GDB por un segundo. 245 00:11:57,536 --> 00:12:01,300 E eu estou pensando, OK, non hai hai variables locais no meu programa. 246 00:12:01,300 --> 00:12:06,444 Eu me pregunta se cadra debería pasar nunha secuencia de caracteres como un argumento de liña de comandos. 247 00:12:06,444 --> 00:12:07,610 Entón imos probar iso. 248 00:12:07,610 --> 00:12:09,020 Eu non fixen iso antes. 249 00:12:09,020 --> 00:12:14,244 >> A ver se é posible se eu executar este programa cun argumento da liña de comandos que funciona. 250 00:12:14,244 --> 00:12:16,140 Huh, non hai fallo de segmento. 251 00:12:16,140 --> 00:12:17,870 Só me dixo que eu entender iso. 252 00:12:17,870 --> 00:12:19,170 Entón, talvez esa sexa a solución aquí. 253 00:12:19,170 --> 00:12:27,560 E, de feito, se eu volver e buscar o código fonte real para buggy1.c, 254 00:12:27,560 --> 00:12:31,180 parece que o que estou facendo é Eu estou facendo unha chamada á strcmp sen 255 00:12:31,180 --> 00:12:34,010 comprobar que, de feito, argv [1] existe. 256 00:12:34,010 --> 00:12:36,730 Esta é realmente a o código fonte de buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Entón, o que eu realmente teño facer aquí para resolver o meu programa, 258 00:12:38,855 --> 00:12:40,835 Supoñendo que eu teño a presentar diante de min, é 259 00:12:40,835 --> 00:12:44,740 só para engadir unha selección para facer seguro que argc é igual a 2. 260 00:12:44,740 --> 00:12:47,780 Así, neste exemplo, unha vez máis, como dixen, é un pouco artificial, non? 261 00:12:47,780 --> 00:12:49,840 Normalmente non vai accidentalmente borrar o seu código fonte 262 00:12:49,840 --> 00:12:51,820 e despois ten que tentar e depurar o programa. 263 00:12:51,820 --> 00:12:53,120 Pero espero que deu unha ilustración 264 00:12:53,120 --> 00:12:55,120 dos tipos de cousas que podería estar pensando en 265 00:12:55,120 --> 00:12:56,610 como está depuración do seu programa. 266 00:12:56,610 --> 00:12:58,760 >> Cal é o estado de cousas aquí? 267 00:12:58,760 --> 00:13:00,510 Que facer variables I teñen acceso a min? 268 00:13:00,510 --> 00:13:03,600 Onde exactamente o meu programa deixar de funcionar, en que liña, 269 00:13:03,600 --> 00:13:05,240 sobre o que chamada cal función? 270 00:13:05,240 --> 00:13:06,952 Que tipo de pistas que iso me dar? 271 00:13:06,952 --> 00:13:08,910 E iso é o tipo de mentalidade que 272 00:13:08,910 --> 00:13:12,820 debe ser metendo cando está pensando depurar os seus programas. 273 00:13:12,820 --> 00:13:13,820 >> Eu son Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Este é CS50. 275 00:13:16,140 --> 00:15:08,642