如何调试Python内存故障?

knu*_*ole 11 python memory debugging lxml

编辑:非常感谢找到错误的帮助 - 但由于它可能很难找到/重现,任何一般调试帮助也将非常感谢!帮帮我自己!=)

编辑2:缩小范围,评论代码.

编辑3:似乎lxml可能不是罪魁祸首,谢谢!完整的脚本在这里.我需要重温它寻找参考.他们看起来怎么样?

编辑4:实际上,脚本在此 部分停止(100%)parse_og .所以编辑3是假的 - 它必须以某种方式lxml.

编辑5主要编辑:正如下面的David Robinson和TankorSmash所建议的那样,我发现了一种datalxml.etree.HTML( data )在狂野循环中发送的内容.(我不小心忽略了它,但发现我的罪孽被赎回了,因为我付出了额外两天调试的价格!) 工作崩溃的脚本在这里. (还开了一个新问题.)

编辑6:原来这是lxml版本2.7.8及更低版本(至少)的错误.更新到lxml 2.9.0,错误消失了.还要感谢这个后续问题的优秀人士.

我不知道如何调试我遇到的这个奇怪的问题.下面的代码运行正常大约五分钟,当RAM突然完全填满时(在100%期间从200MB到1700MB - 然后当内存已满时,它进入蓝色等待状态).

这是由于下面的代码,特别是前两行.这是肯定的.但是发生了什么?有什么可能解释这种行为?

def parse_og(self, data):
    """ lxml parsing to the bone! """
    try:
        tree = etree.HTML( data ) # << break occurs on this line >>
        m = tree.xpath("//meta[@property]")

        #for i in m:
        #   y = i.attrib['property']
        #   x = i.attrib['content']
        #   # self.rj[y] = x  # commented out in this example because code fails anyway


        tree = ''
        m = ''
        x = ''
        y = ''
        i = ''

        del tree
        del m
        del x
        del y
        del i

    except Exception:
        print 'lxml error: ', sys.exc_info()[1:3]
        print len(data)
        pass
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

ks1*_*322 3

您可以尝试使用 GDB 进行低级 Python 调试。Python 解释器或 lxml 库中可能存在错误,如果没有额外的工具很难找到它。

当 CPU 使用率达到 100% 时,您可以中断在 gdb 下运行的脚本并查看堆栈跟踪。它可能有助于理解脚本内部发生的事情。