[Python-Dev] refleak hunting fun!
Walter Dörwald
walter at livinglogic.de
Thu Aug 14 21:42:46 EDT 2003
Michael Hudson wrote:
> Prompted by finding my own refcounting leaks in test_descr, I'm now
> looking to spread the misery :-)
>
> I've hacked regrtest (hacks attached) to do some very crude monitoring
> of sys.gettotalrefcount().
>
> Here's the output of a recent run:
>
> [...]
> test_codeccallbacks leaked 1107 references
> [...]
>
> Some however, seem to be real. test_sax, test_socket and
> test_codeccallbacks seem to be the most alarming. The TrackRef class
> Tim posted a link to is likely to be indispensable in hunting these.
The number for test_codeccallbacks really looks scary. Some of it is
the result of the callback registry, but there seem to be real leaks
here.
I've used the attached patch to unittest to get refcount diffs for
individual test methods. Here are the results for test_codeccallbacks:
212 test_backslashescape
1 test_badandgoodbackslashreplaceexceptions
0 test_badandgoodignoreexceptions
0 test_badandgoodreplaceexceptions
0 test_badandgoodstrictexceptions
0 test_badandgoodxmlcharrefreplaceexceptions
271 test_badhandlerresults
0 test_badregistercall
153 test_callbacks
3 test_charmapencode
121 test_decodehelper
26 test_encodehelper
285 test_longstrings
0 test_lookup
9 test_relaxedutf8
1 test_translatehelper
11 test_unencodablereplacement
265 test_unicodedecodeerror
792 test_unicodeencodeerror
0 test_unicodetranslateerror
12 test_uninamereplace
0 test_unknownhandler
14 test_xmlcharnamereplace
0 test_xmlcharrefreplace
6 test_xmlcharrefvalues
Bye,
Walter Dörwald
-------------- next part --------------
Index: Lib/unittest.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/unittest.py,v
retrieving revision 1.24
diff -u -r1.24 unittest.py
--- Lib/unittest.py 13 Jul 2003 15:18:12 -0000 1.24
+++ Lib/unittest.py 14 Aug 2003 18:37:19 -0000
@@ -376,7 +376,13 @@
for test in self._tests:
if result.shouldStop:
break
+ import gc, sys
+ gc.collect()
+ rc1 = sys.gettotalrefcount()
test(result)
+ gc.collect()
+ rc2 = sys.gettotalrefcount()
+ print >>sys.stderr, "%5d %s" % (rc2-rc1, test)
return result
def debug(self):
More information about the Python-Dev
mailing list