2015-02-09 2 views
5

Ich versuche, ein Speicherleck in Python (2.7) zu verfolgen. Ich habe gc.get_referrers gefunden, aber verstehe die Ausgabe nicht. Nach dem Löschen dying_node (die von allen Referenzen zu befreien, außer für eine Liste, die ich als Teil meiner Jagd geschaffen bekommen sollte), habe ich in meinem Code:Verständnis gc.get_referrers

gc.collect() 
print "done dying: ", getrefcount(dying_node) #note, includes the reference from getrefcount 
referrers = gc.get_referrers(dying_node) 
print "referrers: " 
for referrer in referrers: 
    print referrer 

, die die Ausgabe ergibt:

> done dying: 4 
> referrers: 
> [<__main__.Node instance at 0x104e53cb0>, <__main__.Node instance at 0x104e53b90>, <__main__.Node instance at 0x104e53b00>, <__main__.Node instance at 0x104e53d40>, <__main__.Node instance at 0x104e53ab8>, <__main__.Node instance at 0x104e53bd8>, <__main__.Node instance at 0x104e53a70>, <__main__.Node instance at 0x104e53c20>, <__main__.Node instance at 0x104e53c68>, <__main__.Node instance at 0x104e53b48>] 
> [<__main__.Node instance at 0x104e53c20>, <__main__.Node instance at 0x104e53ab8>, <__main__.Node instance at 0x104e53c68>, <__main__.Node instance at 0x104e53a70>, <__main__.Node instance at 0x104e53cb0>, <__main__.Node instance at 0x104e53b00>, <__main__.Node instance at 0x104e53d40>, <__main__.Node instance at 0x104e53b90>, <__main__.Node instance at 0x104e53b48>, <__main__.Node instance at 0x104e53bd8>] 
> <frame object at 0x104516300> 

Ich denke, das bedeutet, ich habe zwei Listen von Node s, die auf diesen Knoten und ein Rahmenobjekt beziehen. Ich nehme an, das Rahmenobjekt ist der Name dying_node, den ich betrachte. Eine der Listen wäre eine Liste, die ich erstellt habe, um mir bei meiner Jagd zu helfen. Aber gibt es eine Möglichkeit, herauszufinden, was die andere Liste wäre?

Antwort

1

Okay, so ist eine Antwort

def namestr(obj, namespace): 
    return [name for name in namespace if namespace[name] is obj] 

Beispiel:

gc.collect() #make sure all garbage cleared before collecting referrers. 
referrers = gc.get_referrers(object_of_interest) 
for referrer in referrers: 
    print namestr(referrer, globals()) 

oder wenn es vor Ort:

print namestr(referrer, locals()) 

Das ist etwas wie ['referrer', 'name_Im_interested_in'] gedruckt wird. Die 'referrer' ist wegen der Tatsache, ich habe es gerade so genannt. Die andere Sache in der Liste ist, was ich versuche zu finden.

Ich lieh dies von an answer here. Wenn jemand eine bessere Antwort hat, bitte posten Sie es und ich werde es gerne annehmen.