如何调试Python内存故障?

时间:2013-03-08 19:44:54

标签: python debugging memory lxml

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

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

编辑3:似乎lxml可能不是罪魁祸首,谢谢!完整脚本为here。我需要重温它寻找参考。它们看起来像什么?

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

编辑5主要编辑:正如下面的David Robinson和TankorSmash所建议的那样,我发现了一种data内容,它会在一个狂野循环中发送lxml.etree.HTML( data )。 (我不小心忽视了它,但发现我的罪赎回了,因为我付出了额外两天调试的价格!;)A working crashing script is here. (Also opened a new question.) < / p>

  

编辑6:原来这是lxml版本2.7.8及更低版本(at   最小)。 Updated to lxml 2.9.0,错误消失了。还要感谢this follow-up question.

的优秀人才

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

enter image description here

3 个答案:

答案 0 :(得分:3)

您可以尝试Low-level Python debugging with GDB。可能是Python解释器或lxml库中存在一个错误,如果没有额外的工具,很难找到它。

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

答案 1 :(得分:2)

它必须是由于一些保持文件存活的引用。必须始终小心xpath评估的字符串结果。我们看到您已将None分配给treem,但未分配给yxi

您还可以将None分配给yxi

答案 2 :(得分:2)

在尝试追踪内存问题时,工具也很有用。我发现guppy是一个非常有用的Python内存分析和探索工具。

由于缺乏良好的教程/文档,这并不是最简单的开始,但是一旦你掌握它,你会发现它非常有用。我使用的功能:

  • 远程内存分析(通过套接字)
  • 用于制图使用的基本GUI,可选择显示实时数据
  • 用于探索Python shell中数据使用的强大而一致的界面