如何转储整个Python进程以供以后进行调试检查?
时间:2020-03-06 14:48:25 来源:igfitidea点击:
我有一个处于奇怪状态的Python应用程序。我不想对该进程进行实时调试。我可以将其转储到文件中并在以后检查其状态吗?我知道我稍后会在gdb中恢复C程序的核心文件,但是我不知道如何从gdb中以有用的方式检查Python应用程序。
(这是我在生产系统中调试内存泄漏问题的一个变体。)
解决方案
除了中止(使用os.abort(),如果资源限制允许,会导致coredump)以外,没有其他内置方法-尽管我们当然可以构建自己的"转储"函数来转储与我们关心的数据有关的信息。没有现成的工具。
至于处理Python进程的核心文件,Python源代码有一个gdbinit文件,其中包含有用的宏。与以某种方式进入流程本身(使用pdb或者交互式解释器)相比,它仍然要痛苦得多,但是它使工作变得更轻松。
上面的人说过,没有内置的方法可以执行此操作,但这并不是完全正确的。例如,我们可以看一下挂架调试工具。发生异常时,异常处理程序将保存堆栈跟踪并在控制台上打印URL,该URL可用于通过HTTP检索调试会话。
尽管它们可能会将这些会话保留在内存中,但它们只是python对象,因此没有什么可以阻止我们对堆栈转储进行酸洗并稍后进行恢复以进行检查。这将意味着对该应用程序进行一些更改,但应该可以...
经过研究,结果发现相关代码实际上来自Paste的EvalException模块。我们应该能够在那里找到所需的东西。
这个答案建议进行程序核心转储,然后在另一个足够类似的盒子上继续执行。