9. Il debugger di Python

Il modulo pdb definisce un debugger interattivo per il codice sorgente dei programmi Python. Supporta l'impostazione (condizionata) dei breakpoint e l'avanzamento riga per riga a livello di codice sorgente, l'ispezione degli stack frame, il listato del codice sorgente e la valutazione di codice Python arbitrario nel contesto di qualunque stack frame. Supporta inoltre il debug post mortem e può essere chiamato sotto il controllo del programma.

Il debugger è estensibile - viene di fatto definito tramite la classe Pdb. Questo modulo attualmente non è documentato ma può venire facilmente compreso attraverso la lettura dei sorgenti. L'interfaccia di estensione utilizza i moduli bdb (non documentato) e cmd.

Il prompt del debugger è "(Pdb) ". L'utilizzo tipico di questo modulo per eseguire un programma sotto il controllo del debugger è:

>>> import pdb
>>> import mymodule
>>> pdb.run('mymodule.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb)

pdb.py può anche venire invocato come script per effettuare il debug di altri script. Per esempio:

python /usr/local/lib/python1.5/pdb.py myscript.py

L'utilizzo tipico per ispezionare un programma andato in crash è:

>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "./mymodule.py", line 4, in test
    test2()
  File "./mymodule.py", line 3, in test2
    print spam
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print spam
(Pdb)

Il modulo definisce le seguenti funzioni; ciascuna avvia il debugger in un modo leggermente diverso:

run( statement[, globals[, locals]])
Esegue l'istruzione statement (passata come stringa) sotto il controllo del debugger. Il prompt del debugger compare prima che qualunque codice venga eseguito; potete impostare dei breakpoint e digitare "continue", oppure potete avanzare un passo alla volta tra le dichiarazioni utilizzando "step" o "next" (tutti questi comandi vengono spiegati più avanti). Gli argomenti facoltativi globals e locals specificano l'ambiente nel quale il codice viene eseguito; se non specificato diversamente, viene utilizzato il dizionario del modulo __main__. (Vedete la spiegazione dell'istruzione exec o della funzione built-in eval().)

runeval( expression[, globals[, locals]])
Valuta l'espressione expression (fornita come stringa) sotto il controllo del debugger. Quando runeval() termina, questa funzione restituisce il valore dell'espressione. Altrimenti questa funzione è simile a run().

runcall( function[, argument, ...])
Esegue la funzione function (una funzione o il metodo di un oggetto, non una stringa) con gli argomenti forniti. Quando runcall() termina, la funzione restituisce qualunque cosa venga restituito dalla funzione chiamata. Il prompt del debugger appare al momento dell'entrata nella funzione.

set_trace( )
Avvia il debugger nello stack frame chiamante. Questo è utile per inserire in modo hard-code un breakpoint ad una data posizione nel programma, anche se il codice non viene comunque sottoposto a debug (per esempio quando un'asserzione fallisce).

post_mortem( traceback)
Avvia il debugging post mortem dell'oggetto traceback fornito.

pm( )
Avvia il debugging post mortem della traceback trovata in sys.last_traceback.



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.