4

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

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

4 回答 4

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从命令行运行程序来实现,但是像这样设置它可以让您保留调用之间的断点,并且在退出调试器会话时不会丢失它们。

于 2013-08-22T12:38:36.550 回答
1

设置跟踪,然后清除自身(用空函数覆盖)的单行:

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

调用reload(pdb)恢复pdb.set_trace。(imp.reload(pdb)在 Python 3.x 中)

于 2013-08-22T16:39:57.500 回答
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
于 2013-08-22T12:22:51.523 回答
-1

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

我可以用 C-space 来打破和打破一些关键(我不记得了:()

于 2013-08-22T12:21:28.013 回答