[Python-bugs-list] [Bug #126254] Traceback objects not properly garbage-collected
noreply@sourceforge.net
noreply@sourceforge.net
Wed, 27 Dec 2000 14:21:24 -0800
Bug #126254, was updated on 2000-Dec-18 17:50
Here is a current snapshot of the bug.
Project: Python
Category: Python Interpreter Core
Status: Closed
Resolution: Invalid
Bug Group: Not a Bug
Priority: 5
Submitted by: nobody
Assigned to : gvanrossum
Summary: Traceback objects not properly garbage-collected
Details: System info:
============
Python 2.0 (#1, Dec 18 2000, 16:47:02)
[GCC 2.95.2 20000220 (Debian GNU/Linux)] on linux2
Linux phil 2.2.18 #1 Mon Dec 18 14:49:56 PST 2000 i686 unknown
Sample code:
============
import sys
class fooclass:
def __init__(self):
print 'CONSTRUCTED'
def withtb(self, doit=0):
try:
raise "foo"
except:
if doit:
tb = sys.exc_info()[2]
def __del__(self):
print 'DESTROYED'
if __name__ == '__main__':
foo = fooclass()
if len(sys.argv) > 1:
foo.withtb(1)
else:
foo.withtb(0)
del foo
How to reproduce:
=================
Run the above python script:
1. Without any argument: the withtb() method exception handler does
not retrieve any traceback object. The program prints
`CONSTRUCTED' and `DESTROYED'.
2. With some arguments: the withtb() method exception handler
retrieves a traceback object and stores it in the `tb' local
variable. However `DESTROYED' never gets printed out. I think
that the `foo' object will never be garbage collected anymore.
Workaround:
===========
Deleting the `tb' object seems to restore things:
if doit:
tb = sys.exc_info()[2]
del tb
Other:
======
I've found this problem also in python 1.5.2 and python 1.6.
Possible cause:
===============
I would tend to think that we're creating a circular loop which
cannot be garbage collected:
- `tb' holds a reference to the traceback object
- the traceback object holds a reference to the local scope
- the local scope holds a reference to the `tb' variable
The only way out is to break the circular reference by hand,
although it's annoying.
Phil - phil@commerceflow.com.
Follow-Ups:
Date: 2000-Dec-27 14:21
By: gvanrossum
Comment:
Note that the bug report was about 1.5.2 and 1.6. This should be fixed by
the cycle collection in 2.0, shouldn't it?
-------------------------------------------------------
Date: 2000-Dec-20 18:59
By: tim_one
Comment:
"Invalid" is a just a word -- it comes with SF bug system and isn't defined
anywhere. By convention, we pair Not-A-Bug with Invalid, for lack of
something better to do. Not-A-Bug means it's not a bug <wink>: you may
not like the answer, but Guido is saying it's functioning as designed and
he has no plans to change that.
-------------------------------------------------------
Date: 2000-Dec-20 18:50
By: nobody
Comment:
oops, didn't see you comment.
Forget about my question...
Phil - phil@commerceflow.com.
-------------------------------------------------------
Date: 2000-Dec-20 18:49
By: nobody
Comment:
Could I know why this was deemed to be `Invalid' ?
Phil - phil@commerceflow.com.
-------------------------------------------------------
Date: 2000-Dec-18 20:21
By: gvanrossum
Comment:
This is not a bug. Saving the traceback as a local variable creates a
circular reference that prevents garbage collection.
If you don't understand this answer, please write help@python.org.
-------------------------------------------------------
For detailed info, follow this link:
http://sourceforge.net/bugs/?func=detailbug&bug_id=126254&group_id=5470