Debugging (Depuração)

O processo de depuração (ou debugging) é a técnica usada para identificar, localizar e corrigir erros (bugs) no código de um programa. 

O pdb (Python Debugger) é o depurador embutido no Python. Ele é uma ferramenta poderosa para investigar e corrigir problemas em seu código, permitindo que você execute o código linha a linha, inspecione variáveis, avalie expressões e controle o fluxo de execução.

pdb comandos:
Comando Descrição
help Mostra os comandos disponíveis.
list Mostra o código-fonte ao redor da linha atual.
step ou s Avança uma linha e entra em chamadas de funções.
next ou n Avança para a próxima linha no mesmo nível de chamada.
continue ou c Continua a execução até o próximo ponto de parada ou o final.
print ou p Imprime o valor de uma variável ou expressão.
quit ou q Sai do depurador.

No VSCODE, em seu projeto, já logado na venv, é possivel confgurar a ferramenta de debug. clicando em create a launch.json file é possivel escolher um interpretador para o debug, tendo em vista que deve ter as extensões python da microsot e/ou django instalado em seu projeto, para selecionar como debug. Lembrando que para usar o Django é necessário estar instalado no projeto.

Se for usar o django escolha a opção more python debugger etc....

Segue-se os Passos para debugar um código:

    A. Descrever o Problema

    Descreva completamente o problema ocorrido, esse é o primeiro passo para identificar erros.

launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Streamlit: Run app",
            "type": "debugpy",
            "request": "launch",
            "module": "streamlit",
            "args": [
                "run",
                "${workspaceFolder}/app.py"
            ],
            "console": "integratedTerminal"
        }
    ]
}

Exemplo de configuração do debbuger do VScode para aplicações streamlit. Lembrando que o arquivo launch.json encontra-se na pasta .vscode.

B. Reproduzir o bug

Processo de depuração é entender e replicar o erro em um ambiente controlado para observar diretamente o comportamento que leva ao problema. A ideia é criar ou encontrar as condições exatas em que o erro ocorre, para entender por que ele acontece e facilitar a identificação da causa.

reproduzir_bug.py
from random import randint

# lembre-se que listas começam com valor zero
dice_imgs = ["❶", "❷", "❸", "❹", "❺", "❻"]
dice_num = randint(1,6) 

# Irá gerar o erro apenas quando alcançar o numero 6
print(dice_imgs[dice_num])

O jeito de reproduzir o bug seria colocando vários números em dice_num para testar!

C. Simule o computador (play computer)

O princípio do play computer no contexto de um debugger é simular a execução do programa passo a passo, como se você fosse o próprio computador. A ideia é "brincar/jogar de ser o computador", manualmente seguindo o fluxo do código para compreender cada linha e observar mudanças nos valores das variáveis, condições de controle e fluxos de execução.

play_computer.py
year = int(input("What's your year of birth?"))
if year > 1980 and year < 1994:
    print("You are a millenial.")
elif year > 1994:
    print("You are a Gen Z.")
D. Corrigir o erro (Fix the error)

Você realiza modificações no código para resolver a causa raiz do problema.

fix_error.py
age = input("How old are you?")
if age > 18:
    print("You can drive at age {age}.")

Solução 1: converter em um inteiro para a verificação

Solução 2: usar f-string para imprimir a idade

 E. Eliminar bug com print (Squash a bug with print statements)

Significa utilizar instruções de impressão (como print() em Python, console.log() em JavaScript, ou System.out.println() em Java) para ajudar a depurar o código e entender o que está causando o bug. É uma abordagem comum para identificar e resolver erros ao imprimir informações no console ou terminal, fornecendo uma maneira de "rastrear" o que está acontecendo no código durante a execução.

squash_a_bug.py
pages = 0
word_per_page = 0
pages = int(input("Number of pages: "))
print(pages)
word_per_page == int(input("Number of words per page: "))
print(word_per_page)
total_words = pages * word_per_page
print(total_words)
F. Debugger

O debugger é uma ferramenta que permite pausar a execução do programa e examinar. 

debugger (pdb)
import pdb

x = [10, 20, 30]
y = 10
z = 30
print(y+z)

# Pausa o código e abre um terminal pdb para testar o que há de errado em outras linhas.
pdb.set_trace()

print(x+y)
def mutate(a_list):
    b_list = []
    for item in a_list:
        new_item = item * 2
    b_list.append(new_item)
    print(b_list)
mutate([1,2,3,5,8,13])

Coloque esse código no Python tutor.