summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/bdb.py8
-rw-r--r--Lib/test/test_pdb.py30
-rw-r--r--Misc/NEWS.d/next/Library/2024-09-24-18-16-59.gh-issue-58956.0wFrBR.rst1
3 files changed, 39 insertions, 0 deletions
diff --git a/Lib/bdb.py b/Lib/bdb.py
index 9755d61..81bba8a 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -461,6 +461,14 @@ class Bdb:
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):
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index 456effc..8136c59 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -3396,6 +3396,36 @@ def bœr():
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)
diff --git a/Misc/NEWS.d/next/Library/2024-09-24-18-16-59.gh-issue-58956.0wFrBR.rst b/Misc/NEWS.d/next/Library/2024-09-24-18-16-59.gh-issue-58956.0wFrBR.rst
new file mode 100644
index 0000000..a882a63
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-09-24-18-16-59.gh-issue-58956.0wFrBR.rst
@@ -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.