2015-02-09 24 views
6

Dato questo codice di esempio:Come continuare alla successiva iterazione del loop in PDB Python?

import pdb 

for i in range(10): 
    pdb.set_trace() 
    print(str(i)) 

Quando ricevo la richiesta dal file PDB, come posso saltare un'iterazione del ciclo, con la continuano istruzione di controllo ciclo, quando è utilizzato anche da PDB, di continuare esecuzione del codice?

+0

Quindi, per essere chiari, si desidera che il codice si comporti come se fosse stata eseguita un'istruzione 'continue'? Non vuoi che 'str (i)' venga stampato per quel ciclo, giusto? – Kevin

+0

Questo è corretto! – Andor

+1

Per inciso, per il problema generale di "come faccio a fare una distinzione tra comandi pdb ed espressioni Python che assomigliano ai comandi pdb?", Puoi anteporre il prefisso a Python con un punto esclamativo. Ma questo non sembra funzionare per 'continue' in particolare. – Kevin

risposta

7

Suona come una cosa strana da voler fare. Dovresti essere in grado di usare lo jump command. Probabilmente dovrai aggiungere un'istruzione di passaggio alla fine del ciclo for per poter saltare alla fine del ciclo. Se non sei sicuro dei numeri di riga del tuo codice, puoi utilizzare ll per scoprire i numeri di riga del tuo loop.

> c:\run.py(5)<module>() 
-> print(i) 
(Pdb) ll 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(i) 
    6   pass 
(Pdb) j 6 
> c:\run.py(6)<module>() 
-> pass 
(Pdb) c 
> c:\python\run.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) c 
1 
> c:\python\run.py(5)<module>() 
-> print(i) 

vale la pena notare che il salto alla linea for si riavvia il ciclo.

+0

Questa è una soluzione. Grazie mille! Anche se qualcuno conosce una soluzione solo per eseguire un'istruzione * continue * nel contesto, sarebbe ancora meglio. – Andor

8

Non è possibile utilizzare continue perché le nuove istruzioni nel debugger devono essere complete e valide senza alcun altro contesto; continue deve essere fornito all'interno di un loop di costruzione durante la compilazione. Pertanto, non è possibile utilizzare !continue (con ! per impedire pdb dall'interpretazione del comando) anche se il debugger sta elaborando un costrutto di loop.

È possibile utilizzare il comando j[ump], a patto di avere un tardi dichiarazione per saltare a. Se il ciclo è vuota dopo le dichiarazioni che volevi saltare sopra, si può solo 'riavvolgere':

$ bin/python test.py 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) l 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(str(i)) 
    6  
[EOF] 
(Pdb) j 3 
> /.../test.py(3)<module>() 
-> for i in range(10): 

j 3 saltato alla linea 3, non tralasciando nulla; la riga 3 verrà rieseguita compreso l'impostazione di range(). È possibile passare alla riga 4, ma il ciclo for non avanza.

Dovresti aggiungere un'altra istruzione alla fine del ciclo da cui saltare per consentire a Python di continuare. Quella dichiarazione può essere un print() o un pass o qualsiasi altra cosa che non deve modificare il tuo stato. Potresti anche usare continue come ultima dichiarazione. Ho usato i:

for i in range(10): 
    pdb.set_trace() 
    print(str(i)) 
    i # only here to jump to. 

Demo:

$ bin/python test.py 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) l 
    1  import pdb 
    2  
    3  for i in range(10): 
    4   pdb.set_trace() 
    5 ->  print(str(i)) 
    6   i # only here to jump to. 
    7  
[EOF] 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) c 
> /.../test.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) s 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) i 
1 
(Pdb) c 
> /.../test.py(4)<module>() 
-> pdb.set_trace() 
(Pdb) s 
> /.../test.py(5)<module>() 
-> print(str(i)) 
(Pdb) j 6 
> /.../test.py(6)<module>() 
-> i # only here to jump to. 
(Pdb) i 
2 

Da Debugger Commands:

j (UMP) lineno
Impostare la riga successiva che verrà eseguita. Disponibile solo nel frame più in basso. Ciò ti consente di tornare indietro ed eseguire nuovamente il codice o di saltare in avanti per saltare il codice che non vuoi eseguire.

Si noti che non tutti i salti sono consentiti, ad esempio non è possibile saltare nel mezzo di un ciclo for o di una clausola finally.