MEU PROGRAMA NÃO FUNCIONA! E...
Transcript of MEU PROGRAMA NÃO FUNCIONA! E...
![Page 1: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/1.jpg)
MEU PROGRAMANÃO FUNCIONA! E
AGORA?P R O F. PA U L O H E N R I Q U E P I S A N I
P R O F. M O N A E L P I N H E I R O R I B E I R O
U N I V E R S I D A D E F E D E R A L D O A B C ( U F A B C )
19/junho/2018
![Page 2: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/2.jpg)
Error!
Segmentation fault!
?
![Page 3: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/3.jpg)
Error!
Segmentation fault!
?
Sei lá qual é o
problema! Esse
código está
muito confuso!!!
![Page 4: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/4.jpg)
Error!
Segmentation fault!
?
Quer saber,
vou reescrever
tudo!!!
![Page 5: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/5.jpg)
Error!
Segmentation fault!
?
Quer saber,
vou reescrever
tudo!!!NNÃÃÃÃÃÃÃÃÃÃÃÃÃOOOOOO!!!!!!!!!!
Neste curso, vamos discutir técnicas para evitar e
encontrar erros/bugs;
Muitas vezes, é inviável reescrever um sistema
existente (além disso, a própria reescrita pode
gerar outros erros…)
![Page 6: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/6.jpg)
TÓPICOS
• Medidas proativas - Prevenção de erros/bugs:
– “Programação defensiva”
– Testes unitários
• Medidas reativas - Depuração:
– “Raiz”
– “Nutella”
![Page 7: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/7.jpg)
P R E V E N Ç Ã O D E B U G SP R O G R A M A Ç Ã O D E F E N S I VA , T E S T E S
U N I T Á R I O S
![Page 8: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/8.jpg)
https://xkcd.com/1700/
Material do curso:
http://professor.ufabc.edu.br/~paulo.pisani/abcdebug/
![Page 9: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/9.jpg)
VAMOS NOS DEFENDER PRIMEIRO!
• Programação defensiva (Blunden, 2012):
medidas proativas para evitar erros;
• Quando programar, você deve se defender de
seus erros e de erros de outros programadores!
![Page 10: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/10.jpg)
PROGRAMAÇÃO DEFENSIVA
• Princípio fundamental:
– Permitir o uso/teste de componentes/módulos do programade forma independente!
• Alta coesão;
• Baixo acoplamento;
• Limitar escopo de variáveis (evitar variáveis globais);
• Evitar efeitos colaterais;
• Verificar validade dos argumentos;
• Verificar tamanho/limites dos tipos de dados;
• Inicialize todas as variáveis;
• Evite valores “hardcoded”;
• Programa deve falhar de forma “elegante”.
Exemplo a seguir
![Page 11: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/11.jpg)
EXEMPLO• Escreva um método que converta
um número decimal (int) em binário;
public static void convBinarioPrint(int numero) {if (numero == 0) return;
convBinarioPrint(numero / 2);System.out.print(numero % 2);
}
public static String convBinarioStr(int numero) {if (numero == 0) return "";
return convBinarioStr(numero / 2) + (numero % 2);}
System.out.print(convBinarioStr(25));
convBinarioPrint(25);Chamada do método:
Chamada do método:
Solução 1
Solução 2
![Page 12: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/12.jpg)
EXEMPLO• Escreva um método que converta
um número decimal (int) em binário;
public static void convBinarioPrint(int numero) {if (numero == 0) return;
convBinarioPrint(numero / 2);System.out.print(numero % 2);
}
public static String convBinarioStr(int numero) {if (numero == 0) return "";
return convBinarioStr(numero / 2) + (numero % 2);}
System.out.print(convBinarioStr(25));
convBinarioPrint(25); SystemChamada do método:
Chamada do método:
Solução 1
Solução 2
Qual solução é melhor?
![Page 13: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/13.jpg)
PROGRAMAÇÃO DEFENSIVA
• Princípio fundamental:
– Permitir o uso/teste de componentes/módulos do programade forma independente!
• Alta coesão;
• Baixo acoplamento;
• Limitar escopo de variáveis (evitar variáveis globais);
• Evitar efeitos colaterais;
• Verificar validade dos argumentos;
• Verificar tamanho/limites dos tipos de dados;
• Inicialize todas as variáveis;
• Evite valores “hardcoded”;
• Programa deve falhar de forma “elegante”.
![Page 14: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/14.jpg)
PROGRAMAÇÃO DEFENSIVA
• Nomes representativos para variáveis/parâmetros;
• Adotar um guia de estilo de codificação;
• Atualizar comentários inline (e.g. javadoc):
– Programas sao atualizados com frequência e rapidamente a documentação pode tornar-se desatualizada.
• Código que necessita de muita documentaçãoprovavelmente precisa ser reescrito;
• Comentários não devem ser longos, assim tornam-se maisobjetivos e facilitam sua atualização com o tempo.
Exemplo a
seguir
![Page 15: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/15.jpg)
EXEMPLO
public static void processaVetor(int[] v) {for (int i1 = 0; i1 < v.length-1; i1++) {int aux1 = i1;int aux2 = v[i1];for (int i2 = i1+1; i2 < v.length; i2++) {if (v[i2] < aux2) {aux1 = i2;aux2 = v[i2];}}v[aux1] = v[i1];v[i1] = aux2;}}
O que esse método faz?
![Page 16: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/16.jpg)
EXEMPLO
O que esse outro método faz?
public static void ordenaSelecao(int[] v) {for (int i = 0; i < v.length-1; i++) {
int indiceMenor = i;int valorMenor = v[i];for (int k = i+1; k < v.length; k++) {
if (v[k] < valorMenor) {indiceMenor = k;valorMenor = v[k];
}}v[indiceMenor] = v[i];v[i] = valorMenor;
}}
![Page 17: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/17.jpg)
PROGRAMAÇÃO DEFENSIVA
• Nomes representativos para variáveis/parâmetros;
• Adotar um guia de estilo de codificação;
• Atualizar comentários inline (e.g. javadoc):
– Programas sao atualizados com frequência e rapidamente a documentação pode tornar-se desatualizada.
• Código que necessita de muita documentaçãoprovavelmente precisa ser reescrito;
• Comentários não devem ser longos, assim tornam-se maisobjetivos e facilitam sua atualização com o tempo.
![Page 18: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/18.jpg)
TESTES UNITÁRIOS
• Além de seguir os princípios da programação
defensiva, testes unitários podem ajudar a
encontrar erros antes de entregar um software
ao cliente!
• Teste unitário: teste de cada componente de
um sistema (geralmente automatizado).
![Page 19: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/19.jpg)
D E P U R A Ç Ã O
![Page 20: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/20.jpg)
Ok, perfeito, tudo isso parece
muito legal.
Mas e quando encontro um
erro em sistemas já
existentes???
![Page 21: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/21.jpg)
MAS É UM BUG MESMO?
• Primeiro temos que averiguar se é
um erro/bug;
• Alguns problemas são na verdade
resultado de uso incorreto;
– Por exemplo, a função
carregaDados não funciona
com esse arquivo do Excel! (a
função exige um arquivo CSV,
mas foi usada com um arquivo
XLS)
![Page 22: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/22.jpg)
Bom, agora que
sabemos que é um
bug/erro… vamos
solucioná-lo!!!
![Page 23: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/23.jpg)
FONTES COMUNS DE BUGS
• Falta de inicialização de variáveis;
• Ponteiros inválidos;
• Problemas de sincronização de threads.
![Page 24: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/24.jpg)
ESTRATÉGIAS
• Primeiro: reproduzir o erro!
• Verificar mudanças recentes (sistemas de
controle de versão são muito úteis nesse caso)
– Estratégia incremental;
– Estratégia da busca binária;
• Quando encontrar o erro, aplique as correções aos
poucos:
– Se o problema continuar, haverá muitos suspeitos!
![Page 25: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/25.jpg)
https://xkcd.com/1739/
![Page 26: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/26.jpg)
D E P U R A Ç Ã O“R A I Z”
![Page 27: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/27.jpg)
PRINTF
• Incluir registros da sequência de execução (pode
ser com printf mesmo!);
– Dessa forma, podemos acompanhar a sequência de
prints e identificar a região do erro;
– Além de marcar pontos chave, os prints podem
mostrar valores de variáveis importantes ao longo
da execução.
![Page 28: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/28.jpg)
PRINTF
• Exemplo: programa atletas;
– Primeiro passo: verificar em que parte o programa
para;
– Depois: verificar se entrada está correta;
– Isolar fonte do erro;
– Corrigir!
![Page 29: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/29.jpg)
PROGRAMA ATLETAS
Arquivo: atletas.c
Dados os nomes, sexo, altura e peso de
500 atletas calcular a média da altura dos
atletas e a média do peso das atletas.
![Page 30: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/30.jpg)
PROGRAMA ATLETAS
• Princípios de programação defensiva
quebrados:
– Valores “hardcoded”;
– Verificar validade de argumentos.
![Page 31: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/31.jpg)
PROGRAMA SORVETERIA
Arquivo: sorveteria.c
![Page 32: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/32.jpg)
PROGRAMA SORVETERIA
• Redirecionamento de entrada:
– Facilita testes com muitas entradas/saídas;
– Podemos usar um programa para ver as diferenças nas
sáidas (diff, WinMerge, FC, etc).
• Princípios de programação defensiva
quebrados:
– Verificar tamanho/limites dos tipos de dados.
![Page 33: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/33.jpg)
PROGRAMA LISTA LIGADA
Arquivo: listaligada.c
![Page 34: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/34.jpg)
PROGRAMA LISTA LIGADA
• Princípios de programação defensiva
quebrados:
– Inicialize todas as variáveis;
![Page 35: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/35.jpg)
DEPURAÇÃO RAIZ - LOGGING
• Registro de execução (logging);
– Pode ser ativado/desativado;
– O logging auxilia na depuração, pois serve como
indicador da localização de erros.
• Sempre registrar:
– Origem: Módulo/Função ou Classe/método
– Tipo: Erro / Trace
– Mensagem
![Page 36: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/36.jpg)
D E P U R A Ç Ã O“NUTELLA”U S A N D O U M D E P U R A D O R
![Page 37: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/37.jpg)
O QUE É UM DEPURADOR?
• Permite observar o funcionamento de um
programa sem influenciar seu fluxo de execução;
– Em C, um depurador comum é o GDB;
– Geralmente, ambientes de desenvolvimento possuem
depuradores integrados (Eclipse, Visual Studio,
NetBeans, CodeBlocks, etc).
![Page 38: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/38.jpg)
DEPURADOR
• Alguns recursos comuns oferecidos por
depuradores:
– Execução linha a linha;
– Breakpoints;
– Watches;
– Pilha de chamadas (call stack).
![Page 39: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/39.jpg)
BREAKPOINT
• Interrompe a execução do
programa na linha
especificada pelo breakpoint
e retorna para o depurador;
• A partir de um breakpoint,
podemos examinar os valores
de variáveis, seguir linha a
linha, por exemplo.
![Page 40: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/40.jpg)
EXECUÇÃO LINHAA LINHA
• Start/Continue
• Step over (next line)
• Step into
• Step out
• Stop
![Page 41: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/41.jpg)
WATCHES
• Mostra o valor de variáveis
e expressões;
• Dessa forma, podemos
acompanhar mudanças
em variáveis chave, que
podem indicar a origem de
um bug.
![Page 42: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/42.jpg)
PROGRAMA ORDENAÇÃO
Arquivo: ordenacao.c
![Page 43: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/43.jpg)
PROGRAMA ORDENAÇÃO
• Princípios de programação defensiva
quebrados:
– Limitar escopo de variáveis (evitar variáveis globais);
– Baixo acoplamento;
![Page 44: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/44.jpg)
PROGRAMA ARVOREBINÁRIA DE BUSCA
Arquivo: abb.c
![Page 45: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/45.jpg)
PROGRAMA ÁRVOREBINÁRIA DE BUSCA
• Princípios de programação defensiva
quebrados:
– Inicialize todas as variáveis.
![Page 46: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/46.jpg)
PROGRAMA MISTÉRIO
Arquivo: misterio.c
![Page 47: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/47.jpg)
VALGRIND
• Ferramenta de análise que pode detectar
vazamentos de memória (memory leaks), acessos
a áreas de memória indevidas, etc.
valgrind ./misterio.exe –v –leak-check=full
valgrind ./abb.exe –v –leak-check=full
![Page 48: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/48.jpg)
M A S Q U A L E S T R AT É G I AD E V O U S A R ?
![Page 49: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/49.jpg)
DEPURAÇÃO: RAIZ VS NUTELLA
DEPURAÇÃO “RAIZ”
• printf
• printf
• printf, printf, printf
• Coloca para executar
DEPURAÇÃO “NUTELLA”
• Breakpoints
• Watches
• Step over, step into, step out
• Coloca para “debugar”
Figura da esquerda: https://www.freeimages.com/photo/grandcomputer-2-1243223
Figura da direita: https://www.istockphoto.com/br/foto/3-d-moderno-computador-local-de-trabalho-
gm480393652-68699345?irgwc=1&esource=AFF_IS_IR_SP_FreeImages_246195&asid=FreeImages&cid=IS
![Page 50: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/50.jpg)
MAS QUAL ESTRATÉGIADEVO USAR?
• Depuração “raiz”:
– Não precisa de depurador;
– Geralmente mais rápida para testar (não precisa ir linha a linha).
• Depuração “nutella”:
– Requer acesso a um depurador;
– Permite um controle melhor do programa (execução linha a linha, watches);
• Uma estratégia possível é uma combinação dos doistambém:
– Depuração “raiz” pode ser usada para encontrar a região do problema e então depuração “nutella” pode ser aplicada nestaregião.
![Page 51: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/51.jpg)
https://xkcd.com/1316/
![Page 52: MEU PROGRAMA NÃO FUNCIONA! E AGORA?professor.ufabc.edu.br/~paulo.pisani/abcdebug/eagora_abc_2018.pdf · PROGRAMAÇÃO DEFENSIVA •Nomes representativos para variáveis/parâmetros;](https://reader035.fdocumentos.com/reader035/viewer/2022070905/5f75e1ecf2574d6d561a430e/html5/thumbnails/52.jpg)
REFERÊNCIAS
• Bill Blunden. Software Exorcism: A Handbook for Debugging and Optimizing Legacy Code. Apress, 2012.
• Donald E. Knuth. The Art of Computer Programming. Addison-Wesley, 1973.
• Robert Sedgewick. Algorithms in C, Parts 1-4: Fundamental Algorithms, Data Structures, Sorting, Searching. Addison-Wesley Professional, 1997.
• Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest; Clifford Stein. Introduction to Algorithms. MIT Press, 2009.