pdb 绕过错误/跳转失败:只能从“行”跟踪事件跳转

sky*_*ang 9 python debugging pdb

我正在尝试使用 pdb 调试 Python 程序。程序可能是这样的:

def main():
    a = 1
    print(b)
    c = 2
    d = 3
Run Code Online (Sandbox Code Playgroud)

显然,print(b) 是一个错字,应该是 print(a) 但这并不重要,我可以用文本编辑器修复它,但我想绕过这个错误并继续调试。

我试过跳转,比如跳转 4(假设“c=2”是第 4 行)但是我得到了错误“跳转失败:f_lineno 只能由行跟踪功能设置”,这意味着我需要在以下情况下提供行跟踪功能我在编程。

那么,有没有办法解决这个问题,或者在使用pdb时有没有其他方法可以绕过错误行?

V-R*_*V-R 5

TLDR:这是pdb 的验尸模式,在这种模式下跳跃不应该起作用。但它仍然非常有用。

在此处输入图片说明

伦勃朗的绘画(公共领域)

我用 python 3.8.2 复制它, *** Jump failed: can only jump from a 'line' trace event就像这样运行“在 pdb 下”的脚本:python3 -m pdb -c c script.py并尝试跳转到 pdb 提示中的另一行,然后出现。

发生了什么:一个未处理的异常,在这种情况下NameError: name 'b' is not defined导致python停止解释脚本;pdb 截获了这种情况,并进入了事后分析模式。

正如 Almar Klein 在他的博客文章中所说的那样,

事后调试是指某些东西损坏进入调试模式的概念。不涉及断点设置,因此速度非常快,您可以检查完整的堆栈跟踪,使其成为跟踪错误的有效方法。

尽管jump, next,return不会在事后工作,bt, up, down,llpp以及导入模块和直接在 pdb 的交互式 shell 中运行任意 python 代码的可能性,可以是获取根本原因的非常有效的方法。在我们的简单示例中,NameError快速显示了 的根本原因ll:pdb 在有问题的代码行前加上>>.

如果我们没有通过-c c(意思是continue),pdb 将在解释程序的第一行之前显示其提示并暂停,因此您将有机会单步执行整个程序或在违规行之前或处设置断点,跳过它,永远不要进入验尸报告。

即使在验尸,你可以准备程序中的断点的任何地方,例如,break 2对于第2行,并说ccontinue这样PDB将完成验尸,重新加载该文件,并重新启动程序与更新的断点集。


对付它的另一种方式是import pdbpdb.set_trace()可疑代码-或因为Python 3.7,简单地breakpoint()-和正常(不PDB了“下”)运行Python程序,然后允许jumpnextreturn等,以及其他一切-当断点被击中。


如果您的 Python 程序是通过behave以下方式启动的:

  • 甘愿冒behave--no-capture每当使用pdb或类似的调试器(无论验尸模式与否),以避免问题的行为的标准输入/输出捕捉使pdb反应迟钝和/或它的提示不可见。
  • 最重要的是,如果您想pdb在可能仍支持捕获的同时自动进入事后分析模式,请将post_mortem环境变量(也可以以不同的方式命名)设置为任何值(但在开发机器上,不适用于自动化 CI 或生产) !) 并将以下内容永久提交到environment.py
def after_step(context, step):
    import os
    if 'post_mortem' in os.environ and step.status == 'failed':
        import pdb
        # Similar to "behave --no-capture" calling stop_capture() ensures visibility of pdb's prompts,
        # while still supporting capture until an uncaught error occurs.
        # Warning: this does rely on behave's internals which might change
        context._runner.stop_capture()  # pylint: disable=protected-access
        pdb.post_mortem(step.exc_traceback)
Run Code Online (Sandbox Code Playgroud)


tfj*_*tfj -2

我不确定,但这可能是 2018 年 3 月修复的错误,因此您可能需要(修补、升级、重新安装?)您的 Python。