frame.f_trace_lines = True
frame = frame.f_back
self.set_stepinstr()
+ self.enterframe = None
sys.settrace(self.trace_dispatch)
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.
(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