使用pdb的条件断点

时间:2014-08-12 22:54:21

标签: python pdb

听起来我错过了一些非常简单的东西,我试图在我的python代码中设置一个断点:

if(some condition):
        pdb.set_trace()

代码中的错误是在大量迭代之后发生的......难以使用print等进行调试。 当条件命中时,我能够打印东西,但我想设置brk-pt。

- 编辑 -

实际代码:

import pdb
if (node_num == 16):
    print node_num
    pdb.set_trace()

3 个答案:

答案 0 :(得分:11)

我看到你找到了解决方案Sanjay。但对于那些到达这里的人来说,寻找一种方法来设置一个条件断点与pdb读取:

而不是像import pdb for node_num in range(50): do_something(node_num) ... 这样的硬编码条件,在交互模式下运行pdb。示例代码:

-m pdb

在shell中使用[rick@rolled ~]$ python -m pdb abc.py > /home/dcadm/abc.py(1)<module>() -> import pdb (Pdb) l 1 -> import pdb 2 3 for node_num in range(50) : 4 foo = 2**node_num [EOF] (Pdb) b 4, node_num > 4 Breakpoint 1 at /home/dcadm/abc.py:4 (Pdb) c > /home/dcadm/abc.py(4)<module>() -> foo = 2**node_num (Pdb) node_num 5 (Pdb)

以调试模式启动脚本
b 4, node_num > 4

当node_num大于4时,pdb shell命令 <td> <a href="#" class="btn btn-info btn-xs"><i class="fa fa-pencil"></i> Edit </a> <a href="#" class="btn btn-danger btn-xs"><i class="fa fa-trash-o"></i> Delete </a> </td> 在第4行中断。

答案 1 :(得分:1)

我不确定您的代码为什么不起作用,但您可以在本地计算机上执行的操作,为您的最小示例创建一个新文件,以查看您是否可以执行您想要执行的操作< / p>

import pdb

for node_num in range(50):
    if node_num == 16:
        print(node_num)
        pdb.set_trace()

现在运行它:

16
> /tmp/tmp.py(3)<module>()
-> for node_num in range(50):
(Pdb) p node_num
16

正如您所看到的,这可以通过这个简单的示例按预期工作,由您决定如何使其适应您的代码,和/或弄清楚您对代码/环境做了什么?这阻止了提示出现。

或者,如果您有一个在异常中死亡的函数并且您想知道导致它的确切行,那么您应该使用post_mortem代替。用这个

包装有问题的代码部分
try:
    problem_function()
except Exception:  # or the specific exception type thrown
    pdb.post_mortem()
    raise

post_mortem会做的是在发生异常的位置(特别是在该堆栈帧中)转储一个断点,这样就可以检查所有值,然后让你继续执行。然而,我也在最后加注,以允许异常继续正常,这是因为执行通常不会从它死亡的地方暂停但只是暂停在该异常处理块由于post_mortem呼叫。在检查出了什么问题之后,还可以放弃。

答案 2 :(得分:1)

要在pdb中实际使用条件断点 ,您可以执行以下操作:

  

b(reak)[([文件名:] lineno | function)[,条件]]

https://docs.python.org/3/library/pdb.html#pdbcommand-break

例如,我正在运行一些遍历Django视图的测试代码。我想仅在达到我感兴趣的特定视图时中断

  

b C:\ Users \ powlo \ project \ tests \ TestCase.py:350,view.view_name   =='app.views.export'