Olá e bem-vindo de volta.
Nesta palestra, quero fazer uma demonstração de como você pode usar o depurador.
Portanto, quero examinar a interface gráfica do usuário, mostrar como é possível iniciar um programa no modo de depuração, como
é possível definir pontos de interrupção, como é possível examinar a pilha de chamadas e como é possível visualizar diferentes variáveis
usando a janela de observação.
Apenas um programa simples que está determinando uma média.
Vou usar isso como minha demonstração.
Tudo o que ele faz é ler três números inteiros, armazená-los e, em seguida, calcular a média deles.
Agora, uma coisa que quero mencionar antes de realmente usarmos o depurador é que você precisa ter certeza
de que a configuração está definida corretamente.
Falei sobre isso em um vídeo anterior, basicamente configurando o code light para usar o depurador.
Mas só para refrescar sua memória, você pode selecionar o projeto aqui, clicar com o botão direito do mouse e ir para as
configurações.
Novamente, dependendo da plataforma em que você estiver, certifique-se de que as configurações
do depurador aqui à esquerda tenham o caminho correto para o GDB.
Agora, se você estiver no Windows, isso pode implicar o uso do GDB X do Cygwin ou o uso do MinGW w64, o que quer que esteja
funcionando.
Se você estiver no Unix e no Linux, esse caminho não precisa necessariamente ser definido.
Outra coisa importante é que, nas opções do compilador, você deve certificar-se de que está
compilando para depuração, de modo que o Dash G dwarf esteja no dash o para otimização.
Mais uma vez, no Windows, essas coisas precisam ser definidas para que as informações de depuração sejam fornecidas junto
com o executável.
Você também precisa se certificar de que está compilando para o modo de depuração.
Portanto, você precisa ter certeza de que a depuração está selecionada e não a liberação.
Quando todos esses itens estiverem configurados corretamente, você poderá usar o depurador e a luz de
código.
Se tiver algum problema com isso, volte ao meu vídeo sobre a configuração em sua plataforma.
O depurador e o Code Light.
O conceito mais importante relacionado ao depurador é a ideia de um ponto de interrupção.
Portanto, um ponto de interrupção é algo que você pode definir em seu programa para interromper a execução
do código.
Basicamente, você pode dizer: "Ei, quero parar nesta linha e seu programa,
quando você executar o depurador, parará nessa linha".
Ele permite que você percorra seu código uma linha por vez para tentar diagnosticar e corrigir qualquer problema que possa
existir.
Normalmente, quando você executa seu programa, se tentar executá-lo no depurador e não tiver um ponto de interrupção definido,
nada acontecerá.
Então, normalmente, quando você constrói, você sabe, pode ir e construir seu projeto como
qualquer outro projeto, ir para construir, ir para construir o projeto.
Quando você o constrói e o executa no modo de depuração, é necessário ir até a opção de menu do depurador
e ir para iniciar, continuar o depurador.
E quando você executar isso novamente, se tiver um ponto de interrupção definido, ele será atingido.
Se você não tiver um ponto de interrupção definido, ele simplesmente será executado.
Portanto, se tentarmos executar esse programa no modo de depuração, ele simplesmente aparecerá e pedirá enter, pois
parará exatamente nos números e, em seguida, você digitará alguns números e ele simplesmente fechará.
Ele nem mesmo imprime as informações, certo?
Portanto, se quiser usar o depurador, é muito importante que você tenha pelo menos um ponto de interrupção definido.
A maneira mais fácil de definir um ponto de interrupção é simplesmente clicar dentro da margem dos números de linha no número da linha em que você deseja
definir o ponto de interrupção.
E, novamente, um ponto de interrupção interromperá a execução nesse número de linha.
Portanto, se definirmos um ponto de interrupção ao lado da função printf na linha dez, basta clicar duas vezes e você verá
que um círculo vermelho será colocado.
Isso está dizendo ao depurador, ei, pare na linha dez.
Então, novamente, a maneira como iniciamos o depurador é ir até o depurador e dizer: start, continue, certo?
Todo o resto está meio acinzentado, certo?
Então, vamos iniciar o depurador apenas para atingir esse ponto de interrupção.
Então, vamos começar a continuar o depurador e vamos dizer construir e depurar e você
perceberá que o programa para na linha dez.
Você vê a seta verde e também vê que o painel do depurador apareceu.
Portanto, se você for para a visualização, poderá abrir o painel do depurador manualmente ou automaticamente
quando entrar no modo de depuração, e o painel do depurador tem muitas guias diferentes para informações que podem ser vistas.
Você também pode examiná-lo por meio do depurador, acessando as janelas do GDB, para ver todos os que estão
marcados.
Há muitas janelas do depurador que você pode examinar.
Portanto, os locais geralmente têm a ver com os relógios de variáveis locais.
Você pode colocar um relógio em uma variável para que, se a variável for alterada, ele apareça.
A saída deve ser usada para diferentes opções de depuração e threads de saída.
Na verdade, você pode ver os threads que estão executando seu programa.
Nosso foco é o conceito mais avançado de Callstack.
Basicamente, examinamos a pilha de chamadas e os locais.
Esses são os dois mais importantes que o ajudam na depuração, depois a memória e os pontos de interrupção.
Você pode ver onde os pontos de interrupção estão definidos.
Portanto, há muitas opções diferentes.
No momento, estamos parados na linha dez.
Podemos examinar a pilha de chamadas.
A pilha de chamadas nos mostra que a função principal é chamada.
Se olharmos para os locais, ele nos mostra três variáveis: zero, um e zero.
Na verdade, não inserimos nenhuma informação nesses dados, que são inicializados em zero, um e zero.
O relógio é que você pode realmente adicionar.
Adicione pressionando o sinal de mais para adicionar um relógio em uma variável específica.
E outra coisa importante a ser observada é que, quando você executa no modo de depuração, agora você tem a barra
de ferramentas do depurador, certo?
O botão de reprodução continuará.
Assim será.
Se eu apertar play, ele simplesmente sairá do programa, certo?
Ele simplesmente começará a funcionar.
Na verdade, o programa solicitará a entrada de dados.
Então, apertei o play.
Volto ao aplicativo do console e ele diz Enter.
Assim, atingi meus três números nas execuções do programa.
Então você ainda não viu a função de impressão.
A janela simplesmente desapareceu.
Então, mais uma vez, executamos no modo de depuração e ele vai para o ponto de interrupção novamente, o painel do depurador aparece e ele
para na linha dez.
Agora, a barra de ferramentas é importante porque é assim que você pode percorrer
o código e usar a barra de ferramentas ou ir até o depurador e ver todas as opções aqui.
Portanto, você pode dizer que a instrução step into step into next, next instruction, step out, step into entrará
em uma função.
Se uma função estiver sendo chamada nessa linha, a instrução step into vai mais para o tipo de linguagem
assembly.
Em seguida, passaremos por essa linha de código.
E a instrução do pescoço é mais ou menos a mesma coisa.
Step out, tenta sair de uma função se você já estiver em uma e pular para a linha da cenoura.
Na verdade, acho que vai para o cursor.
O mesmo acontece com a corrida para a linha da cenoura.
Você pode ativar e desativar pontos de interrupção, desativar todos eles, tudo isso para que possa acessá-los
pelo menu.
Ou ainda, a barra de ferramentas.
Normalmente, uso a barra de ferramentas porque ela já está instalada.
E, se você observar as diferentes janelas novamente, os locais chamam a pilha e os pontos de interrupção.
Realmente os mais importantes.
Isso diz que tenho um ponto de interrupção na linha dez.
E então eu acho que um diz apenas o cursor.
Então, agora parei aqui no print F enter na linha dez.
Posso ir para a próxima instrução e isso irá para a linha 11 de verificação.
F é, na verdade, uma função de bloqueio que solicita entrada.
Portanto, se eu tentar ir para o próximo ponto, ele faz uma espécie de pausa.
Talvez você precise pressionar next várias vezes.
O que eu geralmente faço quando o programa está solicitando uma entrada e eu quero que ele seja bloqueado, interrompido e eu
quero que ele vá para a próxima etapa.
Vou colocar um ponto de interrupção na próxima linha e apertar o botão play.
Então, agora eu pressiono o botão play e nada acontece porque ele está aguardando a entrada.
No programa, está escrito Enter.
Então, aqui eu posso apertar cinco, seis, sete, apertar o botão Enter e agora ele atinge meu ponto de parada.
Portanto, agora estamos no botão de impressão, onde podemos realmente acessar a função de impressão.
E, na verdade, primeiro ele saltará para a função média.
Portanto, se dissermos "step into", veremos que vamos para a função média.
E o que você notará é que, se olhar para suas variáveis, poderá ver que elas estão mudando.
Portanto, se você for para a próxima linha, irá para a próxima linha em 27, depois para 28 e continuará batendo.
Em seguida, você realmente salta e está no final da função.
Então, você pode pressionar play e ver que o programa foi concluído e a janela desapareceu.
Mas você pode analisar suas variáveis, pode analisar todo o resto.
Portanto, novamente, você também pode colocar um ponto de interrupção dentro da função de impressão bem aqui.
E se fizermos isso, poderemos ver novamente que a função de impressão interromperá a execução em vez da
média.
E então podemos ver o que está acontecendo na realidade se passarmos para o aplicativo,
e você poderá ver que as informações foram impressas.
Certo?
Quando você continua, quando corre até o fim, obtém a instrução return e o programa é encerrado.
Portanto, é importante que, se você quiser ver o resultado do programa, coloque um ponto de
interrupção antes desse retorno e não precise continuar.
Você pode parar o depurador pressionando o retângulo vermelho, pausar o depurador pressionando as duas
barras paralelas, reiniciar o depurador com essa opção e a pilha de chamadas.
Novamente, é mais fácil ver aqui se você entrar em uma função e executar o depurador, vamos executar o depurador novamente.
Diga debugger, start, continue.
E quando atingirmos esse ponto de interrupção depois de inserir informações dentro de uma função, você verá que a pilha
de carros tem o main e o print, como mostramos anteriormente.
Assim, você pode ver a última função que foi invocada. Agora, com um programa que tem muitas funções e assim por diante,
a pilha de chamadas pode ficar muito maior do que isso.
A única outra coisa que pode ser importante são os pontos de interrupção.
Se você quiser ver quais pontos de interrupção foram definidos, ele mostrará todos os pontos de interrupção e o programa inteiro onde
eles estão localizados.
Mas você terá que brincar com ele, familiarizar-se com ele, sentir-se confortável com ele e usá-lo com frequência para problemas
que você não consegue resolver com técnicas ou programas básicos de depuração.
O Crash vai linha por linha.
E, à medida que você avança linha por linha, é possível ver o programa sair quando ele travar
e você saberá em que linha isso ocorreu.
Novamente, este é um programa pequeno, mas você deve ter uma compreensão básica de como funciona a depuração.
Mais uma vez, espero que isso tenha sido útil.
A melhor maneira de aprender esse material é começar a brincar com ele e começar a usá-lo.
Mostre um dos programas em que você trabalhou em seu desafio anterior.
Adicione um ponto de interrupção, muito simples.
Basta clicar com o botão direito do mouse dentro do objeto para adicionar pontos de interrupção.
Inicie-o no modo de depuração e percorra cada linha para ver como as variáveis mudam e como a pilha
de chamadas aumenta.
Se você tiver funções maiores.
Obrigado.