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

2023-12-24

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

def main():
    a = 1
    print(b)
    c = 2
    d = 3

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

我尝试了跳转,例如跳转4(假设“c=2”是第4行),但出现错误“跳转失败:f_lineno只能由线路跟踪函数设置”,这意味着我需要在以下情况下给出线路跟踪函数:我正在编程。

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


总而言之:这是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)在他的书中很好地指出的那样博客文章 https://almarklein.org/pm-debugging.html,

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

虽然jump, next, return死后不会起作用,bt, up, down, ll and pp,以及导入模块并直接在 pdb 的交互式 shell 中运行任意 python 代码的可能性,可以是找到根本原因的非常有效的方法。在我们的简单示例中,根本原因是NameError快速显示后立即显示ll: pdb 在有问题的代码行前面加上前缀>>.

如果我们没有通过-c c(意义continue),pdb 会在解释程序的第一行之前显示其提示并暂停,因此您有机会单步执行整个程序或在有问题的行之前或处设置断点,然后跳过它,永远不会进入尸检。

即使在事后分析中,您也可以在程序中的任何位置准备断点,例如break 2对于第 2 行,并说c or continue因此 pdb 将完成事后分析,重新加载文件,并使用更新的断点集重新启动程序。


另一种处理方法是import pdb and pdb.set_trace()在可疑代码中 - 或者从 python 3.7 开始,简单地breakpoint()- 并正常运行 python 程序(不再是“在”pdb 下),这样就可以jump, next, return等等,以及其他一切 - 当断点被击中时。


如果你的Python程序是通过behave:

  • 更喜欢跑步behave with --no-capture每当使用pdb或类似的调试器(无论是否为事后分析模式),以避免行为的 stdin/stdout 捕获出现问题pdb无响应和/或其提示不可见。
  • 最重要的是,如果你想最终进入pdb自动事后模式,同时可能仍支持捕获,设置post_mortem环境变量(也可以以不同的方式命名)为任何值(但是only在开发机器上,不适用于自动化 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 减少 numpy 数组的内存大小

    我正在为深度学习创建窗口数据的数据集 我将数据生成为 numpy 数组 其中 4 个形状为 141038 360 的数组和 1 个形状为 141038 的标签的数组 我将数组保存在 npz 文件中 但文件大小太大 达到 1 5 GB 我是
  • 如何使用 Fabric.js 创建自定义画笔涂料?

    我一直在尝试使用图像文件创建自定义画笔绘画织物JS http fabricjs com 我尝试过使用布料 PatternBrush http fabricjs com docs fabric PatternBrush html但这不是我正在
  • MySQL-如何创建一个新表,该表是两个现有表的主键的联接

    我有两个现有表 具有不同的字段 但主 ID 主 ID 除外varchar 不是一个int 我想创建第三个表 它本质上是这两个表的合并 这样对于给定的主键 我将所有字段都放在一个表中 如何才能做到这一点 CREATE TABLE result
  • 如何将Azure机器学习批量评分结果写入数据湖?

    我正在尝试将批量评分的输出写入数据湖 parallel step name batchscoring datetime now strftime Y m d H M output dir PipelineData name scores d
  • ios 上的 ionic firebase 手机身份验证无需重新验证

    我有一个离子应用程序 我使用 firebase 电话身份验证 该身份验证使用 recapcha 它在 android 上运行良好 但在 ios 上抛出错误 提示 recaptcha 只能在 http 环境中运行 我想知道是否有一种方法可以在
  • 方法参考,协方差逆变

    我刚刚发现java 8允许引用具有更具体的返回类型和更通用的参数的方法 import java util function Function public class MethodReferences public static Integ
  • 如何从 @types/jsonwebtoken 添加附加属性到 JwtPayload 类型

    我是打字稿新手 正在尝试移植快速应用程序以使用打字稿 服务器使用 JWT 进行身份验证 授权 我有一个实用程序函数可以解码和验证给定的令牌 该函数被包装在一个承诺中 因此我可以在实现它的中间件中使用 async await import h
  • java.lang.IllegalArgumentException:无法获取数组 的 JDBC 类型

    我想将输出数据导入到mysql数据库中 但是出现以下错误 我不会将数组转换为所需的字符串类型 可以帮助我吗 val Array trainingData testData msgDF randomSplit Array 0 9 0 1 va
  • Google Chrome 颜色选择器没有响应

    Google Chrome 颜色选择器没有响应 我尝试重新安装并重置 Chrome 如何解决这个问题 重置开发工具 并不能解决问题 我不完全确定此错误的确切原因是什么 但唯一可用的修复需要在更新中完成 尽管我没有花太多时间寻找 但我在代码本
  • 尝试使用 Highgui.imread 加载图像(OpenCV + Android)

    我尝试加载图像 File root Environment getExternalStorageDirectory File file new File root image gif Mat m Highgui imread file ge
  • 如何根据标点符号和空格分割字符串?

    我有一个String我想根据标点符号和空格进行分割 的正则表达式参数应该是什么split method 带有一些怪异处理的代码 请注意 它会跳过输出循环中的空标记 这又快又脏 您可以将需要拆分和删除的任何字符添加到正则表达式模式中 tchr
  • 透明背景的颤动角半径

    下面是我的代码 我希望渲染一个具有透明背景的圆角容器 return new Container padding const EdgeInsets all 32 0 height 800 0 color const Color 0xffDC1
  • 为什么堆内存使用量和加载的类数量不断增加?

    我在用JVM Explorer 链接到 JVM 资源管理器 http jvmmonitor org doc index html 来分析我的 Spring 应用程序 我对此有以下问题 为什么 已用堆内存 在申请后仍然不断增加 已启动但尚未收
  • bootstrap 3在模式弹出后禁用背景[重复]

    这个问题在这里已经有答案了 我正在尝试使用下面给定的代码在我的代码中弹出 bootstrap 3 模式 div class modal fade div class modal dialog div class modal content
  • Android Studio-图像显示在设计视图中但不在模拟器中

    我正在学习 android 应用程序开发 因此 当我构建一个简单的应用程序以在屏幕上显示两个图像时 我使用了 ImageView 图像显示在 android studio 设计屏幕中 但是当我尝试使用运行应用程序时genymotion 模拟
  • 多态性(继承)和值类型

    我有很多类型 PixelMeasure PointMeasure CentimeterMeasure等等 表示带有单位的值 我希望他们有 值语义 例如实际上是不可变的 不必担心内存分配 并且 多态性 我可以返回一个类型的对象Measure并
  • 在 Express 中监听 UDP 消息

    我有一个使用 Express 的基本 Node js 服务器 它需要能够处理 TCP 消息以及 UDP 消息 TCP 部分已启动并运行良好 但现在我需要集成一种嗅探 UDP 消息的方法 我尝试使用以下方法将处理程序添加到过滤器堆栈中dgra
  • java中的toArray与stream.toArray有什么性能差异

    我需要将 ids 列表转换为 ids 数组 我可以通过多种方式做到这一点 但不确定应该使用哪一种 Say 1 ids stream toArray Id new 2 ids toArray new Id ids length 哪一种更有效
  • 使用 XmlDocument 保留 xml 格式

    我正在使用 XmlDocument 来处理 xml 如何使用当前格式保存 XmlDocument 当前格式
  • pdb 绕过错误/跳转失败:只能从“行”跟踪事件跳转

    我正在尝试使用 pdb 调试 Python 程序 程序可能是这样的 def main a 1 print b c 2 d 3 显然 print b 是一个拼写错误 应该是 print a 但这并不重要 我可以用文本编辑器修复它 但我想绕过这