diff options
author | Tian Gao <gaogaotiantian@hotmail.com> | 2023-11-04 19:59:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-04 19:59:36 (GMT) |
commit | cd6b2ced7595fa69222bdd2042edc5a2576f3678 (patch) | |
tree | bd57eba227f0d1e9b81da0626308a22a0c6714ec | |
parent | 9573d142157d8432f2772a109c304dafeaa454a5 (diff) | |
download | cpython-cd6b2ced7595fa69222bdd2042edc5a2576f3678.zip cpython-cd6b2ced7595fa69222bdd2042edc5a2576f3678.tar.gz cpython-cd6b2ced7595fa69222bdd2042edc5a2576f3678.tar.bz2 |
gh-80675: Set `f_trace_lines = True` on all frames upon `pdb.set_trace()` (#110881)
-rw-r--r-- | Lib/bdb.py | 7 | ||||
-rw-r--r-- | Lib/test/test_pdb.py | 24 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-10-14-20-15-53.gh-issue-80675._M-cQC.rst | 1 |
3 files changed, 32 insertions, 0 deletions
@@ -32,6 +32,7 @@ class Bdb: 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,9 @@ class Bdb: while frame: frame.f_trace = self.trace_dispatch self.botframe = frame + # 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 +353,9 @@ class Bdb: while frame and frame is not self.botframe: del frame.f_trace frame = frame.f_back + 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): """Set quitting attribute to True. diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index 5fef836..ff9e7c2 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() + > <doctest test.test_pdb.test_pdb_f_trace_lines[1]>(6)test_function() + -> if frame.f_trace_lines != False: + (Pdb) continue + """ + def test_pdb_function_break(): """Testing the line number of break on function 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 0000000..a4bc679 --- /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()` |