mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.13] gh-58956: Set f_trace on frames with breakpoints after setting 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 12eaadc0ad
)
Co-authored-by: Tian Gao <gaogaotiantian@hotmail.com>
This commit is contained in:
parent
c5bad759f5
commit
2ded598323
3 changed files with 39 additions and 0 deletions
|
@ -439,6 +439,14 @@ class Bdb:
|
||||||
return 'Line %s:%d does not exist' % (filename, lineno)
|
return 'Line %s:%d does not exist' % (filename, lineno)
|
||||||
self._add_to_breaks(filename, lineno)
|
self._add_to_breaks(filename, lineno)
|
||||||
bp = Breakpoint(filename, lineno, temporary, cond, funcname)
|
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
|
return None
|
||||||
|
|
||||||
def _load_breaks(self):
|
def _load_breaks(self):
|
||||||
|
|
|
@ -3184,6 +3184,36 @@ def bœr():
|
||||||
self.assertRegex(res, "Restarting .* with arguments:\na b c")
|
self.assertRegex(res, "Restarting .* with arguments:\na b c")
|
||||||
self.assertRegex(res, "Restarting .* with arguments:\nd e f")
|
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):
|
def test_step_into_botframe(self):
|
||||||
# gh-125422
|
# gh-125422
|
||||||
# pdb should not be able to step into the botframe (bdb.py)
|
# pdb should not be able to step into the botframe (bdb.py)
|
||||||
|
|
|
@ -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.
|
Loading…
Add table
Add a link
Reference in a new issue