Come fare il debug in python
Per avviare il debugging di un programma scritto in Python uso il modulo pdb detto Python Debugger. Entro nel programma da verificare e importo la libreria pdb.
import pdb
Per avviare il debug aggiungo la funzione pdb.set_trace() nella riga di codice che mi interessa.
pdb.set_trace()
Quest'ultima istruzione blocca l'esecuzione e avvia il debug.
Attenzione. Al termine del debug devo ricordarmi di togliere le istruzioni di pdb dal codice sorgente del programma. In particolar modo se il debug è inserito in una if e si apre solo in determinate situazioni, è facile dimenticarlo là.
Come funziona Python Debugger ( pdb )
Dopo aver inserito l'istruzione di debug nel programma, lo eseguo.
Quando l'interprete incontra la funzione set_trace() sospende l'esecuzione e apre la console del debugging.
(Pdb)
A questo punto, posso eseguire i vari comandi di debug, tra i quali:
- list = visualizza il codice e la riga in cui si trova il programma
- next = esegue la riga successiva
Se voglio vedere il contenuto di una variabile, mi basta digitare il nome della variabile sul prompt e dare invio.
Come uscire dal debugger?
Per uscire dal debug ho due possibilità
- quit o exit = esce dal debugger e dall'esecuzione
- c = continua l'esecuzione del programma
Oltre a questi comandi ce ne sono molti altri.
Per conoscere tutti i comandi di Python debugger basta digitare help sul prompt del dubugger.
Un esempio pratico
Ho un semplice programma che stampa i numeri da 1 a 10 tramite una struttura iterativa.
- import pdb
- for i in range(1, 10):
- print(i)
- if (i==5):
- pdb.set_trace()
- print("fine")
Quando il programma esegue il quinto ciclo avvio il debugger.
Si apre il prompt di pdb.
(Pdb)
Digito il comando list per vedere a che punto del programma si trova l'esecuzione.
La riga del codice corrente è indicata con una freccia ->
(Pdb) list
1 import pdb
2 -> for i in range(1, 10):
3 print(i)
4 if (i==5):
5 pdb.set_trace()
6 print("fine")
[EOF]
A questo punto voglio conoscere il valore corrente della variabile i.
Digito il nome della variabile e do invio, la variabile vale 5.
(Pdb) i
5
Ora voglio avanzare l'esecuzione di un passo.
Digito il comando next.
(Pdb) next
E così via.
Per uscire dal debugger posso continuare (c) o annullare (quit) l'esecuzione.
Elenco dei comandi di python debugger
Ecco la lista completa dei comandi utilizzabili dal prompt pdb di python debugger.
- EOF
Gestisce la ricezione di EOF come comando. - a ( o args )
Stampa la lista degli argomenti della funzione corrente. - alias
Crea un alias che esegue 'comando'. - args
Stampa la lista degli argomenti della funzione corrente. - b ( o break )
Elenca tutte le interruzioni. - bt
Stampa una traccia dello stack, con il frame più recente in basso. - c ( o continue o cont )
Continua l'esecuzione del programma. Si ferma solo se viene viene rilevato un punto di interruzione. - cl ( o clear )
Elimina tutti i breakpoint dal programma o un breakpoint specifico. - commands
Specifica un elenco di comandi per il numero di breakpoint. - condition
Imposta una nuova condizione per il punto di interruzione. - d ( o down )
Sposta i livelli attuali del conteggio dei frame predefinito nella traccia dello stack su un frame più recente. - debug
Inserisce un debugger ricorsivo che passa attraverso l'argomento del codice - disable
Disabilita i punti di interruzione forniti come elenco separato da spazi di numeri di breakpoint. - display
Mostra il valore dell'espressione se è cambiato, ogni volta che l'esecuzione si ferma nel frame corrente. - enable
Abilita i punti di interruzione forniti come elenco separato da spazi di numeri di breakpoint. - exit
Esce dal debugger. Il programma in esecuzione viene interrotto. - h ( o help )
Visualizza l'help online di Pdb. - ignore
Impostare il conteggio ignore per il numero di breakpoint specificato. - interact
Avvia un interprete interattivo il cui spazio dei nomi globale contiene tutti i nomi (globali e locali) trovati nell'ambito corrente. - j ( o jump )
Imposta la prossima linea da eseguire. - l ( o list )
Visualizza il codice sorgente del programma. - ll ( o longlist )
Elenca l'intero codice sorgente per la funzione o il frame corrente. - n ( o next )
Continua l'esecuzione solo sulla riga successiva - p
Stampa il valore dell'espressione - pp
Significa pretty print. Stampa il valore dell'espressione - q ( o quit )
Esce dal debugger. Il programma in esecuzione viene interrotto. - r ( o return )
Continua l'esecuzione fino a quando la funzione corrente non ritorna. - restart ( o run )
Riavvia il debugging - retval ( o rv )
Stampa il valore restituito per l'ultimo da una funzione. - s ( o step )
Esegue la linea corrente e si ferma alla prima occasione possibile - source
Cerca di ottenere il codice sorgente per l'oggetto dato e visualizzalo. - tbreak
E' simile a break ma imposta un punto di interruzione temporaneo. Viene automaticamente cancellato dopo la prima volta. - u ( o up )
Sposta il livello corrente del conteggio (predefinito) in alto nella traccia dello stack. - unalias
Cancella un alias - undisplay
Non visualizza più l'espressione nel frame corrente. - unt ( o until )
Continua l'esecuzione fino a quando viene raggiunta la linea con un numero maggiore di quello corrente. Se si indica un numero di riga come argomento, continua l'esecuzione finché viene raggiunta ed eseguita. - w ( o where )
Stampa una traccia dello stack, con il frame più recente in basso. - whatis
Stampa il tipo dell'argomento.
Per conoscere più nel dettaglio il significato e il funzionamento di ogni comando, posso usare l'help online di pdb, indicando il nome del comando.
(pdb) help nome_comando
E così via.