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

tur*_*tle 89 python pdb

我正在使用pdb模块来调试程序.我想了解如何退出pdb并允许程序继续完成.该程序运行起来计算成本很高,因此我不希望在没有脚本尝试完成的情况下退出.continue似乎不起作用.如何退出pdb并继续我的程序?

voi*_*hos 165

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
Run Code Online (Sandbox Code Playgroud)

或者,如果你正在使用pdb.set_trace(),你可以试试这个(虽然如果你以更奇特的方式使用pdb,这可能会破坏......)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
Run Code Online (Sandbox Code Playgroud)

  • 关于设置`set_trace = lambda:None`的好建议:) (29认同)
  • @SteveBarnes:我觉得你太过于字面意思了.OP正在一次又一次地打破一个断点.他们所需要的只是继续他们长期运行的过程而不会遇到断点.Pdb是否实际运行是无关紧要的. (12认同)
  • 上面没有__exit__pdb. (8认同)
  • 关于问题的第15个字! (7认同)
  • 在极端情况下,没有什么比set_trace = lambda:None更好。Python组织应该添加一个命令,该命令只允许您退出pdb。 (2认同)
  • 对于那些希望set_trace在以后再次按预期工作的人.**重新加载(pdb)**从这里获得:/sf/ask/1336919531/ (2认同)

Min*_*iet 21

一个简单的Ctrl- D将打破pdb.如果你想继续而不是打破,只需按下c而不是整个continue命令

  • 当你在一个函数里面,在循环中时呢?它似乎只是为我进入下一个循环,我实际上不能关闭pdb,甚至关闭python,而不关闭整个终端? (4认同)

Abc*_*Xyz 10

如果您breakpoint()在代码中使用,您可以通过环境变量禁用所有这些断点。

import os
os.environ['PYTHONBREAKPOINT'] = '0'
Run Code Online (Sandbox Code Playgroud)

当您处于 (Pdb) 交互状态时,这也适用,这将禁用breakpoint()代码中的所有插入,但不会禁用 (Pdb) 启用的断点。

让我们测试一下,代码breakpoint()在第 4 行:

> /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)
Run Code Online (Sandbox Code Playgroud)

让我们在第 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
Run Code Online (Sandbox Code Playgroud)

breakpoint()现在让我们在第 4 行禁用本例中的所有内容。

(Pdb) import os
(Pdb) os.environ['PYTHONBREAKPOINT'] = '0'
Run Code Online (Sandbox Code Playgroud)

并继续

(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)
Run Code Online (Sandbox Code Playgroud)

现在它停在第 6 行并跳过第 4 行,让我们继续

(Pdb) c
a 2
b 1
> /tmp/py.py(6)<module>()
-> b=2
Run Code Online (Sandbox Code Playgroud)

现在它再次停在第 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
Run Code Online (Sandbox Code Playgroud)

现在(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
Run Code Online (Sandbox Code Playgroud)


Ste*_*nes 5

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

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

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

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


Ada*_*ers 5

@voithos 的答案是正确的,因此在您使用的情况下,我将仅添加一个替代方法set_trace。是的,pdb.set_trace = lambda: None黑客程序可以正常运行,但是如果您设置了其他断点并希望稍后重新启用它,则不会成功。对我来说,这表明不幸的pdb是缺少了许多功能(甚至包括显示列表在内的基本功能),这是另一种情况。

好消息是这pdb++是一个很好的替代品pdb,它解决的问题之一就是禁用问题set_trace。因此,您可以简单地执行以下操作:

pip install pdbpp
Run Code Online (Sandbox Code Playgroud)

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

pdb.disable()
Run Code Online (Sandbox Code Playgroud)

如果您以后想要重新启用,那么毫不奇怪,这可行:

pdb.enable()
Run Code Online (Sandbox Code Playgroud)

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