2015-02-09 151 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子句中不可跳转。