Message212171
After the pdb 'continue' command, the signal module owns a reference to Pdb.sigint_handler. On the next instantiation of pdb, the signal module owns a reference to a new sigint_handler method that owns a reference to the previous sigint_handler. As a consequence, the first pdb instance is never freed (as well as the frames that are referenced by this pdb instance). The following test demonstrates the problem that is fixed by the attached patch.
Run the following script:
# START of refleak.py
import sys, gc, pdb
i = 1
while i:
pdb.set_trace()
x = 1
gc.collect(); print(sys.gettotalrefcount())
# END of refleak.py
With the following pdb commands:
$ python refleak.py
> /tmp/test/refleak.py(6)<module>()
-> x = 1
(Pdb) continue
95898
> /home/xavier/tmp/test/refleak.py(5)<module>()
-> pdb.set_trace()
(Pdb) continue
95983
> /tmp/test/refleak.py(6)<module>()
-> x = 1
(Pdb) continue
96068
> /tmp/test/refleak.py(5)<module>()
-> pdb.set_trace()
(Pdb) i = 0
(Pdb) continue
96153 |
|
Date |
User |
Action |
Args |
2014-02-25 11:02:34 | xdegaye | set | recipients:
+ xdegaye, georg.brandl |
2014-02-25 11:02:34 | xdegaye | set | messageid: <1393326154.87.0.194575074306.issue20766@psf.upfronthosting.co.za> |
2014-02-25 11:02:34 | xdegaye | link | issue20766 messages |
2014-02-25 11:02:34 | xdegaye | create | |
|