12

如果我想运行一个脚本并pdb捕获任何异常,我会像这样调用它:

python -m pdb script.py

或者:

pdb script.py

问题是它立即在调试提示符处停止:

> /home/coiax/Junkyard/script.py(1)<module>()
-> import sys
(Pdb) 

我必须输入ccontinue让它去。有没有办法让它只加载和启动脚本而不最初询问我是否要设置任何断点或其他什么?

我发誓我已经阅读了pdb模块文档,并尝试制作一个 .pdbrc 文件,其中包含

c

但它不会自动启动。

4

6 回答 6

12

您可以使用以下方法轻松实现您想要的ipython

ipython yourmodule.py --pdb

每当引发未正确捕获的异常(即程序崩溃)时,您会立即在引发异常的位置进入 ipython 的调试器。从那里你可以上下移动堆栈,检查变量等。这在使用 Python 开发时可以节省大量时间;我用它所有的时间。

于 2013-10-15T14:29:33.907 回答
7

从 Python 3.2 开始,您可以使用以下内容:

python3 -m pdb -c c script.py
于 2015-05-18T15:40:15.880 回答
2

它完全按照您的描述工作,并希望它在 python 3.3 中工作——在 .pdbrc 文件中使用“c”字符。

pdb模块文档说这是在 3.2 中添加的:

在 3.2 版中更改:.pdbrc 现在可以包含继续调试的命令,例如 continue 或 next。以前,这些命令无效。

于 2013-10-17T00:22:16.860 回答
1

这可能不是解决方法。

您应该修改/扩展现有的 pdb.py。代码如下所示:

while True:
    try:
        pdb._runscript(mainpyfile)
        if pdb._user_requested_quit:
            break
        print "The program finished and will be restarted" 
    except:
        traceback.print_exc()
        print "Uncaught exception. Entering post mortem debugging"
        print "Running 'cont' or 'step' will restart the program"
        t = sys.exc_info()[2]
        pdb.interaction(None, t)
        print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"

看起来你可以用类似的东西替换 `pdb._runscript(mainpyfile)'

runpy.run_module(sys.argv[0], run_name="__main__", alter_sys=True)

(来自PEP 338)。

不是一个完整的解决方案,我还没有测试过,但也许它有帮助。

编辑:但对于一个更简单的解决方案,对于单个脚本,您的脚本可能以如下内容结尾:

if __name__ == '__main__':
    call_main_function()

你只需更换它

if __name__ == '__main__':
    try:
        call_main_function()
    except:
        import pdb
        t = sys.exc_info()[2]
        pdb.interaction(None, t)

(从 pdb.py 窃取的最后一个代码,这正是它在遇到未处理的异常时所做的)。

于 2013-10-11T13:57:52.610 回答
0

确定它实际上没有运行吗?从文档

当作为脚本调用时,如果被调试的程序异常退出,pdb会自动进入事后调试。事后调试后(或程序正常退出后),pdb会重启程序。自动重启会保留 pdb 的状态(例如断点),并且在大多数情况下比在程序退出时退出调试器更有用。

强调我的。

当我运行我的程序试图弄清楚为什么它会做同样的事情(显示第一行代码)时,我一直在尝试不同的事情,最后我注意到了这一行:

程序完成并将重新启动

如果您的程序实际上是在无异常运行然后重新启动,那么它似乎从您程序的最开始处开始。

于 2013-10-14T21:13:33.273 回答
-2

pdb没有为您提供便利的命令。您可以尝试使用像 PyDev 的 PyCharm 这样的 IDE。你可以按照 Corley Brigman 的建议去做,或者你可以简单地使用一个 IDE,这会让生活变得更轻松。

于 2013-10-14T20:19:18.510 回答