2013-09-30 8 views
19

Ho usato ipdb.set_trace() da qualche parte nel mio codice Python. È possibile ignorare questo punto di rottura usando un comando IPDB?È possibile rimuovere un set di punti di interruzione con ipdb.set_trace()?

clear mi dice che ha cancellato tutti i punti di interruzione, ma IPDB si ferma nuovamente quando inciampa sulla linea con ipdb.set_trace().

disable 1 mi dice: No breakpoint numbered 1 ignore 1 dice: Breakpoint index '1' is not valid

per chiarire: Naturalmente potrei rimuovere semplicemente il punto di rottura dal mio codice sorgente. Ma questo richiederebbe di chiudere il debugger e riavviarlo. Spesso ha bisogno di molto lavoro per arrivare da qualche parte e il riavvio del debugger rende la vita più difficile. Inoltre, se esiste un ciclo enorme e si desidera ispezionare gli oggetti nel ciclo, è più semplice posizionare un punto di interruzione nel ciclo direttamente dopo l'oggetto. Come posso quindi saltare il ciclo (e tutte le migliaia di chiamate set_trace()) e scorrere il codice dopo il ciclo utilizzando next?

+1

I punti di interruzione sono solo per il debug, è una buona idea tenere traccia di dove è stato impostato. Stai meglio facendo un 'grep' o una ricerca per capire dove sia. – karthikr

+0

@karthikr Sì, certo. Penso che tu abbia frainteso la mia domanda un po '. Ho provato a chiarire come mi piacerebbe usare il debugger. – lumbric

risposta

-2

L'esecuzione del programma dovrebbe anche indicare esattamente dove è stato impostato il idb.set_trace() quando viene colpito (in caso contrario, provare i comandi where o bt). È quindi possibile rimuovere quella linea dal file e riavviare il programma.

Altrimenti, potresti trovare utile this se ti senti più sperimentale.

31

Bene, puoi trarre vantaggio dal fatto che qualsiasi cosa in Python è un oggetto. Mentre nel debugger, si può fare qualcosa di simile:

def f(): pass 
ipdb.set_trace = f 

set_trace sarà ancora chiamato, ma non farà nulla. Certo, è un po permanente, ma si può solo fare

reload ipdb 

e si otterrà il comportamento originale indietro.

(perché dovresti farlo? Quando accidentalmente inserisci un punto di interruzione in una funzione spesso chiamata di solito sotto un tentativo/eccetto. Una volta che ti accorgi che stai fermando 1000 volte in questa funzione, provi a ctrl -c, ma che viene catturato dal try/tranne per essere di nuovo in IPDB nuovo Quindi, se siete in codice di basso livello, assicurarsi che il proprio set_traces hanno qualche contesto:.

if myvar in ['some', 'sentinel', 'values']: 
    ipdb.set_trace() 

etc.

+1

+1 per il grande suggerimento di sovrascrivere semplicemente 'set_trace()'. In ogni caso, questo non consente di cancellare un punto di rottura specifico. – lumbric

+2

dovrebbe essere possibile estendere questo concetto per eliminare solo un singolo punto di interruzione, utilizzando il modulo inspect per determinare il file/la linea corrente e restituire (senza fare nulla) o chiamare l'ipdb.set_trace originale().Non ho una ricetta, ma ho usato questo un paio di volte, quindi questo mi sta ispirando a metterne uno insieme ... –

+4

Questo mi succede un bel po 'quando lavoro con le suite di test. Se sei bloccato e vuoi solo il prompt della shell, un semplice 'ipdb.set_trace' funziona come un incantesimo. –

9

Dopo aver appreso da Corley

ipdb.set_trace = lambda: None 

Funziona per me.

Problemi correlati