【问题标题】:How to exit pdb and allow program to continue?如何退出pdb并允许程序继续?
【发布时间】:2013-07-23 20:40:44
【问题描述】:

我正在使用 pdb 模块来调试程序。我想了解如何退出 pdb 并允许程序继续完成。该程序在计算上运行起来很昂贵,所以我不想在没有脚本尝试完成的情况下退出。 continue 似乎不起作用。如何退出 pdb 并继续执行我的程序?

【问题讨论】:

  • continue 退出循环,return 退出方法/函数
  • @Stephan:他说的是continue,pdb 命令。不是 Python 语句。
  • @turtle: continue 应该“继续执行,仅在遇到断点时停止”,根据文档。你有一个被命中的断点集吗?
  • 啊。好的我明白了。是的,我在循环中设置了一个断点。无论如何要解决这个问题?循环被调用了数千次,所以我不能继续手动点击继续。
  • @turtle:你是否在 Pdb 中设置了断点,或者你的源代码中有pdb.set_trace()

标签: python pdb


【解决方案1】:

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!

【讨论】:

  • 以上没有退出 pdb。
  • 关于问题的第15个字!
  • @SteveBarnes:我认为你太从字面上理解了。 OP 只是一遍又一遍地遇到断点。他们所需要的只是继续他们的长期运行过程而不会遇到断点。 Pdb 是否实际运行无关紧要。
  • 关于设置set_trace = lambda: None 的好技巧 :)
  • 对于那些希望 set_trace 在以后再次按预期工作的人。 reload(pdb) 从这里获取:stackoverflow.com/questions/19098850/…
【解决方案2】:

一个简单的Ctrl-D就可以跳出pdb。如果您想继续而不是中断,只需按 c 而不是整个 continue 命令

【讨论】:

  • 当你在一个函数里面,在一个循环里面怎么办?对我来说似乎只是进入下一个循环,而我实际上无法关闭pdb,甚至关闭python,而不关闭整个终端?
  • @LimokPalantaemon Weird,你试过输入exit
  • 如果你设置了跟踪或者如果你有断点,除非你继续按 c,否则这不起作用。
  • 尴尬,但这让我免于被困太久-_-
  • 这也会关闭 python 控制台。
【解决方案3】:

来自@voithos 的answer 是正确的,所以我将在您使用set_trace 的情况下添加一个替代方案。是的,pdb.set_trace = lambda: None hack 可以正常工作,但如果您设置了其他断点并希望稍后重新启用它,则不会。对我来说,这表明不幸的是 pdb 缺少一堆功能(甚至是显示列表等基本功能),这是另一种情况。

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

pip install pdbpp

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

pdb.disable()

如果您想稍后重新启用,不出所料,这是可行的:

pdb.enable()

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          如果您在代码中使用了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) clear 1
          Deleted breakpoint 1 at /tmp/py.py:6
          

          现在第6行的(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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-27
            • 2020-07-26
            • 1970-01-01
            相关资源
            最近更新 更多