如何在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]命令,前提是你有后面的语句跳转到。如果你的循环在你想跳过的语句之后是空的,你只能 'rewind':

$ 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
Set the next line that will be executed. Only available in the bottom-most frame. This lets you jump back and execute code again, or jump forward to skip code that you don’t want to run.

It should be noted that not all jumps are allowed — for instance it is not possible to jump into the middle of a for loop or out of a finally clause.

这听起来像是一件很奇怪的事情。您应该能够使用 jump command though. You'll probably need to add a pass statement at the end of your for loop so you can jump to the end of the loop. If you're not sure of the line numbers of your code then you can use 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行会重新开始循环。