如何退出 pdb 并允许程序继续?

我正在使用 pdb 模块来调试一个程序。我想了解如何退出 pdb,并允许程序继续向前完成。这个程序的运行计算开销很大,所以我不希望在没有尝试完成脚本的情况下退出。continue似乎不起作用。如何退出 pdb 并继续我的程序?

115408 次浏览

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!

如果您真的希望退出调试器,那么您需要运行类似于 WinPdb的程序,它允许您从进程中脱离,然后退出调试器,(注意。它是多平台的)。

如果希望继续调试,但不再停留在给定的断点,则需要:

  1. 记下断点号(或文件和行号) ,
  2. 要么 cl bp_number 或者 clear file:line永久删除断点 或者 disable pb_number切换它关闭,但能够切换回来。
  3. 然后 continue和您的程序运行,直到下一个 不同断点被命中。

有关上述内容的详细信息,请参阅 手册

一个简单的 Ctrl-D将突破 pdb。如果您想继续而不是中断,只需按 c而不是整个 continue命令

来自@voithos 的 回答是正确的,因此我将在使用 set_trace的情况下添加一个替代方案。是的,pdb.set_trace = lambda: None黑客工作正常,但不是如果您有其他断点设置,并希望以后重新启用它。对我来说,这指向一个事实,不幸的是 pdb缺少一些功能(甚至基本的东西,如显示列表) ,这是另一种情况。

好消息是 pdb++pdb的一个很好的替代品,它解决的问题之一就是禁用 set_trace。因此,你可以简单地这样做:

pip install pdbpp

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

pdb.disable()

如果你想在以后重新启用,毫无疑问这个方法可以奏效:

pdb.enable()

简单! 除此之外,你还会得到许多其他有用的东西。

找到新的方法退出 pdb 而不用安装任何东西: - 当程序开始运行时,按 ctrl + c,然后将窗口切换到另一个(任意窗口) ,然后显示原来运行 pdb 的 shell 比如: (pdb) ... ..。 - 切换回 pdb,然后按回车键,现在一切就绪,pdb 命令 贝壳再次出现

禁用断点。在 pdb 中,只需键入禁用 N,其中 N 是卡住的断点号。如果您不知道令人不安的断点的数目,请输入 tbreak。这将在“ Num”栏中按编号列出您的断点,并在“ Enb”栏中显示是否启用或禁用断点
一旦禁用了令人不安的断点,运行继续命令(或缩写 c)应该就可以完成程序了。

如果你在代码中使用了 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

第6行中的 now (PDb)断点被删除,程序可以继续工作:

(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 中,Enter 只能产生 ^M,所以我无法逃脱它。

经过一些科学精心设计的实验,原来 ctrl+Z会暂停 pdb 外壳。(然后 stty sane会修复 Enter 键。)

然后需要终止或恢复 pdb shell。为此,运行 jobs,然后运行 fg 1kill %1(替换作业编号)。

我觉得我应该在这里给其他人看看下周我回来的时候也给自己看看。