pdb/ipdb for python在可编辑条件下中断

she*_*per 19 python pdb

说我有以下代码的代码:

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 ixx.我在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,然后cr运行代码,然后代码将在满足条件时停止.当我输入时l,bpnumber显示为该行:

          xx-1                  for i in range(100): 
bpnumber> xx                        print i
          xx+1                      ...
Run Code Online (Sandbox Code Playgroud)

我不得不说,文档和所有其他解释都是如此令人困惑,我希望我的答案澄清"调试入口点"和"调试断点"之间的区别


Pau*_* Bu 9

有这样一个快速脏的方式:

for i in range(100):
    if i == 10: import ipdb;ipdb.set_trace()
    print i
Run Code Online (Sandbox Code Playgroud)

它工作,而不必忙于任何其他命令:)

  • 好吧,我同意,但这对代码的侵入性太大,如果我想更改条件,我必须不时更改代码 (2认同)
  • 比如说,如果你已经在pdb中,并且你找不到`i==10`的任何问题,但是你想尝试`i==50`,如果你不能设置条件断点,你必须退出( ) pdb,将代码修改为`if i==50:`并再次运行。这不是用户友好的...无论如何,感谢您的建议 (2认同)

Jim*_*ker 5

我认为您正在寻找一种更直接的解决方案,该解决方案不涉及在代码中添加行,而只涉及调试器命令.

你原来的例子

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)