Depuracion en Python




Antes de comenzar con el post quiero citar algo.
"También sabemos que este lenguaje es interpretado y no compilado. Sin embargo, internamente el interprete Python se encarga de generar una especie de ficheros binarios que son los que luego son ejecutados. Esto se realiza de forma oculta a partir del código fuente. Este código generado se le llama Bytecode y utiliza la extensión .pyc. De esta forma, el intérprete de Python genera Bytecode a partir del código fuente y lo ejecuta. Este proceso se realiza por cuestiones de eficiencia. Una vez que el fichero .pyc este generado, Python no vuelve a leer el código fuente, sino que lo ejecuta directamente y de esta forma ahorra tiempo." Antrax - Pg7  https://underc0de.org/talleres/Taller_Python3_1.pdf



Depuración

Para utilizar la depuración es necesario ejecutar la siguiente instrucción

python -m pdb nombrescript.py


python, idle, cmd


Se ingresa en un interprete donde es posible ejecutarse cualquier linea como si fuera el interprete de python, se puede utilizar el comando help


(Pdb) help

Documented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pp       run      unt
a      c          continue  exit    l     q        s        until
alias  cl         d         h       list  quit     step     up
args   clear      debug     help    n     r        tbreak   w
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where

Miscellaneous help topics:
==========================
exec  pdb

Inspección de  variables

Existen dos funciones que se pueden utilizar.
next y step 

La diferencia entre las dos es que next va realizando saltos de linea a linea del codigo mientras que step hace lo mismo se adetra dentro de las funciones. Por ejemplo

Mi programa solo hace esto:


def hola():
    print "holamundo"

hola()



- con next simplemente me mostraría la linea le doy next nuevamente se imprime el hola mundo y se acaba el programa

C:\Python27>python -m pdb holamundo.py
> c:\python27\holamundo.py(1)<module>()
-> def hola():
(Pdb) next
> c:\python27\holamundo.py(4)<module>()
-> hola()
(Pdb) next
holamundo
--Return--

-Con step muestra el paso a paso de lo que hace la funcion
C:\Python27>python -m pdb holamundo.py
> c:\python27\holamundo.py(1)<module>()
-> def hola():
(Pdb) step
> c:\python27\holamundo.py(4)<module>()
-> hola()
(Pdb) step
--Call--
> c:\python27\holamundo.py(1)hola()
-> def hola():
(Pdb) step
> c:\python27\holamundo.py(2)hola()
-> print "holamundo"
(Pdb) step
holamundo

Imprimir valor de una variable

Si se quiere imprimir el valor de una variable se puede realizar utilizando la función print.

Codigo:

def hola(p):
    print p

hola("hola mundo")

Depuracion


C:\Python27>python -m pdb holamundo.py
> c:\python27\holamundo.py(1)<module>()
-> def hola(p):
(Pdb) step
> c:\python27\holamundo.py(4)<module>()
-> hola("hola mundo")
(Pdb) step
--Call--
> c:\python27\holamundo.py(1)hola()
-> def hola(p):
(Pdb) step
> c:\python27\holamundo.py(2)hola()
-> print p
(Pdb) print()
()
(Pdb) print(p)
hola mundo

Para salir de la función y volver al programa principal se utiliza la función return  o r que es la abreviación.

Puntos de Ruptura

Lo puntos de ruptura son utilizados ya que si quieres es analizar es la mitad de código y para llega a este no se quiere hacer el next linea a linea, asi que para evitar eso se puede utilizar el break que comienza a depurar el código según le indiquemos. Por ejemplo:

C:\Python27>python.exe -m pdb multihilo.py
> c:\python27\multihilo.py(3)<module>()
-> import threading
(Pdb) break 5
Breakpoint 1 at c:\python27\multihilo.py:5
(Pdb)

Aca estoy indicando que comience a depurar a desde la linea 5 a partir de aca puedo hacer todos los next hasta finalizar el programa O se puede utilizar continue cuando se ejecutar el programa seguirá corriendo hasta donde se encuentre con otro break que se hay indicado, si no hasta que termine.

0 Comentarios