Python: 在pdb中,是否可以在n次命中后仅启用断点?

28

在Eclipse(以及其他几个IDE)中,有一个选项可以在特定次数之后才开启断点。在Python的pdb中,断点有一个命中计数器和一个condition命令。如何将它们连接起来?

2个回答

22

条件断点可以通过两种方式设置 -

第一种:使用 break 指定断点设置时的条件。

python -m pdb pdb_break.py
> .../pdb_break.py(7)<module>()
-> def calc(i, n):
(Pdb) break 9, j>0
Breakpoint 1 at .../pdb_break.py:9

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at .../pdb_break.py:9
        stop only if j>0

(Pdb) continue
i = 0
j = 0
i = 1
> .../pdb_break.py(9)calc()
-> print 'j =', j

(Pdb)

第二点:也可以使用condition命令将条件应用于现有的断点。参数是断点ID和表达式。

$ python -m pdb pdb_break.py
> .../pdb_break.py(7)<module>()
-> def calc(i, n):
(Pdb) break 9
Breakpoint 1 at .../pdb_break.py:9

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at .../pdb_break.py:9

(Pdb) condition 1 j>0

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at .../pdb_break.py:9
        stop only if j>0

(Pdb)

源代码

更新:我写了一个更简单的代码。

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

在终端上进行调试 -

$ python 1.py 
> /code/python/1.py(3)<module>()
-> for i in range(100):
(Pdb) l
  1     
  2     import pdb; pdb.set_trace()
  3  -> for i in range(100):
  4         print i
[EOF]
(Pdb) break 4, i==3
Breakpoint 1 at /code/python/1.py:4
(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /code/python/1.py:4
    stop only if i==3
(Pdb) c
0
1
2
> /Users/srikar/code/python/1.py(4)<module>()
-> print i
(Pdb) p i
3

这个断点有一个变量来保存命中次数吗?可以用其他变量代替 j 吗? - zenpoy
j 是当前循环迭代。你所说的“断点命中计数”是什么意思? - Srikar Appalaraju

22

我找到了答案。其实很简单,有一个命令叫做ignore,比如你想在第9行的断点处,在1000次命中后中断:

b 9

输出: 断点 1 在 ... 处

ignore 1 1000

输出:将忽略下一个 1000 次断点 1 的穿越。

 c

请再解释一下。在“忽略1”中的1是什么意思? - KansaiRobot
@KansaiRobot - 1 指的是断点编号1。 - zenpoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接