给定以下示例代码:
import pdb
for i in range(10):
pdb.set_trace()
print(str(i))
当我从PDB得到提示时,如何使用continue循环控制语句跳过循环中的一次迭代,而不与PDB一起使用,以继续代码执行?
当我从PDB得到提示时,如果要跳过循环中的一次迭代,并且在使用PDB继续代码执行时不想与之产生冲突,可以使用continue循环控制语句。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
跳转到第三行,没有跳过任何内容; 第三行将被重新执行,包括设置 range()
。你可以跳到第四行,但是这个 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(ump) 行号
设置将要执行的下一行。只在最底层的框架中可用。这使您可以跳回并重新执行代码,或跳过不想运行的代码。值得注意的是,并非所有的跳转都被允许——例如,不能跳入一个
for
循环的中间或跳出finally
子句。
continue
跳过执行循环的剩余部分,这正是你在这里所需要的。然而,跳转到 for
行会重新启动循环,因此并不完全相同。在循环体末尾放置一个虚拟语句会更接近于 continue
的作用:跳过循环体中所有剩余语句,然后继续下一次迭代。 - Martijn Pietersunt[il]
但无法通过迭代推进。 - 0xc0deuntil
用于跳出循环。我只需在循环语句或循环体的第一条语句上添加断点,然后使用 c
命令即可。 - Martijn Pietersif value == 'debug-worthy':pdb.set_trace()
)。谢谢。 - 0xc0dell
查找循环的行号。> 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
行将重新启动循环。
continue
语句一样?您不希望在该循环中打印str(i)
,对吗? - Kevin