Skip to content

Commit 6a22709

Browse files
committed
gh-160643: Reset Bdb.enterframe when trace dispatch raises
An exception escaping trace_dispatch(), such as BdbQuit after q in the interactive interpreter, left enterframe set, so every later breakpoint() returned early. Reset it in a finally block.
1 parent ffe1315 commit 6a22709

3 files changed

Lines changed: 28 additions & 2 deletions

File tree

‎Lib/bdb.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,10 @@ def reset(self):
251251
@contextmanager
252252
def set_enterframe(self, frame):
253253
self.enterframe = frame
254-
yield
255-
self.enterframe = None
254+
try:
255+
yield
256+
finally:
257+
self.enterframe = None
256258

257259
def trace_dispatch(self, frame, event, arg):
258260
"""Dispatch a trace function for debugged frames based on the event.

‎Lib/test/test_pdb.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5047,6 +5047,27 @@ def test_nested_set_trace(self):
50475047
self.assertIn('42', stdout)
50485048
self.assertEqual(stderr, '')
50495049

5050+
def test_set_trace_after_quit(self):
5051+
script = """
5052+
import bdb
5053+
import sys
5054+
# Make quit raise BdbQuit as in the interactive interpreter.
5055+
sys.ps1 = '>>> '
5056+
try:
5057+
breakpoint()
5058+
except bdb.BdbQuit:
5059+
pass
5060+
breakpoint()
5061+
"""
5062+
commands = """
5063+
q
5064+
p 'stopped' + 'again'
5065+
c
5066+
"""
5067+
stdout, stderr = self._run_script(script, commands)
5068+
self.assertIn("'stoppedagain'", stdout)
5069+
self.assertEqual(stderr, '')
5070+
50505071
def test_readline_not_imported(self):
50515072
"""GH-138860
50525073
Directly or indirectly importing readline might deadlock a subprocess
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix :func:`breakpoint` and :func:`pdb.set_trace` being ignored after a
2+
previous debugger session was ended by an exception, for example by quitting
3+
with ``q`` in the interactive interpreter.

0 commit comments

Comments
 (0)