Aplicaciones de hilo de depuración
En este capítulo, aprenderemos a depurar aplicaciones de subprocesos. También aprenderemos la importancia de depurar.
¿Qué es la depuración?
En la programación de computadoras, la depuración es el proceso de encontrar y eliminar los errores, errores y anomalías de un programa de computadora. Este proceso comienza tan pronto como se escribe el código y continúa en etapas sucesivas a medida que el código se combina con otras unidades de programación para formar un producto de software. La depuración es parte del proceso de prueba de software y es una parte integral de todo el ciclo de vida del desarrollo de software.
Depurador de Python
El depurador de Python o el pdbes parte de la biblioteca estándar de Python. Es una buena herramienta de respaldo para rastrear errores difíciles de encontrar y nos permite corregir el código defectuoso de forma rápida y confiable. Los siguientes son las dos tareas más importantes delpdp depurador -
- Nos permite comprobar los valores de las variables en tiempo de ejecución.
- También podemos recorrer el código y establecer puntos de interrupción.
Podemos trabajar con pdb de las siguientes dos formas:
- A través de la línea de comandos; esto también se llama depuración post mortem.
- Ejecutando interactivamente pdb.
Trabajando con pdb
Para trabajar con el depurador de Python, necesitamos usar el siguiente código en la ubicación donde queremos irrumpir en el depurador:
import pdb;
pdb.set_trace()
Considere los siguientes comandos para trabajar con pdb a través de la línea de comandos.
- h(help)
- d(down)
- u(up)
- b(break)
- cl(clear)
- l(list))
- n(next))
- c(continue)
- s(step)
- r(return))
- b(break)
A continuación se muestra una demostración del comando h (ayuda) del depurador de Python:
import pdb
pdb.set_trace()
--Call--
>d:\programdata\lib\site-packages\ipython\core\displayhook.py(247)__call__()
-> def __call__(self, result = None):
(Pdb) h
Documented commands (type help <topic>):
========================================
EOF c d h list q rv undisplay
a cl debug help ll quit s unt
alias clear disable ignore longlist r source until
args commands display interact n restart step up
b condition down j next return tbreak w
break cont enable jump p retval u whatis
bt continue exit l pp run unalias where
Miscellaneous help topics:
==========================
exec pdb
Ejemplo
Mientras trabajamos con el depurador de Python, podemos establecer el punto de interrupción en cualquier parte del script utilizando las siguientes líneas:
import pdb;
pdb.set_trace()
Después de establecer el punto de interrupción, podemos ejecutar el script normalmente. El script se ejecutará hasta cierto punto; hasta donde se ha establecido una línea. Considere el siguiente ejemplo donde ejecutaremos el script usando las líneas mencionadas anteriormente en varios lugares del script:
import pdb;
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print (final)
Cuando se ejecuta el script anterior, ejecutará el programa hasta que a = "aaa", podemos verificar esto en la siguiente salida.
Salida
--Return--
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined
Después de usar el comando 'p (imprimir)' en pdb, este script solo imprime 'aaa'. A esto le sigue un error porque hemos establecido el punto de interrupción en a = "aaa".
Del mismo modo, podemos ejecutar el script cambiando los puntos de interrupción y ver la diferencia en la salida:
import pdb
a = "aaa"
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print (final)
Salida
--Return--
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit
En el siguiente script, establecemos el punto de interrupción en la última línea del programa:
import pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
pdb.set_trace()
print (final)
La salida es la siguiente:
--Return--
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)