26

我有一个处于奇怪状态的 Python 应用程序。我不想对过程进行实时调试。我可以将其转储到文件中并稍后检查其状态吗?我知道我稍后在 gdb 中恢复了 C 程序的核心文件,但我不知道如何从 gdb 中以有用的方式检查 Python 应用程序。

(这是我关于在生产系统中调试 memleaks 的问题的一个变体。)

4

4 回答 4

4

除了中止(使用 os.abort(),在资源限制允许的情况下导致核心转储)之外,没有其他内置方法——尽管您当然可以构建自己的“转储”功能,转储有关您关心的数据的相关信息。没有现成的工具。

至于处理 Python 进程的核心文件,Python 源有一个 gdbinit 文件,其中包含有用的宏。它仍然比以某种方式进入进程本身(使用 pdb 或交互式解释器)要痛苦得多,但它让生活变得更轻松一些。

于 2008-09-26T20:38:17.633 回答
1

上面有人说没有内置的方法可以执行此操作,但这并不完全正确。例如,您可以查看 pylons 调试工具。当出现异常时,异常处理程序会保存堆栈跟踪并在控制台上打印一个 URL,该 URL 可用于通过 HTTP 检索调试会话。

虽然它们可能将这些会话保存在内存中,但它们只是 python 对象,因此没有什么可以阻止您对堆栈转储进行腌制并在以后恢复它以供检查。这将意味着对应用程序进行一些更改,但应该有可能......

经过一番研究,事实证明相关代码实际上来自 Paste 的EvalException 模块。您应该能够查看那里以确定您需要什么。

于 2008-09-26T21:30:33.530 回答
1

也可以编写一些东西来转储进程中的所有数据,例如

  • Pickler 忽略它不能腌制的对象(用其他东西代替它们)(例如Python: Pickling a dict with some unpicklable items
  • 递归地将所有内容转换为可序列化的东西的方法(例如thisdir() ,除了它需要检查无限递归对象并对其进行处理;它还可以尝试getattr() 处理一些未知对象,例如扩展类)。

但是,在可能的情况下,使用检修孔或塔架或类似的东西离开运行过程当然看起来更方便。

(另外,我想知道自从第一次提出这个问题以来是否写了一些更方便的东西)

于 2012-10-02T12:30:03.527 回答
0

这个答案建议让你的程序核心转储,然后在另一个足够相似的盒子上继续执行。

于 2008-09-27T00:15:31.417 回答