如何调试Python内存故障?

2024-02-27

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

编辑2:缩小范围,注释掉代码。

编辑3:看来lxml可能不是罪魁祸首,谢谢!完整的脚本是here http://pastebin.com/iar4MhY6。我需要仔细检查一下,寻找参考资料。他们看起来怎么样?

编辑 4:实际上,脚本在此停止(100%) parse_og 一部分。所以编辑 3 是错误的 - 它一定是 lxml 不知何故。

编辑 5 主要编辑:正如下面 David Robinson 和 TankorSmash 的建议,我发现了一种data将发送的内容lxml.etree.HTML( data )在疯狂的循环中。 (我粗心地忽略了它,但发现我的罪孽得到了救赎,因为我付出了额外两天调试的代价!;)一个有效的崩溃脚本在这里。 http://pastebin.com/0kCPQz3N (还提出了一个新问题。) https://stackoverflow.com/questions/15367001/how-to-prevent-lxml-etree-html-data-from-crashing-on-certain-type-of-data

编辑 6:事实证明这是 lxml 版本 2.7.8 及以下版本的一个错误(位于 至少)。更新至lxml 2.9.0 ftp://xmlsoft.org/libxml2/,bug 就消失了。也感谢这里的好人这个后续问题。 https://stackoverflow.com/questions/15367001/how-to-prevent-lxml-etree-html-data-from-crashing-on-certain-type-of-data

我不知道如何调试我遇到的这个奇怪的问题。 下面的代码可以正常运行大约五分钟,此时 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

你可以试试使用 GDB 进行低级 Python 调试 http://grapsus.net/blog/post/Low-level-Python-debugging-with-GDB。 Python 解释器或 lxml 库中可能存在错误,如果没有额外的工具很难找到它。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调试Python内存故障? 的相关文章

随机推荐