24

假设我有以下代码:

for i in range(100):
    print i

一般来说,我可以在代码中添加一行:

for i in range(100):
    import ipdb;ipdb.set_trace()
    print i

但是,现在我想在 的条件下调试它i == 10,又不想c在 ipdb 中输入 10 次,我该怎么办?

在我找到的文档中condition bpnumber [condition],但我怎么知道bpnumber是否没有bpnumber索引列表。文档还说b(reak) ([file:]lineno | function) [, condition]。例如,假设 的行号print ixx。我在 ipdb shell 中输入了以下内容:b xx, i == 10但没有发生任何预期的事情。

4

3 回答 3

27

我自己做了一些探索,这是我对pdb.

当您输入时,import ipdb;ipdb.set_trace()您实际上是在行中添加了一个入口点ipdb,而不是真正的断点。

输入之后ipdb,就可以设置断点了。

所以,要实现我想要的条件调试,我应该这样做:

import ipdb;ipdb.set_trace()
for i in range(100):
    print i

然后我输入后ipdb,我可以输入b xx, i == 10,然后cr运行代码。满足条件时代码将停止。

当我输入l时,bpnumber该行显示为:

          xx-1                  for i in range(100): 
bpnumber> xx                        print i
          xx+1                      ...

不得不说,文档和所有其他的解释都非常混乱,希望我在这里的回答能够阐明“调试入口点”和“调试断点”之间的区别

于 2013-06-24T18:02:22.003 回答
12

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

for i in range(100):
    if i == 10: import ipdb;ipdb.set_trace()
    print i

它可以工作,不必用任何其他命令来忙你的思想:)

于 2013-06-24T16:40:53.813 回答
8

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

你原来的例子

b xx, i == 10 

不起作用,因为您在代码中插入 ipdb.set_trace() 命令的位置设置断点。通过在调试器中添加语句 'b xx, i == 10',您实际上在同一位置定义了 2 个断点(1 个条件断点和 1 个无条件断点)(假设 xx 是 set_trace() 命令所在的行)。

或者,一旦您使用“b”命令在代码中定义了断点,这显然对您有用。您可以通过以下方式向断点添加条件

condition bpnumber boolean-expression

例如

condition 1 i == 10

注意:bpnumber 是分配给断点的编号,而不是代码中的行。要查看断点列表,只需键入不带参数的“b”。

此外,如果您想在不使用 ipdb.set_trace() 的情况下进入调试模式,您只需在启用 pdb/ipbd 模块的情况下运行您的代码

python -m pdb foo.py
于 2014-10-15T19:07:20.570 回答