我的Python应用程序处于一种奇怪的状态。我不想做这个过程的实时调试。我可以将其转储到文件中并稍后检查其状态吗?我知道我以后在gdb中恢复了C程序的核心文件,但我不知道如何从gdb中以有用的方式检查Python应用程序。
(这是关于debugging memleaks in a production system的问题的变体。)
答案 0 :(得分:4)
除了中止之外没有内置的方法(使用os.abort(),如果资源限制允许,则导致coredump) - 尽管你当然可以建立自己的'dump'函数来转储你关心的数据的相关信息关于。没有现成的工具。
至于处理Python进程的核心文件,包含有用宏的Python source has a gdbinit file。它仍然比以某种方式进入流程本身(使用pdb或交互式解释器)更痛苦,但它使生活变得更容易。
答案 1 :(得分:1)
上面有人说没有内置的方法来执行此操作,但这并不完全正确。例如,您可以查看pylons调试工具。如果有异常,异常处理程序会保存堆栈跟踪并在控制台上输出可用于通过HTTP检索调试会话的URL。
虽然他们可能会将这些会话保留在内存中,但它们只是python对象,所以没有什么可以阻止你腌制堆栈转储并在以后恢复以进行检查。这意味着对应用程序进行了一些更改,但它应该是可能的......
经过一番研究,结果发现相关代码实际上来自Paste的EvalException module。你应该能够在那里找出你需要的东西。
答案 2 :(得分:0)
This answer建议让你的程序核心转储,然后继续执行另一个足够相似的盒子。
答案 3 :(得分:0)
也可以编写一些可以从流程中转储所有数据的内容,例如
dir()
和getattr()
处理一些未知对象,例如扩展类)。但是,如果可能的话,留下带有沙井或挂架或类似东西的正在运行的过程肯定会更方便。
(另外,我想知道自首次提出这个问题以来是否写得更方便)