How to check what is holding reference to object

2010-04-27 Thread Michal M
Hi

I've just found out that one of objects is not destroyed when it
should be. This means that something was holding reference to this
object or part of it (i.e. method). Is there any way to check what
holds that reference? I am unable to do that just looking to the code
or debugging it because it is pretty complicated, but I am able to
invoke this situation again.

Regards
Michal M.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to check what is holding reference to object

2010-04-27 Thread Michal M
On 27 Kwi, 23:21, Duncan Booth  wrote:
> Michal M  wrote:
> > Hi
>
> > I've just found out that one of objects is not destroyed when it
> > should be. This means that something was holding reference to this
> > object or part of it (i.e. method). Is there any way to check what
> > holds that reference? I am unable to do that just looking to the code
> > or debugging it because it is pretty complicated, but I am able to
> > invoke this situation again.
>
> See if this code helps:
>
> http://groups.google.com/group/comp.lang.python/browse_thread/thread/...
>
> It's pretty old so it may need some adjustment, but I wrote it
> to figure out exactly that sort of problem.

Thanks you for answers.
I tried to use gc.get_referrers(self) in point in code when according
to me object should be destroyed earlier but I did not see anything
interesting. Then just realised that gc will not destroy object even
when itself holds reference to his own method.

For example

class A(object):
  def a(self):
pass
  def b(self):
self.method = self.a
  def __del__(self):
print "A object deleted"

>> a = A()
>> del a
A object delted
>> a = A()
>> a.b()
>> del a
... nothing ...

I thought gc would discover such circle loops but apparently it did
not.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to check what is holding reference to object

2010-04-28 Thread Michal M
On Apr 28, 12:02 am, Chris Rebert  wrote:
> On Tue, Apr 27, 2010 at 2:58 PM, Chris Rebert  wrote:
> > On Tue, Apr 27, 2010 at 2:42 PM, Michal M  
> > wrote:
> >> On 27 Kwi, 23:21, Duncan Booth  wrote:
> >>> Michal M  wrote:
> >>> > I've just found out that one of objects is not destroyed when it
> >>> > should be. This means that something was holding reference to this
> >>> > object or part of it (i.e. method). Is there any way to check what
> >>> > holds that reference? I am unable to do that just looking to the code
> >>> > or debugging it because it is pretty complicated, but I am able to
> >>> > invoke this situation again.
>
> >>> See if this code helps:
>
> >>>http://groups.google.com/group/comp.lang.python/browse_thread/thread/...
>
> >>> It's pretty old so it may need some adjustment, but I wrote it
> >>> to figure out exactly that sort of problem.
>
> >> Thanks you for answers.
> >> I tried to use gc.get_referrers(self) in point in code when according
> >> to me object should be destroyed earlier but I did not see anything
> >> interesting. Then just realised that gc will not destroy object even
> >> when itself holds reference to his own method.
>
> >> For example
>
> >> class A(object):
> >>  def a(self):
> >>    pass
> >>  def b(self):
> >>    self.method = self.a
> >>  def __del__(self):
> >>    print "A object deleted"
>
> >>>> a = A()
> >>>> del a
> >> A object delted
> >>>> a = A()
> >>>> a.b()
> >>>> del a
> >> ... nothing ...
>
> >> I thought gc would discover such circle loops but apparently it did
> >> not.
>
> > No, it does, you just didn't give it long enough; for performance
> > reasons, cyclical GC is only done every so often:
>
> Addendum:
> Also, defining __del__ in your example was likely problematic:
> Seehttp://docs.python.org/library/gc.html#gc.garbage
>
> - Chris

Thanks, specially for pointing the last issue with __del__ - I missed
that!
-- 
http://mail.python.org/mailman/listinfo/python-list