我正在使用 pdb 模块来调试程序。我想了解如何退出 pdb 并允许程序继续完成。该程序的运行计算成本很高,因此我不想在脚本尝试完成之前退出。
continue
似乎不起作用。如何退出 pdb 并继续我的程序?
continue
应该“继续执行,仅在遇到断点时停止”,这样你就在某处设置了断点。要删除断点(如果您手动插入):
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue
或者,如果你正在使用
pdb.set_trace()
,你可以尝试这个(尽管如果你以更奇特的方式使用pdb,这可能会破坏事情......)
(Pdb) pdb.set_trace = lambda: None # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
一个简单的 Ctrl-D 将突破 pdb。如果您想继续而不是中断,只需按 c 而不是整个
continue
命令
来自 @voithos 的 answer 是正确的,所以我只会在您使用
set_trace
的情况下添加一种替代方案。 是的,pdb.set_trace = lambda: None
hack 可以正常工作,但如果您设置了其他断点并且想要稍后重新启用它,则不行。 对我来说,这表明不幸的是 pdb
缺少很多功能(甚至是显示列表等基本功能),这是另一种情况。
pdb++
是 pdb
的绝佳替代品,它解决的问题之一正是禁用 set_trace
的问题。 所以你可以简单地做:
pip install pdbpp
然后在
(Pdb++)
提示符下键入:
pdb.disable()
如果您想稍后重新启用,毫不奇怪,这是有效的:
pdb.enable()
简单! 除此之外,您还会获得许多其他有用的东西。
如果您在代码中使用了
breakpoint()
,您可以通过环境变量禁用所有这些断点。
import os
os.environ['PYTHONBREAKPOINT'] = '0'
当您处于 (Pdb) 交互状态时,这也有效,这将禁用代码中插入的所有
breakpoint()
,但不会禁用 (Pdb) 启用的断点。
所以让我们测试一下,代码第 4 行有
breakpoint()
:
> /tmp/py.py(5)<module>()
-> print(x,a)
(Pdb) ll
1
2 for x in "abcdefg":
3 a=1
4 breakpoint()
5 -> print(x,a)
6 b=2
7 print(x,b)
让我们在第 6 行设置新的断点。
(Pdb) break 6
Breakpoint 1 at /tmp/py.py:6
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /tmp/py.py:6
现在让我们在第 4 行禁用所有
breakpoint()
。
(Pdb) import os
(Pdb) os.environ['PYTHONBREAKPOINT'] = '0'
并继续
(Pdb) c
a 1
> /tmp/py.py(6)<module>()
-> b=2
(Pdb) ll
1
2 for x in "abcdefg":
3 a=1
4 breakpoint()
5 print(x,a)
6 B-> b=2
7 print(x,b)
现在它停在第 6 行并跳过第 4 行,让我们继续
(Pdb) c
a 2
b 1
> /tmp/py.py(6)<module>()
-> b=2
现在又在第 6 行停止并跳过第 4 行
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /tmp/py.py:6
(Pdb) clear 1
Deleted breakpoint 1 at /tmp/py.py:6
现在(Pdb)第 6 行的断点被删除,程序可以继续工作:
(Pdb) c
b 2
c 1
c 2
d 1
d 2
e 1
e 2
f 1
f 2
g 1
g 2
我被困在 pdb shell 中,输入只是产生
^M
,所以我无法逃脱它。
经过一些科学设计的实验,结果是
ctrl+Z
拖拽了 pdb shell。 (然后按 stty sane
修复 Enter 键。)
然后您需要终止或恢复 pdb shell。为此,请运行
jobs
,然后运行 fg 1
或 kill %1
(替换作业编号)。
我想当我下周回到这里时,我会在这里为其他人和我自己记下它。
c
-> 继续(进一步执行你的程序)q
-> 退出(退出调试器和你的程序)找到退出 pdb 的新方法而不安装任何东西: - 当程序开始运行时,按 ctrl+c,然后将窗口切换到另一个(任何窗口),然后 pdb 运行的原始 shell 应该显示 像这样的东西:(pdb)...... - 切换回pdb,然后按Enter键,现在一切就绪,pdb命令 贝壳再次出现
禁用断点。从 pdb 中,只需键入disable N,其中 N 是您卡住的断点号。如果您不知道令人烦恼的断点编号,请输入 tbreak。这将在“Num”列下按数字列出您的断点,并在“Enb”标题下显示它们是否启用或禁用(是)或否(否)。
一旦你解除了令人烦恼的断点,运行命令 continue (或缩写 c)应该完成你的程序。
在 docker shell/容器中运行 pdb,以便退出
运行
pdb.disable()
,然后exit()
如果您在循环内添加了
breakpoint()
,那么不断遇到相同的断点可能会令人沮丧。
输入
clear
,您应该会看到一条消息“清除所有中断?”。输入 y
以清除中断。
然后您应该能够使用
c
继续运行代码(无需命中断点)。