Debug di applicazioni thread

In questo capitolo impareremo come eseguire il debug delle applicazioni thread. Impareremo anche l'importanza del debug.

Cos'è il debug?

Nella programmazione per computer, il debug è il processo di individuazione e rimozione di bug, errori e anomalie dal programma per computer. Questo processo inizia non appena il codice viene scritto e continua nelle fasi successive quando il codice viene combinato con altre unità di programmazione per formare un prodotto software. Il debug fa parte del processo di test del software ed è parte integrante dell'intero ciclo di vita dello sviluppo del software.

Debugger Python

Il debugger di Python o il pdbfa parte della libreria standard Python. È un buon strumento di riserva per rintracciare bug difficili da trovare e ci consente di correggere il codice difettoso in modo rapido e affidabile. I seguenti sono i due compiti più importanti dipdp debugger -

  • Ci permette di controllare i valori delle variabili in fase di esecuzione.
  • Possiamo scorrere il codice e impostare anche i punti di interruzione.

Possiamo lavorare con pdb nei seguenti due modi:

  • Tramite la riga di comando; questo è anche chiamato debugging post-mortem.
  • Eseguendo interattivamente pdb.

Lavorare con pdb

Per lavorare con il debugger Python, dobbiamo usare il seguente codice nella posizione in cui vogliamo entrare nel debugger:

import pdb;
pdb.set_trace()

Considera i seguenti comandi per lavorare con pdb tramite la riga di comando.

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

Di seguito è riportata una demo del comando h (aiuto) del debugger 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

Esempio

Mentre lavoriamo con il debugger Python, possiamo impostare il punto di interruzione in qualsiasi punto dello script utilizzando le seguenti righe:

import pdb;
pdb.set_trace()

Dopo aver impostato il punto di interruzione, possiamo eseguire lo script normalmente. Lo script verrà eseguito fino a un certo punto; fino al punto in cui è stata impostata una linea. Considera il seguente esempio in cui eseguiremo lo script utilizzando le linee sopra menzionate in vari punti dello script:

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

Quando lo script sopra viene eseguito, eseguirà il programma fino a a = "aaa", possiamo verificarlo nel seguente output.

Produzione

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

Dopo aver utilizzato il comando "p (print)" in pdb, questo script stampa solo "aaa". Questo è seguito da un errore perché abbiamo impostato il breakpoint fino a a = "aaa".

Allo stesso modo, possiamo eseguire lo script modificando i punti di interruzione e vedere la differenza nell'output -

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

Produzione

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

Nello script seguente, stiamo impostando il punto di interruzione nell'ultima riga del programma:

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

L'output è il seguente:

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