python内存泄露

 

转自:http://code.activestate.com/recipes/457665-debug-runtime-objects-using-gcget_objects/
Debug runtime objects using gc.get_objects() (Python recipe) by Dirk Holtwick
ActiveState Code (http://code.activestate.com/recipes/457665/)
 
  Since Python 2.2 there is a handy function in the Garbage Collection Module called get_objects(). It gives back a list of all objects that are under control of the Garbeage Collector. This way you can extract informations of your application in runtime.

Python, 45 linesDownload
Copy to clipboard

 1

 import gc
import inspect

exclude = [
    "function",
    "type",
    "list",
    "dict",
    "tuple",
    "wrapper_descriptor",
    "module",
    "method_descriptor",
    "member_descriptor",
    "instancemethod",
    "builtin_function_or_method",
    "frame",
    "classmethod",
    "classmethod_descriptor",
    "_Environ",
    "MemoryError",
    "_Printer",
    "_Helper",
    "getset_descriptor",
    ]

def dumpObjects():
    gc.collect()
    oo = gc.get_objects()
    for o in oo:
        if getattr(o, "__class__", None):
            name = o.__class__.__name__
            if name not in exclude:
                filename = inspect.getabsfile(o.__class__)           
                print "Object of class:", name, "...",
                print "defined in file:", filename               

if __name__=="__main__":

    class TestClass:
        pass
       
    testObject1 = TestClass()
    testObject2 = TestClass()
   
    dumpObjects()

 

The example dumps a list of all higher level objects. At first it gets the list of all objects, than tests if they are higher level and in the end it it tests if it is not in the list of objects that are more or less always there. Then we can get all informations of the object we want. In this case we show the name of the class and where this class is defined.

A nice tool to write would be a runtime debugger in an own thread that serves as a little HTTPDServer, so that you could look into the running program no mater it is command line or windows based.


Tags: debugging 

2 comments

thinkbase net5 years, 8 months ago # |flag
Test on Python 2.4.1. On Python 2.4.1, the code should be modified a little: -- Add "weakref" to the exclude list, such as:

import gc
import inspect
 
exclude = [
    "function",
    "type",
    "list",
    "dict",
    "tuple",
    "wrapper_descriptor",
    "module",
    "method_descriptor",
    "member_descriptor",
    "instancemethod",
    "builtin_function_or_method",
    "frame",
    "classmethod",
    "classmethod_descriptor",
    "_Environ",
    "MemoryError",
    "_Printer",
    "_Helper",
    "getset_descriptor",
    "weakref", "property", "cell", "staticmethod"
    ]
 
def dumpObjects():
    gc.collect()
    oo = gc.get_objects()
    for o in oo:
        if getattr(o, "__class__", None):
            name = o.__class__.__name__
            #print (name)
            if name not in exclude:
                filename = inspect.getabsfile(o.__class__)
                print "Object :", `o`, "..."
                print "Class  :", name, "..."
                print "defined:", filename, "\n"
 
if __name__=="__main__":
 
    class TestClass:
        pass
 
    testObject1 = TestClass()
    testObject2 = TestClass()
 
    from wx import Colour
    color = Colour()
 
    dumpObjects()

And the result:
Object : <__main__.TestClass instance at 0x00954D00> ...
Class  : TestClass ...
defined: c:\temp\py\test.py
 
Object : <__main__.TestClass instance at 0x00954D28> ...
Class  : TestClass ...
defined: c:\temp\py\test.py
 
Object : <class 'string.Template'> ...
Class  : _TemplateMetaclass ...
defined: d:\bin\python\lib\string.py
 
Object : wx.Point(-1, -1) ...
Class  : Point ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_core.py
 
Object : wx.Size(-1, -1) ...
Class  : Size ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_core.py
 
Object : wxPython wrapper for UNBORN object! (The C++ object is not initialized yet.) ...
Class  : _wxPyUnbornObject ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_core.py
 
...
 
Object : <wx._core.__DocFilter instance at 0x00957E90> ...
Class  : __DocFilter ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_core.py
 
Object : wx.Colour(0, 0, 0) ...
Class  : Colour ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_gdi.py
 
Object : <wx._core.PyEventBinder object at 0x016CEED0> ...
Class  : PyEventBinder ...
defined: d:\bin\python\lib\site-packages\wx-2.6-msw-unicode\wx\_core.py
 
...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值