我正在使用python脚本工作,该脚本使用mpi4py在群集中分配工作程序,因此调试失败的工作程序很棘手,这表示我已经看到了许多可行的方法,但是它们都有缺点,我对此表示怀疑所有这些。我也只是不明白这么简单的事情怎么可能如此复杂。仅将所有程序状态转储到磁盘并重新启动然后让python调用pdb有什么问题?
无论如何,这是我发现的可能选项及其缺点:
规范方法:
actual core dump(通过os.abort()
):这基本上是我所希望的,但由于gdb的Python扩展似乎不那么出色而变得复杂,因为它们只是给您从您调用os.abort()
的地方开始的堆栈跟踪,它们需要Python的调试版本,而anaconda不支持...如果pdb也可以方便地实现这一点,那就太好了
traceback.extract_stack()
和pdb.post_mortem(traceback=tb)
:乍一看,它似乎很吸引人,因为它似乎可以满足我的要求,但是后来我意识到,将回溯(即使用YAML)转储到文件并加载后来给出了奇怪的错误,甚至在理论上可能不一定有效
常规验尸和远程调试:如果可以正常运行,这似乎是理想的选择,因为将程序状态转储到磁盘没有任何复杂性,但是如果您设置远程调试会话,则可能会很复杂正在一个节点无法访问互联网或没有防火墙的集群上工作。
社区驱动(半)解决方案:
似乎我不是唯一考虑这个问题的人,因为社区进行了许多尝试来创建此功能
pydump:这个人得到了它,出于完美的原因,他们做了完美的事情,除了...人们没有使用它,因此他们停止开发它,现在它可能已经过时了
rpdb:另一位很有前途的候选人,因为它被宣传为能够对未捕获的异常进行事后调试,但由于两年仍未开发,这使我相信这可能比它值得的麻烦更多(除非你们中有人还在使用它?)
探索此问题的人们: -How do I dump an entire Python process for later debugging inspection? -https://gist.github.com/toolness/d56c1aab317377d5d17a