gpt4 book ai didi

python - 允许调试生成的代码的最佳或正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 15:03:04 24 4
gpt4 key购买 nike

由于各种原因,在一个项目中,我通过从各种源文件生成 AST 并将其编译为字节码来生成可执行代码(尽管我猜这个问题也适用于直接生成字节码的情况)。
从一些实验来看,调试器或多或少只使用 lineno与传递给 compile 的文件名一起嵌入 AST 的信息为了为调试器的目的提供一种表示,但是这假设正在执行的代码来自单个磁盘文件。
我的项目不一定是这种情况,可执行代码可以从多个来源拼凑在一起,其中部分或全部来源可能是通过网络获取的,或者是从非磁盘存储(例如数据库)中检索的。
所以我的 Y 问题,这可能是错误的(因此是背景):

  • 是否可以提供某种内存缓冲区,或者是否有必要生成“虚拟源”的单一磁盘表示?
  • 如果虚拟源不能或不应该被线性化,调试器将如何处理在不同位和块之间跳转[0]
  • 以防万一,Python 只支持单个连续源文件的假设是正确的,还是实际上可以以某种方式提供多个源?

  • [0] 例如 web-style literate program将以其原始形式进行调试,在代码部分之间跳转,而不是以所谓的“纠结”形式

    最佳答案

    其中一些可以由 trepan3k 处理。调试器。对于其他事情,各种 Hook 已就位。
    首先它可以单独基于字节码进行调试。但当然,如果行号表不存在,则无法执行步进指令。出于这个原因,如果没有其他原因,我会为每个逻辑停止点添加一个“行号”,例如在语句的开头。这些数字不必是行号,它们可以从 1 开始计数,也可以是其他表的索引。这或多或少是 go 的 Pos 类型位置的工作原理。
    调试器会让你在一个函数上设置断点,但该函数必须存在,当你启动任何 python 程序时,你定义的大多数函数都不存在。因此,执行此操作的典型方法是修改源以在某个时候调用调试器。在 trepan3k 中,这个术语是:

    from trepan.api import debug; debug()
    在您想要中断并已定义的其他功能的地方执行此操作。
    并且可以将函数指定为现有变量的方法,例如 self.my_function()此调试器的高级功能之一是将反编译字节码以生成源代码。有一个命令叫 deparse这将显示您当前停止位置的上下文。
    解析字节码虽然有点困难,因此根据您获得的字节码类型,结果可能会有所不同。
    至于虚拟源问题,嗯,这种情况在调试器中是有点容忍的,因为在没有源的情况下,这种事情必须继续进行。并且为了方便这个和远程调试(本地和远程的文件位置可以不同),我们允许文件名重新映射。
    另一个图书馆 pyficache用于此重新映射;我相信它具有将一个文件的连续行重新映射到另一个文件中的行的能力。我认为你可以一遍又一遍地使用它。然而,到目前为止,还没有必要这样做。那个代码已经很旧了。所以有人必须在这里加强 trepan3k。
    最后,与 trepan3k 相关的是 trepan-xpy这是一个 CPython 字节码调试器,即使行号表为空,它也可以步进字节码指令。

    关于python - 允许调试生成的代码的最佳或正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66635101/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com