Skip to content

Commit

Permalink
[3.13] gh-58956: Set f_trace on frames with breakpoints after setting…
Browse files Browse the repository at this point in the history
… a new breakpoint (GH-124454) (#125548)

gh-58956: Set f_trace on frames with breakpoints after setting a new breakpoint (GH-124454)
(cherry picked from commit 12eaadc)

Co-authored-by: Tian Gao <[email protected]>
  • Loading branch information
miss-islington and gaogaotiantian authored Oct 15, 2024
1 parent c5bad75 commit 2ded598
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Lib/bdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,14 @@ def set_break(self, filename, lineno, temporary=False, cond=None,
return 'Line %s:%d does not exist' % (filename, lineno)
self._add_to_breaks(filename, lineno)
bp = Breakpoint(filename, lineno, temporary, cond, funcname)
# After we set a new breakpoint, we need to search through all frames
# and set f_trace to trace_dispatch if there could be a breakpoint in
# that frame.
frame = self.enterframe
while frame:
if self.break_anywhere(frame):
frame.f_trace = self.trace_dispatch
frame = frame.f_back
return None

def _load_breaks(self):
Expand Down
30 changes: 30 additions & 0 deletions Lib/test/test_pdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -3184,6 +3184,36 @@ def test_issue26053(self):
self.assertRegex(res, "Restarting .* with arguments:\na b c")
self.assertRegex(res, "Restarting .* with arguments:\nd e f")

def test_issue58956(self):
# Set a breakpoint in a function that already exists on the call stack
# should enable the trace function for the frame.
script = """
import bar
def foo():
ret = bar.bar()
pass
foo()
"""
commands = """
b bar.bar
c
b main.py:5
c
p ret
quit
"""
bar = """
def bar():
return 42
"""
with open('bar.py', 'w') as f:
f.write(textwrap.dedent(bar))
self.addCleanup(os_helper.unlink, 'bar.py')
stdout, stderr = self.run_pdb_script(script, commands)
lines = stdout.splitlines()
self.assertIn('-> pass', lines)
self.assertIn('(Pdb) 42', lines)

def test_step_into_botframe(self):
# gh-125422
# pdb should not be able to step into the botframe (bdb.py)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed a bug in :mod:`pdb` where sometimes the breakpoint won't trigger if it was set on a function which is already in the call stack.

0 comments on commit 2ded598

Please sign in to comment.