如何在不停止python程序的情况下禁用pdb.set_trace()并编辑代码

时间:2017-09-12 01:29:35

标签: python pdb

我怀疑我的一个循环中有问题,所以我用pdb.set_trace()设置了一个断点

import pdb
for i in range(100):
    print("a")
    pdb.set_trace()
    print("b")

在这个循环中检查变量几次之后,我决定继续这个编程而不再进一步休息。所以我尝试用b命令获取中断号,没有列出中断。我想这行代码不会设置断点。但我如何驾驭这个"断点"没有停止程序并更改代码?

4 个答案:

答案 0 :(得分:16)

据我所知,你无法绕过set_trace,但是你可以中和它,一旦调试器停止,输入:

pdb.set_trace = lambda: 1

然后继续,它不会再次破裂。

答案 1 :(得分:4)

设置断点(需要 Python 3.7):

breakpoint()

禁用使用 breakpoint() 函数设置的断点:

import os
os.environ["PYTHONBREAKPOINT"] = "0"

长话:

在 Python 3.7 版本中,引入了用于设置断点的内置函数 breakpoint()。默认情况下,它将调用 pdb.set_trace()。此外,自 Python 3.7 版本以来,PYTHONBREAKPOINT 环境变量可用。使用breakpoint()函数时考虑。
因此,为了禁用这些断点(使用 breakpoint() 函数设置),可以像这样设置 PYTHONBREAKPOINT 环境变量:

import os
os.environ["PYTHONBREAKPOINT"] = "0"

在这里提到 sys.breakpointhook() 可能很有用,它也在 3.7 版本的 Python 中添加并允许自定义断点行为。

答案 2 :(得分:3)

不幸的是pdb缺少一堆功能(甚至是基本的东西,比如显示列表),你在这里找到了另一个例子。好消息是pdb++pdb的绝佳替代品,它解决的问题之一就是禁用set_trace的问题。所以你可以这样做:

pip install pdbpp

然后在(Pdb++)提示符下输入

pdb.disable()

轻松!而且你将获得许多其他有用的东西。

答案 3 :(得分:0)

有可能在没有PDB控制的情况下启动Python脚本,但随后碰到那里的流浪set_trace()。为了防止每次遇到set_trace()时都进入调试器,可以应用与上述类似的技巧(将符号的引用更改为指向无害的函数)。

但是,必须修改调试对象的名称空间,而不是调试器本身之一。简单地覆盖pdb.set_trace = lambda:1set_trace = lambda:1对我不起作用。

以下技巧在pdb提示符下起作用:

pdb> globals()['set_trace'] = lambda:1

此行首先调用globals()来访问正在调试的程序的dict,然后在此处修改set_trace的引用。