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ónpython -m pdb nombrescript.py
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")
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.