Depurando aplicativos de thread

Neste capítulo, aprenderemos como depurar aplicativos de thread. Também aprenderemos a importância da depuração.

O que é depuração?

Na programação de computadores, a depuração é o processo de localização e remoção de bugs, erros e anormalidades do programa de computador. Este processo começa assim que o código é escrito e continua em estágios sucessivos conforme o código é combinado com outras unidades de programação para formar um produto de software. A depuração faz parte do processo de teste de software e é parte integrante de todo o ciclo de vida de desenvolvimento de software.

Depurador Python

O depurador Python ou o pdbfaz parte da biblioteca padrão do Python. É uma boa ferramenta de fallback para rastrear bugs difíceis de encontrar e nos permite consertar códigos defeituosos de forma rápida e confiável. A seguir são as duas tarefas mais importantes dopdp depurador -

  • Ele nos permite verificar os valores das variáveis ​​em tempo de execução.
  • Podemos percorrer o código e definir pontos de interrupção também.

Podemos trabalhar com PDB das duas maneiras a seguir -

  • Por meio da linha de comando; isso também é chamado de depuração post mortem.
  • Executando pdb interativamente.

Trabalhando com PDB

Para trabalhar com o depurador Python, precisamos usar o seguinte código no local onde queremos entrar no depurador -

import pdb;
pdb.set_trace()

Considere os seguintes comandos para trabalhar com pdb por meio da linha de comando.

  • h(help)
  • d(down)
  • u(up)
  • b(break)
  • cl(clear)
  • l(list))
  • n(next))
  • c(continue)
  • s(step)
  • r(return))
  • b(break)

A seguir está uma demonstração do comando h (ajuda) do depurador 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

Exemplo

Enquanto trabalhamos com o depurador Python, podemos definir o ponto de interrupção em qualquer lugar do script usando as seguintes linhas -

import pdb;
pdb.set_trace()

Depois de definir o ponto de interrupção, podemos executar o script normalmente. O script será executado até certo ponto; até onde uma linha foi definida. Considere o exemplo a seguir, onde executaremos o script usando as linhas mencionadas acima em vários lugares no script -

import pdb;
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print (final)

Quando o script acima for executado, ele executará o programa até a = “aaa”, podemos verificar isso na saída a seguir.

Resultado

--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

Após usar o comando 'p (imprimir)' em pdb, este script está imprimindo apenas 'aaa'. Isso é seguido por um erro porque definimos o ponto de interrupção até a = "aaa".

Da mesma forma, podemos executar o script alterando os pontos de interrupção e ver a diferença na saída -

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print (final)

Resultado

--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

No script a seguir, estamos definindo o ponto de interrupção na última linha do programa -

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
pdb.set_trace()
print (final)

O resultado é o seguinte -

--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)