我怀疑我的一个循环中有问题,所以我用pdb.set_trace()设置了一个断点
import pdb
for i in range(100):
print("a")
pdb.set_trace()
print("b")
在这个循环中检查变量几次之后,我决定继续这个编程而不再进一步休息。所以我尝试用b
命令获取中断号,没有列出中断。我想这行代码不会设置断点。但我如何驾驭这个"断点"没有停止程序并更改代码?
答案 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:1
或set_trace = lambda:1
对我不起作用。
以下技巧在pdb提示符下起作用:
pdb> globals()['set_trace'] = lambda:1
此行首先调用globals()
来访问正在调试的程序的dict,然后在此处修改set_trace
的引用。