Cómo depurar un programa Python con pdb

Introducción

En este artículo vamos a explicar cómo depurar un programa Python usando el módulo pdb de la biblioteca estándar. Si no sabes qué es exactamente depurar un programa o para qué te puede servir, sigue leyendo.

Depurar consiste en seguir el flujo de un programa a medida que se ejecuta, de forma que podemos monitorizar qué es lo que está sucediendo en cada momento. Es un método muy efectivo para encontrar fallos, porque:

  • Permite detener momentáneamente la ejecución del programa usando puntos de ruptura (breakpoints).
  • Permite examinar en cada momento las variables que se están utilizando (no necesitas llenar tu código de print).
  • Permite cambiar el valor de una variable mientras está detenida la ejecución.

Si es la primera vez que oyes hablar de esto, en seguida descubrirás el mundo de posibilidades que ofrece la depuración.

Puedes leer online la documentación del módulo pdb.
En esta entrada se ha usado python 3.3.2.

Primeros pasos

Vamos a utilizar este programa extraído del libro «Dive into Python 3»:

Que simplemente produce la siguiente salida:

La forma más directa de iniciar el depurador es con la línea:

De acuerdo, ¿qué acaba de suceder? Nos encontramos con un intérprete interactivo esperando órdenes, y la línea que empieza por -> es la línea donde se encuentra detenida la ejecución ahora mismo.

Lo primero que observamos es que podemos ejecutar cualquier instrucción Python que queramos:

Para mostrar una lista de comandos disponibles, escribimos help. También podemos mostrar la ayuda de cada comando individial:

Como se puede leer, podemos usar el comando list para examinar el código fuente del archivo que estamos ejecutando. La primera vez que lo ejecutemos sin argumentos mostrará las 11 primeras líneas y marcará con -> la línea actual, y si seguimos ejecutándolo proseguirá avanzando. Veamos:

Ahora, un par de trucos:

  • ¿Has visto que, al mostrar la lista de comandos, había muchos con una sola letra? Lo que sucede es que son atajos: por ejemplo, l es un atajo para list, así que no tienes que escribir el comando entero.
  • Para repetir el último comando introducido, simplemente presiona Enter. Si quieres repetir el comando list tres veces, introduce l una vez y Enter otras dos. Más fácil imposible 🙂

Por ejemplo, para mostrar dónde estamos detenidos podemos usar el comando where o simplemente w:

Si queremos cerrar el depurador usaríamos quit, y si queremos que el programa continue hasta el final, usaremos continue o c:

El programa termina, se reinicia y estamos en el mismo punto que antes. De momento no hemos hecho nada demasiado interesante: comencemos 😉

Flujo e inspección de variables

Ahora, ¿cómo conseguimos ir avanzando en el flujo de ejecución? Para ello tenemos dos comandos: step (s) y next (n). Ambos ejecutan una línea del programa y avanzan a la siguiente, con la diferencia de que step se introduce dentro de las funciones cuando se invoca alguna. Volviendo a nuestro ejemplo:

Hemos ido ejecutando las líneas una a una, y al llegar a la línea print y usar next se ha ejecutado también y ha saltado a la siguiente. Si para la siguiente línea print usamos step, nos introduciremos en el cuerpo de la función approximate_size y seguiremos depurando desde ahí:

Estamos ahora en esa línea y no sabemos lo que va a suceder. ¿Cómo averiguamos el valor de una variable? Usando el comando print (p):

Y si ahora nos apetece salir del cuerpo de la función y volver al programa principal, escribimos return (r):

Puntos de ruptura

Imagina que tienes un programa muy largo y no quieres ir línea por línea desde el principio hasta el punto que te interesa. Para eso existen los puntos de ruptura: si estableces un punto de ruptura en una línea, el comando continue ejecutará el programa sin depuración hasta que encuentre uno, y entonces se detendrá. Si vuelves a usar continue el depurador se volverá a detener en el siguiente punto de ruptura, y así sucesivamente hasta que ya no queden y el programa finalice, como vimos al principio del artículo.

Para establecer un punto de ruptura se utiliza el comando break (b):

Hemos establecido un punto de ruptura en la línea 21 del programa, y a continuación el depurador lo ha ejecutado hasta llegar a dicha línea. Y a partir de ahí todo funciona igual que antes 🙂

Otra forma de establecer un punto de ruptura en tu programa es incluir la siguiente línea:

De este modo, al ejecutarlo saltará el depurador directamente:

¿Te ha ayudado esto a encontrar ese error que se te resistía? Cuéntanos en los comentarios 🙂

¡Un saludo!

10 pensamientos sobre “Cómo depurar un programa Python con pdb”

  1. Muy buen articulo! muy completo .. muchos IDE traen un alias para cuando escribes “debug” te agregue la linea de pdb… en vim (mi editor) yo la bindee asi en el .vimrc:
    au FileType python iab debug import pdb; pdb.set_trace()

  2. Antony Petrocelli

    Hermano buen aporte, siempre me había negado a usar el depurador de python por lo complejo que se veía y me conformaba con los print, pero se hizo muy tedioso poner y quitar print aqui y allá ademas que consume más tiempo, con esta intro que has dado, me doy cuenta que es muy fácil depurar con pdb, gracias, saludo desde Venezuela.

    1. Muchas gracias por tu comentario Antony 🙂 Lo bueno de aprender a usar pdb es que los mismos conceptos te valen para depurar casi todos los lenguajes que existen. Por cierto, ¿sabes que está resurgiendo la comunidad Python en Venezuela? http://www.python2.org.ve/ ¡Saludos desde España!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

one + one =