9.1 Comandi del debugger

Il debugger riconosce i seguenti comandi. La maggior parte dei comandi possono venire abbreviati con una o due lettere; per esempio "h(elp)" significa che sia "h" che "help" possono venire utilizzati per avviare l'help (ma non "he", "hel", "H", "Help" o "HELP"). Gli argomenti dei comandi devono essere separati da caratteri di spaziatura (spazi o tab). Nella sintassi dei comandi gli argomenti facoltativi vengono racchiusi tra parentesi quadre ("[]"); le parentesi quadre non devono essere digitate. Le varie alternative nella sintassi dei comandi vengono separate da una barra verticale ("|").

Inviando una riga vuota si otterrà la ripetizione dell'ultimo comando fornito. Eccezione: se l'ultimo comando era "list", vengono elencate le prossime 11 righe.

I comandi che il debugger non riconosce vengono considerati come dichiarazioni Python e vengono eseguiti nel contesto del programma in corso di debug. Le istruzioni Python possono anche venire prefissate da un punto esclamativo ("!"). Questo è una maniera molto efficace per analizzare il programma in corso di debug; è anche possibile modificare una variabile o chiamare una funzione. Quando sovviene un'eccezione in una di queste istruzioni, viene stampato il nome dell'eccezione ma lo stato del debugger non viene alterato.

Si possono inserire comandi multipli in una singola riga, separati da ";;". (Un singolo ";" non viene utilizzato poiché rappresenta il separatore di comandi multipli in una riga da passare al parser Python.) Non viene applicata nessuna accortezza particolare per separare i comandi; l'input viene diviso alla prima coppia di ";;", anche se si trova nel mezzo di una stringa racchiusa tra virgolette.

Il debugger supporta gli alias. Gli alias possono avere parametri che permettono un certo livello di adattabilità al contesto in esame.

Se esiste un file .pdbrc nella home directory dell'utente o nella directory corrente, esso viene letto ed eseguito come se fosse stato digitato al prompt del debugger. Questo è particolarmente utile per gli alias. Se entrambi i file esistono, quello nella home directory viene letto per primo e gli alias lì definiti possono venire sovrascritti dal file locale.

h(elp) [command]

Senza argomenti, stampa la lista dei comandi disponibili. Con un comando command come argomento, stampa l'help del comando. "help pdb" mostra l'intero file di documentazione; se viene definita la variabile d'ambiente PAGER, il file viene passato in una pipe attraverso il comando specificato. Poichè l'argomento command deve essere un identificatore, bisogna digitare "help exec" per ottenere l'help del comando "!".

w(here)

Stampa la traccia dello stacke, con il frame più recente in fondo. Una freccia indica il frame corrente, che determina il contesto della maggior parte dei comandi.

d(own)

Sposta il frame corrente in basso di un livello nella traccia dello stack(verso un frame più recente).

u(p)

Sposta il frame corrente in alto di un livello nella traccia dello stacke(verso un frame più vecchio).

b(reak) [[filename:]lineno|function[, condition]]

Con un argomento lineno, imposta in quella riga del file corrente un break. Con un argomento function, imposta un break alla prima istruzione eseguibile in quella funzione. Il numero di riga può essere preceduto da un nome di file seguito da un due punti, in modo da specificare un breakpoint in un'altro file (probabilmente uno che non è ancora stato caricato). Il file viene cercato in sys.path. Notate che ad ogni breakpoint viene assegnato un numero a cui fanno riferimento tutti gli altri comandi dei breakpoint.

Se è presente un secondo argomento, esso è un'espressione che deve venire valutata come vera prima che il breakpoint venga rispettato.

Senza argomenti, vengono elencati tutti i breakpoint, includendo per ognuno di essi il numero di volte che è stato raggiunto, il contatore corrente dei passi da ignorare e la condizione associata, se presente.

tbreak [[filename:]lineno|function[, condition]]

Breakpoint temporaneo che viene rimosso automaticamente quando viene raggiunto la prima volta. Gli argomenti sono gli stessi di break.

cl(ear) [bpnumber [bpnumber ...]]

Con una lista di numeri di breakpoint separata da spazi, cancella tutti questi breakpoint. Senza argomenti, cancella tutti i breakpoint (ma prima chiede conferma).

disable [bpnumber [bpnumber ...]]

Disabilita i breakpoint forniti come lista di numeri di breakpoint separati da spazi. Disabilitare un breakpoint significa che esso non può più provocare il blocco dell'esecuzione del programma, ma al contrario della cancellazione del breakpoint, esso resta nella lista dei breakpoint e può venire riabilitato.

enable [bpnumber [bpnumber ...]]

Abilita i breakpoint specificati.

ignore bpnumber [count]

Imposta il contatore dei passi da ignorare per il breakpoint fornito (come numero). Se count viene omesso, il contatore dei passi da ignorare viene impostato a 0. Un breakpoint diventa attivo quando il contatore dei passi da ignorare diventa 0. Quando diverso da zero, il contatore viene decrementato ogni volta che il breakpoint viene raggiunto, a condizione che esso non sia disabilitato e che ogni condizione associata sia stata valutata come vera.

condition bpnumber [condition]

condition è un'espressione che deve essere valutata come vera prima che il breakpoint venga rispettato. Se condition è assente, tutte le condizioni esistenti vengono rimosse; cioè, il breakpoint viene reso incondizionato.

s(tep)

Esegue la riga corrente, blocca l'esecuzione alla prima occasione possibile (in una funzione chiamata o sulla prossima riga della funzione corrente).

n(ext)

Continua l'esecuzione finché la prossima riga della funzione corrente non viene raggiunta o la funzione termina. (La differenza tra "next" e "step" è che "step" si blocca dentro una funzione chiamata, mentre "next" esegue la funzione chiamata a (circa) piena velocità, fermandosi solo alla prossima riga nella funzione corrente.)

r(eturn)

Continua l'esecuzione fino al termine della funzione corrente.

c(ont(inue))

Continua l'esecuzione, si blocca solo quando viene raggiunto un breakpoint.

j(ump) lineno

Imposta la prossima riga che verrà eseguita. Disponibile solo nel frame più in basso. Questo permette di tornare indietro per rieseguire una porzione di codice o per saltare del codice che non volete eseguire.

Attenzione che non tutti i salti sono permessi; tanto per chiarire, non è possibile saltare nel mezzo di un ciclo for o fuori da una clausola finally.

l(ist) [first[, last]]

Mostra il codice sorgente del file corrente. Senza argomenti, mostra le 11 righe attorno a quella corrente o continua l'elenco precedente. Con un argomento, elenca le 11 righe attorno a quella riga. Con 2 argomenti, mostra le righe nell'intervallo fornito; se il secondo argomento è minore del primo, viene interpretato come un incremento(n.d.T: 11 e 3 indicano le righe dalla 11 alla 14).

a(rgs)

Stampa la lista degli argomenti della funzione corrente.

p expression

Valuta l'espressione expression nel contesto corrente e ne stampa il valore. Note: Si può anche utilizzare "print", ma non è un comando del debugger; esso esegue l'istruzione print di Python.

pp expression

Come il comando "p", ad eccezione del fatto che il valore dell'espressione viene stampato in forma elegante utilizzando il modulo pprint.

alias [name [command]]

Crea un alias chiamato name che esegue il comando command. Il comando non deve essere racchiuso tra virgolette. I parametri sostituibili possono venire indicati da "%1", "%2" e così via, mentre "%*" viene sostituito da tutti i parametri. Se non viene fornito nessun comando, viene mostrato l'alias corrente di name. Se non viene fornito nessun argomento, vengono elencati tutti gli alias.

Gli alias possono venire annidati e possono contenere qualsiasi cosa che sia possibile digitare al prompt di pdb. Notate che i comandi interni di pdb possono venire sovrascritti dagli alias. Un comando sovrascritto rimane perciò nascosto finché l'alias non viene rimosso. Il meccanismo degli alias viene applicato ricorsivamente alla prima parola della riga di comando; tutte le altre parole sulla stessa riga di comando vengono lasciate invariate.

Come esempio, ecco due utili alias (specialmente quando inseriti nel file .pdbrc):

#Visualizza le variabili d'istanza (utilizzo: "pi classInst")
alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
#Visualizza le variabili d'istanza in self
alias ps pi self

unalias name

Cancella l'alias specificato.

[!]statement

Esegue l'istruzione (monoriga) statement nel contesto dello stack frame corrente. Il punto esclamativo può venire omesso, a meno che la prima parola dell'istruzione sia anche un comando del debugger. Per impostare una variabile globale potete precedere, sulla stessa riga, il comando d'assegnamento con un comando "global", per esempio:

(Pdb) global list_options; list_options = ['-l']
(Pdb)

q(uit)

Esce dal debugger. Il programma in esecuzione viene interrotto.

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