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

问题描述 投票:0回答:11

我正在使用 pdb 模块来调试程序。我想了解如何退出 pdb 并允许程序继续完成。该程序的运行计算成本很高,因此我不想在脚本尝试完成之前退出。

continue
似乎不起作用。如何退出 pdb 并继续我的程序?

python pdb
11个回答
290
投票

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!

54
投票

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

continue
命令


16
投票

来自 @voithos 的 answer 是正确的,所以我只会在您使用

set_trace
的情况下添加一种替代方案。 是的,
pdb.set_trace = lambda: None
hack 可以正常工作,但如果您设置了其他断点并且想要稍后重新启用它,则不行。 对我来说,这表明不幸的是
pdb
缺少很多功能(甚至是显示列表等基本功能),这是另一种情况。

好消息是

pdb++
pdb
的绝佳替代品,它解决的问题之一正是禁用
set_trace
的问题。 所以你可以简单地做:

pip install pdbpp

然后在

(Pdb++)
提示符下键入:

pdb.disable()

如果您想稍后重新启用,毫不奇怪,这是有效的:

pdb.enable()

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


13
投票

如果您在代码中使用了

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

5
投票

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

如果您想继续调试但不再停在给定的断点处,那么您需要:

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

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


1
投票

我被困在 pdb shell 中,输入只是产生

^M
,所以我无法逃脱它。

经过一些科学设计的实验,结果是

ctrl+Z
拖拽了 pdb shell。 (然后按
stty sane
修复 Enter 键。)

然后您需要终止或恢复 pdb shell。为此,请运行

jobs
,然后运行
fg 1
kill %1
(替换作业编号)。

我想当我下周回到这里时,我会在这里为其他人和我自己记下它。


1
投票
  • 点击
    c
    -> 继续(进一步执行你的程序)
  • 点击
    q
    -> 退出(退出调试器和你的程序)

0
投票

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


0
投票

禁用断点。从 pdb 中,只需键入disable N,其中 N 是您卡住的断点号。如果您不知道令人烦恼的断点编号,请输入 tbreak。这将在“Num”列下按数字列出您的断点,并在“Enb”标题下显示它们是否启用或禁用(是)或否(否)。
一旦你解除了令人烦恼的断点,运行命令 continue (或缩写 c)应该完成你的程序。


0
投票

在 docker shell/容器中运行 pdb,以便退出

运行

pdb.disable()
,然后
exit()


0
投票

如果您在循环内添加了

breakpoint()
,那么不断遇到相同的断点可能会令人沮丧。

输入

clear
,您应该会看到一条消息“清除所有中断?”。输入
y
以清除中断。

然后您应该能够使用

c
继续运行代码(无需命中断点)。

© www.soinside.com 2019 - 2024. All rights reserved.