【问题标题】:pdb/ipdb for python break on editable conditionpdb/ipdb 用于可编辑条件下的 python 中断
【发布时间】:2013-06-24 16:39:08
【问题描述】:

假设我有以下代码:

for i in range(100):
    print i

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

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

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

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

【问题讨论】:

    标签: python pdb


    【解决方案1】:

    我自己做了一些探索,这是我对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                      ...
    

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

    【讨论】:

    • @Rugnar xx 表示如左图所示的行号
    【解决方案2】:

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

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

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

    【讨论】:

    • 嗯,我同意,但这对代码的侵入性太大,如果我想更改条件,我必须不时更改代码
    • 好吧,但想想看,我编辑了我的代码,只保留了一行代码。就像import pdb;ipdb.set_trace() 一样具有侵略性,你不觉得吗。虽然我同意使用condition 会很有用,但我似乎找不到任何关于如何使用它的参考。
    • 说,如果你已经在pdb中,你找不到i==10的任何问题,但是你想尝试i==50,如果你不能设置条件断点,你必须exit() pdb,修改代码为if i==50:,再次运行。这不是用户友好的......无论如何,谢谢你的建议
    【解决方案3】:

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

    你原来的例子

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2017-01-02
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多