Python,pdb,添加仅断开一次的断点

时间:2013-08-22 12:16:24

标签: python pdb

我有时会在深循环代码中设置断点,如下所示:

import pdb; pdb.set_trace()

如果我按下c,它会继续,但会在循环的下一次迭代中再次中断。 有没有办法从pdb中清除这个断点? b命令不会列出它。

或者我是否可以在我的Python源文件中插入一个可以清除的“软”断点?

或者理想情况下是设置跟踪的单线,然后自行清除?


编辑:我对任何可以设置断点的编辑器感兴趣。

我目前从emacs运行我的脚本如下:

M-x pdb
Run ~/.virtualenvs/.../python2.7/pdb.py (like this):
     ~/.virtualenvs/.../python2.7/pdb.py ~/start-myserver.py

4 个答案:

答案 0 :(得分:1)

您可以手动设置并运行调试器,而不是使用set_trace设置断点。 pdb.Pdb.set_break()接受一个参数temprorary,这将导致断点在第一次被击中时被清除。

import pdb

def traced_function():
    for i in range(4):
        print(i)  # line 5

if __name__ == '__main__':
    import pdb
    p = pdb.Pdb()
    # set break on the print line (5):
    p.set_break(__file__, 5, temporary=True)
    p.run('traced_function()')

示例输出:

$ python pdb_example.py 
> <string>(1)<module>()
(Pdb) c
Deleted breakpoint 1 at /tmp/pdb_example.py:5
> /tmp/test.py(5)traced_function()
-> print(i)  # line 5
(Pdb) c
0
1
2
3

通过从命令行使用pdb运行程序可以实现同样的目的,但是这样设置允许您在退出调试器会话时保留调用之间的断点而不会丢失它们。

答案 1 :(得分:1)

设置跟踪的一个衬里,然后自行清除(用空函数覆盖):

import pdb; pdb.set_trace(); pdb.set_trace = lambda: 0

致电reload(pdb)以恢复pdb.set_trace。 (Python 3.x中的imp.reload(pdb)

答案 2 :(得分:0)

鉴于import pdb; pdb.set_trace()是临时的代码行,我认为最简单的方法是使用布尔值:

has_trace = True
for line in data:
    if has_trace:
        import pdb; pdb.set_trace()
        has_trace = False
    # ... other code here

答案 3 :(得分:-1)

可能不是你想要的,但在emacs中,

我可以使用某个键来破解和破坏C区域(我不记得了:()