gpt4 book ai didi

python - 在 Python 中,有没有办法保存/转储/序列化 PDB 调试 session ?

转载 作者:行者123 更新时间:2023-12-03 16:57:33 28 4
gpt4 key购买 nike

我一直在使用 Python 程序,这些程序需要几个小时才能完成,但偶尔会崩溃。为了调试,到目前为止,我一直在添加条件断点,每当出现问题时,这些断点都会让我进入 PDB session 。这很好,因为查明问题的确切原因很难,交互式 session 让我可以探索整个程序(包括所有堆栈帧等)。
唯一的问题是,如果我不小心关闭或崩溃了我的调试 session ,我需要再次启动整个程序!达到我的断点需要几个小时!我会真的 , 真的就像序列化 PDB session 并多次重新打开它的方式。这样的东西存在吗?我已经研究了 dill 来序列化一个解释器 session ,不幸的是我的几种类型都无法序列化(它对代码更改也不是很健壮)。谢谢!

最佳答案

您还没有指定您选择的操作系统,但在 linux 世界中有一个 criu 实用程序 - https://criu.org/Main_Page ,可用于保存应用程序状态。现在有很多陷阱,尤其是基于 tty 的应用程序(参见 https://criu.org/Advanced_usage#Shell_jobs_C.2FR),但这里有一个例子。

  • 我得到了一个带有 pdb 调试点的简单 python 应用程序,我们称之为 app.py :
    print("hello")
    import pdb; pdb.set_trace()
    print("world")
  • 使用 python app.py 运行此应用程序后你被期待
    hello
    > /home/user/app.py(3)<module>()
    -> print("world")
  • 使用 pgrep -f app.py 获取您的 pid ,就我而言,它是 17060
  • 创建一个文件夹来转储您的进程
    mkdir /tmp/criu
  • 转储你的过程
    sudo criu dump -D /tmp/criu -t 17060 --shell-job 
    请注意,您当前的进程将被终止(AFAIK 由于 --shell-job 键,请参阅上面的链接)。
    你会看到的
    (Pdb) [1]    17060 killed     python app.py
    在你的 tty
  • 恢复你的过程
    sudo criu restore -D /tmp/criu --shell-job
    您的 tty 将在您使用此命令的同一窗口中恢复。
  • 由于附加了调试器,您可以输入 c并进入以查看它是否真的有效。这是我机器上的结果:
    (Pdb) c
    world

  • 希望有帮助,有很多陷阱可能会使这种方法对您不可行。
    另一种方法是每次都在 VM 和快照磁盘和内存中运行您的代码。它可能不是资源方面的最佳解决方案,但许多虚拟机管理程序都有一个很好的 UI,甚至是 shell 实用程序来控制虚拟机的状态。现在,快照技术在任何管理程序中都很成熟,您应该不会遇到任何问题。恢复快照后,设置远程调试并连接到您最喜欢的 IDE。
    编辑:如果您在容器中运行应用程序并且您的操作系统支持 podman 和 criu 3.11+,那么还有一种简单的方法可以做到这一点
    https://criu.org/Podman
    你可以使用类似的东西
    podman run -d --name your_container_name your_image
    快照使用
    podman container checkpoint your_container_id
    恢复使用
    podman container restore your_container_id
    所有这些命令都需要 root 权限。不幸的是,我无法测试它,因为我的发行版提供了 criu 3.8,而 podman 需要 3.11。
    与 Docker 中的实验标志相同的功能可用,请参阅 https://criu.org/Docker

    关于python - 在 Python 中,有没有办法保存/转储/序列化 PDB 调试 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66895035/

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