Come uscire da PDB e consentire al programma di continuare?


111

Sto usando il modulo pdb per eseguire il debug di un programma. Mi piacerebbe capire come posso uscire da pdb e consentire al programma di continuare fino al completamento. Il programma è computazionalmente costoso da eseguire, quindi non voglio uscire senza che lo script tenti di completare. continuenon sembra funzionare. Come posso uscire da pdb e continuare con il mio programma?


2
continueesce dai cicli, returnesce da metodi / funzioni
Stephan

7
@ Stephan: Sta parlando continuedel comando pdb. Non la dichiarazione di Python.
voithos

1
@turtle: continuedovrebbe "continuare l'esecuzione, fermarsi solo quando viene rilevato un punto di interruzione", secondo i documenti. Hai un punto di interruzione impostato che viene raggiunto?
voithos

1
ah. va bene, ho capito. sì, ho un punto di interruzione impostato all'interno di un ciclo. comunque per aggirare questo? il ciclo viene chiamato migliaia di volte, quindi non posso continuare a premere manualmente continua.
tartaruga

1
@turtle: hai un breakpoint impostato dall'interno di Pdb o ne hai un pdb.set_trace()nel tuo codice sorgente?
voithos

Risposte:


190

continuedovrebbe "continuare l'esecuzione, fermarsi solo quando viene incontrato un punto di interruzione", quindi hai un punto di interruzione impostato da qualche parte. Per rimuovere il punto di interruzione (se è stato inserito manualmente):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Oppure, se stai usando pdb.set_trace(), puoi provare questo (anche se stai usando pdb in modi più fantasiosi, questo potrebbe rompere le cose ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!

10
Quanto sopra non esce da pdb.
Steve Barnes

7
Circa la quindicesima parola della domanda!
Steve Barnes

13
@ SteveBarnes: Penso che tu lo stia prendendo troppo alla lettera. L'OP sta solo colpendo un punto di interruzione più e più volte. Tutto ciò di cui hanno bisogno è continuare il loro processo di lunga durata senza raggiungere punti di interruzione. Che Pdb sia effettivamente in esecuzione o meno è irrilevante.
voithos

35
Bel suggerimento per l'impostazione set_trace = lambda: None:)
randlet

2
Per i casi estremi, niente batte set_trace = lambda: None. Python org dovrebbe aggiungere un comando che ti permetta di uscire da pdb.
ErezO

26

Un semplice Ctrl: Duscirà da pdb. Se vuoi continuare invece di interrompere, premi semplicemente cpiuttosto che l'intero continuecomando


6
E quando sei all'interno di una funzione, all'interno di un ciclo? Sembra che vada al ciclo successivo per me, e non posso effettivamente chiudere pdb, o anche chiudere python, senza chiudere l'intero terminale?
Marte

@LimokPalantaemon Strano, hai provato a digitareexit
Minh Triet

Questo non funziona se si imposta una traccia o se si hanno punti di interruzione a meno che non si continui a premere c.
Alex

imbarazzante, ma questo mi ha salvato dall'essere bloccato per troppo tempo -_-
jmcg

7

La risposta di @voithos è corretta, quindi aggiungerò solo un'alternativa nel caso in cui la utilizzi set_trace. Sì, l' pdb.set_trace = lambda: Nonehack funziona bene, ma non se hai altri punti di interruzione impostati e desideri riattivarlo in seguito. Per me questo indica il fatto che sfortunatamente pdbmanca un sacco di funzionalità (anche cose di base come gli elenchi di visualizzazione), e questo è un altro caso.

La buona notizia è che pdb++è un ottimo sostituto immediato pdbe una delle cose che risolve è esattamente il problema della disabilitazione set_trace. Quindi puoi semplicemente fare:

pip install pdbpp

e al (Pdb++)prompt digita:

pdb.disable()

Se vuoi riattivare in seguito, non sorprende che funzioni:

pdb.enable()

Facile! E oltre a questo otterrai molte altre chicche utili.


4

Se vuoi davvero uscire dal debugger, devi eseguire qualcosa come WinPdb che ti permette di scollegarti dal processo e quindi uscire dal debugger, (NB È multipiattaforma).

Se desideri continuare il debug ma non fermarti più a un determinato punto di interruzione, devi:

  1. Prendere nota del numero del punto di interruzione (o del file e del numero di riga),
  2. Sia cl bp_number o clear file:line rimuovere definitivamente il punto di interruzione o disable pb_number di disattivarlo ma in grado di passare indietro.
  3. Quindi continuee il tuo programma viene eseguito fino a quel momento viene raggiunto il successivo punto di interruzione diverso .

Per maggiori dettagli su quanto sopra vedere il manuale .


0

trova un nuovo modo per uscire dal pdb senza installare nulla: - quando il programma inizia a funzionare, premi ctrl + c, quindi cambia la finestra in un'altra (qualsiasi finestra), quindi la shell originale con pdb in esecuzione dovrebbe mostrare qualcosa del tipo: (pdb) ..... - torna a pdb, quindi premi Invio, ora sei pronto, la shell dei comandi pdb riappare di nuovo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.