mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-82987: Stop on calling frame unconditionally for inline breakpoints (#130493)
This commit is contained in:
parent
efadc5874c
commit
63b6ec31c4
5 changed files with 38 additions and 3 deletions
|
@ -245,6 +245,10 @@ access further features, you have to do this yourself:
|
||||||
.. versionadded:: 3.14
|
.. versionadded:: 3.14
|
||||||
Added the *mode* argument.
|
Added the *mode* argument.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.14
|
||||||
|
Inline breakpoints like :func:`breakpoint` or :func:`pdb.set_trace` will
|
||||||
|
always stop the program at calling frame, ignoring the *skip* pattern (if any).
|
||||||
|
|
||||||
.. method:: run(statement, globals=None, locals=None)
|
.. method:: run(statement, globals=None, locals=None)
|
||||||
runeval(expression, globals=None, locals=None)
|
runeval(expression, globals=None, locals=None)
|
||||||
runcall(function, *args, **kwds)
|
runcall(function, *args, **kwds)
|
||||||
|
|
|
@ -780,6 +780,11 @@ pdb
|
||||||
the quit and call :func:`sys.exit`, instead of raising :exc:`bdb.BdbQuit`.
|
the quit and call :func:`sys.exit`, instead of raising :exc:`bdb.BdbQuit`.
|
||||||
(Contributed by Tian Gao in :gh:`124704`.)
|
(Contributed by Tian Gao in :gh:`124704`.)
|
||||||
|
|
||||||
|
* Inline breakpoints like :func:`breakpoint` or :func:`pdb.set_trace` will
|
||||||
|
always stop the program at calling frame, ignoring the ``skip`` pattern
|
||||||
|
(if any).
|
||||||
|
(Contributed by Tian Gao in :gh:`130493`.)
|
||||||
|
|
||||||
|
|
||||||
pickle
|
pickle
|
||||||
------
|
------
|
||||||
|
|
|
@ -215,10 +215,13 @@ class Bdb:
|
||||||
If the debugger stops on the current opcode, invoke
|
If the debugger stops on the current opcode, invoke
|
||||||
self.user_opcode(). Raise BdbQuit if self.quitting is set.
|
self.user_opcode(). Raise BdbQuit if self.quitting is set.
|
||||||
Return self.trace_dispatch to continue tracing in this scope.
|
Return self.trace_dispatch to continue tracing in this scope.
|
||||||
|
|
||||||
|
Opcode event will always trigger the user callback. For now the only
|
||||||
|
opcode event is from an inline set_trace() and we want to stop there
|
||||||
|
unconditionally.
|
||||||
"""
|
"""
|
||||||
if self.stop_here(frame) or self.break_here(frame):
|
self.user_opcode(frame)
|
||||||
self.user_opcode(frame)
|
if self.quitting: raise BdbQuit
|
||||||
if self.quitting: raise BdbQuit
|
|
||||||
return self.trace_dispatch
|
return self.trace_dispatch
|
||||||
|
|
||||||
# Normally derived classes don't override the following
|
# Normally derived classes don't override the following
|
||||||
|
|
|
@ -4342,6 +4342,28 @@ class PdbTestInline(unittest.TestCase):
|
||||||
# The quit prompt should be printed exactly twice
|
# The quit prompt should be printed exactly twice
|
||||||
self.assertEqual(stdout.count("Quit anyway"), 2)
|
self.assertEqual(stdout.count("Quit anyway"), 2)
|
||||||
|
|
||||||
|
def test_set_trace_with_skip(self):
|
||||||
|
"""GH-82897
|
||||||
|
Inline set_trace() should break unconditionally. This example is a
|
||||||
|
bit oversimplified, but as `pdb.set_trace()` uses the previous Pdb
|
||||||
|
instance, it's possible that we had a previous pdb instance with
|
||||||
|
skip values when we use `pdb.set_trace()` - it would be confusing
|
||||||
|
to users when such inline breakpoints won't break immediately.
|
||||||
|
"""
|
||||||
|
script = textwrap.dedent("""
|
||||||
|
import pdb
|
||||||
|
def foo():
|
||||||
|
x = 40 + 2
|
||||||
|
pdb.Pdb(skip=['__main__']).set_trace()
|
||||||
|
foo()
|
||||||
|
""")
|
||||||
|
commands = """
|
||||||
|
p x
|
||||||
|
c
|
||||||
|
"""
|
||||||
|
stdout, _ = self._run_script(script, commands)
|
||||||
|
self.assertIn("42", stdout)
|
||||||
|
|
||||||
|
|
||||||
@support.force_not_colorized_test_class
|
@support.force_not_colorized_test_class
|
||||||
@support.requires_subprocess()
|
@support.requires_subprocess()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Inline breakpoints like :func:`breakpoint` or :func:`pdb.set_trace` will always stop the program at calling frame, ignoring the ``skip`` pattern (if any).
|
Loading…
Add table
Add a link
Reference in a new issue