And*_*dor 6 python debugging pdb
鉴于此示例代码:
import pdb
for i in range(10):
pdb.set_trace()
print(str(i))
Run Code Online (Sandbox Code Playgroud)
当我从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):
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
演示:
$ 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
Run Code Online (Sandbox Code Playgroud)
从调试器命令:
j(ump)lineno
设置将要执行的下一行.仅适用于最底部的框架.这使您可以跳回并再次执行代码,或者跳转到跳过您不想运行的代码.应该注意的是,并非所有跳转都是允许的 - 例如,不可能跳转到
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)
Run Code Online (Sandbox Code Playgroud)
值得注意的是,跳到for线路将重新启动循环.