mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-58956: Fix a frame refleak in bdb (#128190)
This commit is contained in:
parent
d7f703d54d
commit
767c89ba7c
3 changed files with 54 additions and 0 deletions
|
@ -404,6 +404,7 @@ class Bdb:
|
|||
frame.f_trace_lines = True
|
||||
frame = frame.f_back
|
||||
self.set_stepinstr()
|
||||
self.enterframe = None
|
||||
sys.settrace(self.trace_dispatch)
|
||||
|
||||
def set_continue(self):
|
||||
|
@ -423,6 +424,7 @@ class Bdb:
|
|||
for frame, (trace_lines, trace_opcodes) in self.frame_trace_lines_opcodes.items():
|
||||
frame.f_trace_lines, frame.f_trace_opcodes = trace_lines, trace_opcodes
|
||||
self.frame_trace_lines_opcodes = {}
|
||||
self.enterframe = None
|
||||
|
||||
def set_quit(self):
|
||||
"""Set quitting attribute to True.
|
||||
|
|
|
@ -3009,6 +3009,57 @@ def test_pdb_f_trace_lines():
|
|||
(Pdb) continue
|
||||
"""
|
||||
|
||||
def test_pdb_frame_refleak():
|
||||
"""
|
||||
pdb should not leak reference to frames
|
||||
|
||||
>>> def frame_leaker(container):
|
||||
... import sys
|
||||
... container.append(sys._getframe())
|
||||
... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
|
||||
... pass
|
||||
|
||||
>>> def test_function():
|
||||
... import gc
|
||||
... container = []
|
||||
... frame_leaker(container) # c
|
||||
... print(len(gc.get_referrers(container[0])))
|
||||
... container = []
|
||||
... frame_leaker(container) # n c
|
||||
... print(len(gc.get_referrers(container[0])))
|
||||
... container = []
|
||||
... frame_leaker(container) # r c
|
||||
... print(len(gc.get_referrers(container[0])))
|
||||
|
||||
>>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
|
||||
... 'continue',
|
||||
... 'next',
|
||||
... 'continue',
|
||||
... 'return',
|
||||
... 'continue',
|
||||
... ]):
|
||||
... test_function()
|
||||
> <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
|
||||
-> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
|
||||
(Pdb) continue
|
||||
1
|
||||
> <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
|
||||
-> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
|
||||
(Pdb) next
|
||||
> <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()
|
||||
-> pass
|
||||
(Pdb) continue
|
||||
1
|
||||
> <doctest test.test_pdb.test_pdb_frame_refleak[0]>(4)frame_leaker()
|
||||
-> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
|
||||
(Pdb) return
|
||||
--Return--
|
||||
> <doctest test.test_pdb.test_pdb_frame_refleak[0]>(5)frame_leaker()->None
|
||||
-> pass
|
||||
(Pdb) continue
|
||||
1
|
||||
"""
|
||||
|
||||
def test_pdb_function_break():
|
||||
"""Testing the line number of break on function
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fixed a frame reference leak in :mod:`bdb`.
|
Loading…
Add table
Add a link
Reference in a new issue