https://github.com/python/cpython/commit/63b6ec31c44bc91f748a39daf4f65ef9ad25d21b
commit: 63b6ec31c44bc91f748a39daf4f65ef9ad25d21b
branch: main
author: Tian Gao <[email protected]>
committer: gaogaotiantian <[email protected]>
date: 2025-03-04T11:35:47-05:00
summary:
gh-82987: Stop on calling frame unconditionally for inline breakpoints (#130493)
files:
A Misc/NEWS.d/next/Library/2025-02-24-01-49-11.gh-issue-82987.vHfQlG.rst
M Doc/library/pdb.rst
M Doc/whatsnew/3.14.rst
M Lib/bdb.py
M Lib/test/test_pdb.py
diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst
index bdd89d127491a5..b31625e6b0082f 100644
--- a/Doc/library/pdb.rst
+++ b/Doc/library/pdb.rst
@@ -245,6 +245,10 @@ access further features, you have to do this yourself:
.. versionadded:: 3.14
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)
runeval(expression, globals=None, locals=None)
runcall(function, *args, **kwds)
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index aa802faae50b12..7b1a30d5a873ae 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -780,6 +780,11 @@ pdb
the quit and call :func:`sys.exit`, instead of raising :exc:`bdb.BdbQuit`.
(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
------
diff --git a/Lib/bdb.py b/Lib/bdb.py
index a741628e32a981..2463cc217c6d75 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -215,10 +215,13 @@ def dispatch_opcode(self, frame, arg):
If the debugger stops on the current opcode, invoke
self.user_opcode(). Raise BdbQuit if self.quitting is set.
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)
- if self.quitting: raise BdbQuit
+ self.user_opcode(frame)
+ if self.quitting: raise BdbQuit
return self.trace_dispatch
# Normally derived classes don't override the following
diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py
index 7a99c1db84b439..7ecb8d4cd4d5fa 100644
--- a/Lib/test/test_pdb.py
+++ b/Lib/test/test_pdb.py
@@ -4342,6 +4342,28 @@ def test_quit(self):
# The quit prompt should be printed exactly twice
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.requires_subprocess()
diff --git
a/Misc/NEWS.d/next/Library/2025-02-24-01-49-11.gh-issue-82987.vHfQlG.rst
b/Misc/NEWS.d/next/Library/2025-02-24-01-49-11.gh-issue-82987.vHfQlG.rst
new file mode 100644
index 00000000000000..0cfc7cf0cf7163
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-02-24-01-49-11.gh-issue-82987.vHfQlG.rst
@@ -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).
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]