52
MEU PROGRAMA NÃO FUNCIONA! E AGORA? PROF. PAULO HENRIQUE PISANI PROF. MONAEL PINHEIRO RIBEIRO UNIVERSIDADE FEDERAL DO ABC (UFABC) 19/junho/2018

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;

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

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;

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;

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;

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;

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;

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;

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;

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://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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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://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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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;

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://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;

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.