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.
| Comanda | Fa |
|---|---|
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
| gdb | pdb | Fa |
|---|---|---|
break | breakpoint() al codi | atura l'execució en un punt |
run | (arrencar l'script normalment) | comença l'execució |
next / step | n / s | avançar una línia |
print | p | mostrar un valor |
continue | c | reprendre l'execució |
quit | q | sortir |
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
| Nom | Valor |
|---|
Sessió de pdb
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?