2015-02-09 153 views
6

鑑於此示例代碼:如何繼續Python PDB中的下一個循環迭代?

import pdb 

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

當我從PDB提示,我怎麼能跳過循環的迭代器,繼續循環控制語句,當它也使用了PDB,繼續代碼執行?

+0

所以,很明顯,你希望代碼的行爲就像是一個'continue'語句被執行了嗎?你不想讓str(i)'爲那個循環打印,對吧? – Kevin 2015-02-09 16:30:24

+0

這是正確的! – Andor 2015-02-09 16:35:55

+1

順便提一句,對於「如何區分pdb命令和Python表達式看起來像pdb命令?」的一般問題,您可以在Python表達式前加一個感嘆號。但這似乎並不適用於「繼續」。 – Kevin 2015-02-09 16:50:59

回答

7

聽起來像想要做的奇怪的事情。但你應該可以使用jump command。您可能需要在for循環的末尾添加一個pass語句,以便可以跳轉到循環結尾。如果您不確定代碼的行號,則可以使用ll來查找循環的行號。

> 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) 

值得注意的是,跳到for行將重新啓動循環。

+0

這是一個解決方案。非常感謝你!雖然如果有人知道只是在上下文中執行* continue *語句的解決方案,它會更好。 – Andor 2015-02-09 16:53:36

8

您不能使用continue,因爲調試器中的新語句需要爲完成並且沒有任何其他上下文有效;當編譯時,必須在循環結構內給出continue。因此,即使調試器正在處理循環結構,也不能使用!continue(使用!來阻止pdb解釋該命令)。

可以使用j[ump]命令,只要你有一個聲明跳轉到。如果你的循環是空後,你想要的報表跳過去,你只能「倒帶」:

$ 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躍升至3行,不跳過任何東西;第3行將被重新執行,包括設置range()。您可以跳轉到第4行,但for循環不會前進。

您需要在循環結尾添加另一條語句以跳轉到Python以繼續。該陳述可以是print()pass或其他任何不必改變您的狀態的內容。你甚至可以使用continue作爲最後的陳述。我用i

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

演示:

$ 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 

Debugger Commands

Ĵ(UMP)LINENO
設置將要執行的下一行。僅在最底部的框架中可用。這可以讓您跳回來並再次執行代碼,或者跳轉到跳過您不想運行的代碼。

需要注意的是,並非所有跳轉都是允許的 - 例如跳轉到for循環的中間或finally子句中不可跳轉。