繁体   English   中英

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

[英]How to continue to the next loop iteration in Python PDB?

鉴于此示例代码:

import pdb

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

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

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

调试器命令

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

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

听起来很奇怪。 您应该能够使用jump命令 您可能需要在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行将重新启动循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM