说我有以下代码的代码:
for i in range(100):
print i
Run Code Online (Sandbox Code Playgroud)
一般来说,我可以在代码中添加一行:
for i in range(100):
import ipdb;ipdb.set_trace()
print i
Run Code Online (Sandbox Code Playgroud)
但是,现在我想在条件下调试它i == 10
,我不想c
在ipdb中输入10次,我该怎么办?
在我找到的文档中condition bpnumber [condition]
,但我怎么知道bpnumber
是否没有bpnumber
索引列表.文档还说b(reak) ([file:]lineno | function) [, condition]
.例如,假设行号print i
是xx
.我在ipdb shell中输入了以下内容:b xx, i == 10
但没有按预期发生.
she*_*per 19
好吧,我自己做了一些探索,这是我对pdb的新认识.当你输入时,import ipdb;ipdb.set_trace()
你实际上在行中添加了ipdb的入口点,而不是真正的断点.输入ipdb后,您可以设置断点
所以,要实现我想要的条件调试,我应该添加如下
import ipdb;ipdb.set_trace()
for i in range(100):
print i
Run Code Online (Sandbox Code Playgroud)
然后我输入ipdb后,我可以输入b xx, i == 10
,然后c
或r
运行代码,然后代码将在满足条件时停止.当我输入时l
,bpnumber显示为该行:
xx-1 for i in range(100):
bpnumber> xx print i
xx+1 ...
Run Code Online (Sandbox Code Playgroud)
我不得不说,文档和所有其他解释都是如此令人困惑,我希望我的答案澄清"调试入口点"和"调试断点"之间的区别
有这样一个快速脏的方式:
for i in range(100):
if i == 10: import ipdb;ipdb.set_trace()
print i
Run Code Online (Sandbox Code Playgroud)
它工作,而不必忙于任何其他命令:)
我认为您正在寻找一种更直接的解决方案,该解决方案不涉及在代码中添加行,而只涉及调试器命令.
你原来的例子
b xx, i == 10
Run Code Online (Sandbox Code Playgroud)
不起作用,因为您在代码中的地方设置了一个断点,您插入了ipdb.set_trace()命令.通过在调试器中添加语句'b xx,i == 10',您实际上在同一位置定义了2个断点(1个条件和1个无条件)(假设xx是set_trace()命令的行).
或者,一旦您使用'b'命令在代码中定义了断点,这显然适合您.您可以通过添加条件到断点
condition bpnumber boolean-expression
Run Code Online (Sandbox Code Playgroud)
例如
condition 1 i == 10
Run Code Online (Sandbox Code Playgroud)
注意:bpnumber是分配给断点的编号,而不是代码中的行.要查看断点列表,只需键入不带参数的"b".
此外,如果要在不使用ipdb.set_trace()的情况下进入调试模式,只需在启用pdb/ipbd模块的情况下运行代码
python -m pdb foo.py
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6306 次 |
最近记录: |