From 837caa04e43875b4a94f09477ce7698048961c71 Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Sat, 14 Oct 2023 13:11:24 -0700 Subject: [PATCH 1/3] Set f_trace_lines = True for all frames upon pdb.set_trace() --- Lib/bdb.py | 8 ++++++++ Lib/test/test_pdb.py | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Lib/bdb.py b/Lib/bdb.py index 0f3eec653baaad..9e18bd5d91a819 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -32,6 +32,7 @@ def __init__(self, skip=None): self.skip = set(skip) if skip else None self.breaks = {} self.fncache = {} + self.frame_trace_lines = {} self.frame_returning = None self._load_breaks() @@ -331,6 +332,10 @@ def set_trace(self, frame=None): while frame: frame.f_trace = self.trace_dispatch self.botframe = frame + # Remember f_trace_lines of the frame, and set it to True + # We need f_trace_liens == True for the debugger to work + self.frame_trace_lines[frame] = frame.f_trace_lines + frame.f_trace_lines = True frame = frame.f_back self.set_step() sys.settrace(self.trace_dispatch) @@ -349,6 +354,9 @@ def set_continue(self): while frame and frame is not self.botframe: del frame.f_trace frame = frame.f_back + for frame in self.frame_trace_lines: + frame.f_trace_lines = self.frame_trace_lines[frame] + self.frame_trace_lines = {} def set_quit(self): """Set quitting attribute to True. diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index ff677aeb795442..8c39142ec260a3 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -2350,6 +2350,30 @@ def test_pdb_ambiguous_statements(): (Pdb) continue """ +def test_pdb_f_trace_lines(): + """GH-80675 + + pdb should work even if f_trace_lines is set to False on some frames. + + >>> reset_Breakpoint() + + >>> def test_function(): + ... import sys + ... frame = sys._getframe() + ... frame.f_trace_lines = False + ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace() + ... if frame.f_trace_lines != False: + ... print("f_trace_lines is not reset after continue!") + + >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE + ... 'continue' + ... ]): + ... test_function() + > (6)test_function() + -> if frame.f_trace_lines != False: + (Pdb) continue + """ + def test_pdb_issue_gh_65052(): """See GH-65052 From b4174b068455631c3e71952c9929efae70e84025 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 20:15:54 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst diff --git a/Misc/NEWS.d/next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst b/Misc/NEWS.d/next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst new file mode 100644 index 00000000000000..a4bc679be905d6 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst @@ -0,0 +1 @@ +Set ``f_trace_lines = True`` on all frames upon :func:`pdb.set_trace()` From 79586b7a4131d3aff85366181c1a9ec1bea1b09b Mon Sep 17 00:00:00 2001 From: Tian Gao Date: Sun, 15 Oct 2023 10:55:46 -0700 Subject: [PATCH 3/3] Apply suggestions from code review Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> --- Lib/bdb.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/bdb.py b/Lib/bdb.py index 9e18bd5d91a819..1acf7957f0d669 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -332,7 +332,6 @@ def set_trace(self, frame=None): while frame: frame.f_trace = self.trace_dispatch self.botframe = frame - # Remember f_trace_lines of the frame, and set it to True # We need f_trace_liens == True for the debugger to work self.frame_trace_lines[frame] = frame.f_trace_lines frame.f_trace_lines = True @@ -354,8 +353,8 @@ def set_continue(self): while frame and frame is not self.botframe: del frame.f_trace frame = frame.f_back - for frame in self.frame_trace_lines: - frame.f_trace_lines = self.frame_trace_lines[frame] + for frame, prev_trace_lines in self.frame_trace_lines.items(): + frame.f_trace_lines = prev_trace_lines self.frame_trace_lines = {} def set_quit(self):