# aturar el programa per mirar-hi dins

Depuració en Python amb pdb

El mateix concepte que gdb, amb comandes gairebé idèntiques — i un contrast real: on C corromp un resultat en silenci, Python sol aturar-se amb un error clar a l'instant.

breakpoint()

Python no necessita cap flag especial en compilar (no hi ha compilació!). N'hi ha prou amb escriure breakpoint() allà on vulguis que el programa s'aturi.

def quadrat(n):
    breakpoint()
    resultat = n * n
    return resultat

En arribar-hi, el programa s'atura i obre una consola (Pdb) interactiva, just com gdb després d'un break + run — només que aquí no calen dues comandes separades: n'hi ha prou d'arribar a aquesta línia.

Comandes de pdb

Deliberadament quasi idèntiques a les de gdb.

ComandaFa
n (next)executa la línia actual i avança, sense entrar a funcions
s (step)igual, però entrant-hi
p <expressió> (print)mostra un valor
c (continue)reprèn l'execució fins al pròxim breakpoint() o fins que acabi
l (list)mostra el codi al voltant de la línia actual
q (quit)surt de pdb

Depuració post-mortem

Quan un programa peta amb una excepció, pots executar-lo sota pdb des del principi i, en petar, et quedes dins la depuració exactament al punt de l'error — sense haver d'afegir cap breakpoint() al codi.

python3 -m pdb programa.py

Això obre pdb aturat just abans d'executar res; escrius c (continue) perquè corri amb normalitat, i si el programa llança una excepció no capturada, pdb t'hi deixa aturat a l'instant, amb totes les variables d'aquell moment a mà.

Taula de referència

gdbpdbFa
breakbreakpoint() al codiatura l'execució en un punt
run(arrencar l'script normalment)comença l'execució
next / stepn / savançar una línia
printpmostrar un valor
continuecreprendre l'execució
quitqsortir

Una sessió real de pdb, pas a pas

Aquestes dues sessions són transcripcions de pdb executant-se de debò — inclosos els valors exactes que va mostrar.

Sessions de pdb

Codi

Variables

NomValor

Sessió de pdb

Pas 1 / 1

Problemes per resoldre

Sense solució: executa cada script amb python3 -m pdb programa.py (o afegint breakpoint() tu mateix) i troba el bug. Les pistes són plegades perquè les obris només si les necessites.

1. Un bucle que no avança

Aquest script s'hauria de quedar penjat (bucle infinit):

i = 0
while i < 5:
    print(i)

Fes servir pdb per confirmar per què i mai arriba a 5.

Pistes

Afegeix breakpoint() dins del bucle, i fes diversos n seguits de p i cada cop.

Veuràs que i val sempre 0: li falta un i += 1 dins del bucle.

2. Un altre fora de rang

Aquesta funció hauria de trobar el valor més gran d'una llista, però peta:

def maxim(v, mida):
    m = v[0]
    for i in range(mida + 1):
        if v[i] > m:
            m = v[i]
    return m

Fes servir python3 -m pdb programa.py i c per aturar-te just a l'excepció, i troba el bug.

Pistes

Un cop aturat a l'excepció, p i i p mida et diran exactament on ha fallat — és el mateix tipus d'error que vas veure a l'execució pas a pas.

3. Una variable sense inicialitzar

Aquest script tampoc no arriba a executar-se:

def suma():
    total = total + 1
    return total

print(suma())
Pistes

Executa'l amb python3 -m pdb programa.py i c. Llegeix l'error amb calma: UnboundLocalError — Python no deixa fer servir una variable local abans d'haver-li assignat cap valor, a diferència de C, que l'hauria deixat passar amb un valor de brossa.

Exercicis d'autoavaluació

Aquests es generen amb valors nous a l'atzar i tenen solució comprovable.

—

Un cop el programa s'atura a breakpoint(), quin valor mostrarà aquest p?