Técnicas de Depuração de Código

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Código nunca é perfeito. Você sempre terá bugs (erros). A depuração de código é uma habilidade que você precisa aprender.

Dicas de Depuração

Então, seu programa travou...

$ python3 blah.py
Traceback (most recent call last):
  File "blah.py", line 13, in ?
    foo()
  File "blah.py", line 10, in foo
    bar()
  File "blah.py", line 7, in bar
    spam()
  File "blah.py", 4, in spam
    line x.append(3)
AttributeError: 'int' object has no attribute 'append'

E agora?!

Lendo Tracebacks

A última linha é a causa específica da falha (crash).

## Cause of the crash

No entanto, nem sempre é fácil de ler ou entender.

DICA PROFISSIONAL: Cole o traceback inteiro no Google.

Usando o REPL

Use a opção -i para manter o Python ativo ao executar um script.

$ python3 -i blah.py
Traceback (most recent call last):
  File "blah.py", line 13, in ?
    foo()
  File "blah.py", line 10, in foo
    bar()
  File "blah.py", line 7, in bar
    spam()
  File "blah.py", 4, in spam
    line x.append(3)
AttributeError: 'int' object has no attribute 'append'
>>>

Ele preserva o estado do interpretador. Isso significa que você pode investigar após a falha (crash), verificando os valores das variáveis e outros estados.

Depuração com Print

A depuração com print() é bastante comum.

Dica: Certifique-se de usar repr()

def spam(x):
    print('DEBUG:', repr(x))
    ...

repr() mostra uma representação precisa de um valor. Não a saída de impressão bonita.

>>> from decimal import Decimal
>>> x = Decimal('3.4')
## NO `repr`
>>> print(x)
3.4
## WITH `repr`
>>> print(repr(x))
Decimal('3.4')
>>>

O Depurador Python

Você pode iniciar manualmente o depurador dentro de um programa.

def some_function():
    ...
    breakpoint()      ## Enter the debugger (Python 3.7+)
    ...

Isso inicia o depurador na chamada breakpoint().

Em versões anteriores do Python, você fazia isso. Você às vezes verá isso mencionado em outros guias de depuração.

import pdb
...
pdb.set_trace()       ## Instead of `breakpoint()`
...

Executar sob o depurador

Você também pode executar um programa inteiro sob o depurador.

$ python3 -m pdb someprogram.py

Ele entrará automaticamente no depurador antes da primeira instrução. Permitindo que você defina breakpoints (pontos de interrupção) e altere a configuração.

Comandos comuns do depurador:

(Pdb) help            ## Get help
(Pdb) w(here)         ## Print stack trace
(Pdb) d(own)          ## Move down one stack level
(Pdb) u(p)            ## Move up one stack level
(Pdb) b(reak) loc     ## Set a breakpoint
(Pdb) s(tep)          ## Execute one instruction
(Pdb) c(ontinue)      ## Continue execution
(Pdb) l(ist)          ## List source code
(Pdb) a(rgs)          ## Print args of current function
(Pdb) !statement      ## Execute statement

Para breakpoints, a localização é uma das seguintes.

(Pdb) b 45            ## Line 45 in current file
(Pdb) b file.py:45    ## Line 45 in file.py
(Pdb) b foo           ## Function foo() in current file
(Pdb) b module.foo    ## Function foo() in a module

Exercício 8.4: Bugs? Que Bugs?

Ele roda. Envie!

Resumo

Parabéns! Você concluiu o laboratório de Debugging (depuração). Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.