如何转储整个Python进程以便后续调试检查?
我有一个Python应用程序,现在它的状态有点奇怪。我不想实时调试这个程序。请问我能把它的状态保存到一个文件里,之后再查看吗?我知道我可以在gdb里恢复C程序的核心文件,但我不知道怎么用gdb来有效地检查一个Python应用程序。
(这其实是我之前问的关于在生产系统中调试内存泄漏的一个变种。)
5 个回答
上面有人说没有内置的方法来实现这个,但这并不完全正确。举个例子,你可以看看pylons的调试工具。当出现异常时,异常处理器会保存堆栈跟踪信息,并在控制台上打印一个URL,这个URL可以用来通过HTTP获取调试会话。
虽然他们可能把这些会话保存在内存中,但它们其实就是Python对象,所以你完全可以把堆栈信息保存下来,之后再恢复出来进行检查。这可能需要对应用程序做一些改动,但应该是可行的……
经过一些研究,发现相关的代码实际上来自Paste的EvalException模块。你可以去那里看看,找出你需要的东西。
如果你只想保存错误追踪对象(这就是你开始调试所需要的),你可以使用debuglater(这是pydump的一个分支)。它可以和最近版本的Python一起使用,并且支持IPython/Jupyter。
如果你想保存整个会话,可以看看dill。它有两个功能:dump_session
和load_session
。
这里还有两个相关的项目:
如果你在寻找一种与语言无关的解决方案,你可以创建一个核心转储文件。这里有一个用Python的例子。
除了直接终止程序(用 os.abort(),如果资源限制允许的话,会生成一个核心转储文件)之外,没有内置的方法。不过,你可以自己写一个“转储”函数,来输出你关心的数据的相关信息。市面上没有现成的工具可以用。
至于处理 Python 进程的核心文件,Python 源代码中有一个 gdbinit 文件,里面包含了一些有用的宏。虽然这比直接进入进程(用 pdb 或交互式解释器)要麻烦得多,但至少能让事情简单一些。