https://github.com/python/cpython/commit/767c89ba7c5a70626df6e75eb56b546bf911b997
commit: 767c89ba7c5a70626df6e75eb56b546bf911b997
branch: main
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-01-17T10:33:04-05:00
summary:
gh-58956: Fix a frame refleak in bdb (#128190)
files:
A Misc/NEWS.d/next/Library/2024-12-23-02-09-44.gh-issue-58956.4OdMdT.rst
M Lib/bdb.py
M Lib/test/test_pdb.py
diff --git a/Lib/bdb.py b/Lib/bdb.py
index 81bba8a130f97c..73e249621a053b 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -404,6 +404,7 @@ def set_trace(self, frame=None):
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 @@ def set_continue(self):
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.
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index ace5544f4106d0..09601623b29ac1 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -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
diff --git
a/Misc/NEWS.d/next/Library/2024-12-23-02-09-44.gh-issue-58956.4OdMdT.rst
b/Misc/NEWS.d/next/Library/2024-12-23-02-09-44.gh-issue-58956.4OdMdT.rst
new file mode 100644
index 00000000000000..b78bc5aaf44217
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-12-23-02-09-44.gh-issue-58956.4OdMdT.rst
@@ -0,0 +1 @@
+Fixed a frame reference leak in :mod:`bdb`.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]