V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gaogaotiantian
V2EX  ›  Python

聊一个最近在做的 post-mortem debugging tool 吧

  •  
  •   gaogaotiantian · 1 天前 · 579 次点击

    Post-mortem debugging 一直是一个很有趣的方向,它可以很大程度上解决 bug 不复现或者难复现的问题。一个很常见的例子是,在 CI 上一个 test fail 了,但是本地怎么跑都没问题,就很痛苦。logging 这个事情永远没有一个正确的量,少了信息不够,多了信息找不到。我们期待的是可以“重建”这个测试挂掉时候的状态(当然更理想的是把整个程序的运行过程重建,那是个更大的话题了)。

    我在这个领域做了不少尝试,然后最近做出来一个自己还比较满意的东西,coredumpy

    https://github.com/gaogaotiantian/coredumpy

    这是个解决 python 的 post-mortem debugging 的工具。它的核心点其实就是一个,可以对程序当前运行状态做一个 snapshot ,然后保存 dump ,在进程结束后用这个 dump 文件去重建。

    这个概念本身并不算新,在一些 native 语言里是存在的。python 这边也有人做过一些尝试,但是效果都不好。一个核心原因就是 Python 对象之间的引用关系比较复杂,不太好重建。而之前大量的尝试基本都是基于 pickle 的,pickle 有几个核心问题导致它上不了 production:

    • 最重要的,有些 object 是没法 pickle 的,而 pickle 是不支持 partial pickle 的,直接导致你项目里有一个东西没法 pickle 就 dump 不出来东西
    • pickle 有安全问题,这是 by design 的,没法避免
    • pickle 面对一些 recursion 很重的 structure 的时候可能直接爆栈
    • pickle 在还原数据的时候,是需求同样的环境的,这就减弱了“拿个 dump 直接看”的能力

    所以 coredumpy 是完全抛弃了 pickle ,用另一种方式来试图解决这个问题——我可以没办法重建全部数据,但是我一定要能 dump 出来,并且保留更多的信息。

    demo

    拿到这个 dump 之后,可以用 vscode 直接打开(会调用 vscode 自身的 debugger ),也可以用 pdb 打开。同时还做了个 github actions ,可以在 github actions 里直接产生一个 vscode link ,然后直接复制到浏览器就可以在 vscode 打开这个 dump 了,连手动下载都不需要。

    项目本身还在做,感兴趣的小伙伴可以试一下,如果有反馈也可以直接在 github 提 issue~

    8 条回复    2025-03-18 00:40:51 +08:00
    TwoDays91
        1
    TwoDays91  
       21 小时 43 分钟前 via Android
    挺有趣的,没想到还能这么 debugging, 之前就真的一行行扣错误日志。
    SayHeya
        2
    SayHeya  
       20 小时 48 分钟前
    没想到真的是 B 站大佬
    NullpoMino
        3
    NullpoMino  
       20 小时 38 分钟前
    大佬
    w568w
        4
    w568w  
       17 小时 58 分钟前
    我对 Post-mortem debugging 了解不多,之前尝试过几次,最大的感受就是 dump 文件太太太大了,多个几秒掐断程序,文件都要上 60GB+
    kneo
        5
    kneo  
       11 小时 32 分钟前 via Android
    遇见这种项目其实我更关心的是有什么限制。
    gaogaotiantian
        6
    gaogaotiantian  
    OP
       7 小时 11 分钟前
    @w568w 是,怎么保存极大量的信息是一个难度很大的事情,但是你说的这个是 time travel debugging ,是另一个级别的东西了~相当于我这个是一帧,那个是一个电影。
    gaogaotiantian
        7
    gaogaotiantian  
    OP
       7 小时 8 分钟前
    @kneo 没有已知的限制,这是不用 pickle 最大的好处。我现在还不太能想象在什么情况下无法产生 dump 。但是这个 dump 是没办法还原全部信息的。最基本的,你还原的 custom object 是没有 method 的,你无法调用它的 method 。你可以简单地理解为,我把所有的 python object 都看做一个只有一些 attribute 的普通 object ,然后把这些 attribute 保存。好处就是,我可以保存所有的 object 。坏处就是,它们还原是不充分的。

    这是个思路和方向问题,我的思路是 dump 应该永远工作,能不能还原再说。
    kneo
        8
    kneo  
       5 小时 50 分钟前
    @gaogaotiantian 那就是只能查看,但是不能运行对吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1032 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 22:31 · PVG 06:31 · LAX 15:31 · JFK 18:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.