.. 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)
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
------
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
# 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()
--- /dev/null
+Inline breakpoints like :func:`breakpoint` or :func:`pdb.set_trace` will always stop the program at calling frame, ignoring the ``skip`` pattern (if any).