如何继续Python PDB中的下一个循环迭代?

时间:2015-02-09 16:26:20

标签: python debugging pdb

鉴于此示例代码:

import pdb

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

当我从PDB收到提示时,我怎样才能跳过循环的迭代,使用 continue 循环控制语句,当它也被PDB使用时,继续执行代码?

2 个答案:

答案 0 :(得分:9)

您不能使用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

  

j(ump) lineno
  设置将要执行的下一行。仅适用于最底部的框架。这使您可以跳回并再次执行代码,或者跳转到跳过您不想运行的代码。

     

应该注意的是,并非所有跳转都是允许的 - 例如,不可能跳到for循环的中间或跳出finally子句。

答案 1 :(得分: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行将重新启动循环。