]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-111744: Make breakpoint() enter the debugger immediately (GH-118579)
authorTian Gao <gaogaotiantian@hotmail.com>
Sun, 5 May 2024 14:05:01 +0000 (07:05 -0700)
committerGitHub <noreply@github.com>
Sun, 5 May 2024 14:05:01 +0000 (07:05 -0700)
Doc/library/bdb.rst
Doc/library/pdb.rst
Doc/whatsnew/3.13.rst
Lib/bdb.py
Lib/pdb.py
Lib/test/test_doctest/test_doctest.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2024-05-04-18-40-43.gh-issue-111744.nuCtwN.rst [new file with mode: 0644]

index b050560cd9038cb496148e9022a861bd4debad5e..504fbd0464515ba06a251c516e1ae2bdcb24aa84 100644 (file)
@@ -289,6 +289,10 @@ The :mod:`bdb` module also defines two classes:
       Start debugging from *frame*.  If *frame* is not specified, debugging
       starts from caller's frame.
 
+      .. versionchanged:: 3.13
+         :func:`set_trace` will enter the debugger immediately, rather than
+         on the next line of code to be executed.
+
    .. method:: set_continue()
 
       Stop only at breakpoints or when finished.  If there are no breakpoints,
index a640976493caba846cb8e664850f2bf3ee80caca..7a47a7d5d6754f36f8d2c908f51eecee5ea7b6c4 100644 (file)
@@ -62,8 +62,8 @@ running without the debugger using the :pdbcmd:`continue` command.
 
 The debugger's prompt is ``(Pdb)``, which is the indicator that you are in debug mode::
 
-   > ...(3)double()
-   -> return x * 2
+   > ...(2)double()
+   -> breakpoint()
    (Pdb) p x
    3
    (Pdb) continue
@@ -164,6 +164,9 @@ slightly different way:
    .. versionchanged:: 3.7
       The keyword-only argument *header*.
 
+   .. versionchanged:: 3.13
+      :func:`set_trace` will enter the debugger immediately, rather than
+      on the next line of code to be executed.
 
 .. function:: post_mortem(traceback=None)
 
index 27a1aeaab018dbbddb70d90f806a0cd312c52cbf..c76d0087f9e2ff703babbd59bc62f16b85433b79 100644 (file)
@@ -715,6 +715,12 @@ pdb
 * :mod:`zipapp` is supported as a debugging target.
   (Contributed by Tian Gao in :gh:`118501`.)
 
+* ``breakpoint()`` and ``pdb.set_trace()`` now enter the debugger immediately
+  rather than on the next line of code to be executed. This change prevents the
+  debugger from breaking outside of the context when ``breakpoint()`` is positioned
+  at the end of the context.
+  (Contributed by Tian Gao in :gh:`118579`.)
+
 queue
 -----
 
index 675c8ae51df4c3d238405a8dd29e1eef1a7a8194..7d63fce6ca63f18b8ddb350a9ef73678d8377e7b 100644 (file)
@@ -378,7 +378,7 @@ class Bdb:
             # We need f_trace_lines == True for the debugger to work
             frame.f_trace_lines = True
             frame = frame.f_back
-        self.set_step()
+        self.set_stepinstr()
         sys.settrace(self.trace_dispatch)
 
     def set_continue(self):
index e6450861328b280245668dd3c84585525df2333f..b2bd2d79384e3b011d69ed63158bc9170f95ef1c 100755 (executable)
@@ -431,6 +431,8 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         if self.bp_commands(frame):
             self.interaction(frame, None)
 
+    user_opcode = user_line
+
     def bp_commands(self, frame):
         """Call every command that was set for the current active breakpoint
         (if there is one).
index 3a173e823dd9a3fee22f1a8075189dbe8b90600e..286c3ecfbc9239f216371971f86dc2cc9277d450 100644 (file)
@@ -2056,8 +2056,7 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
 
           >>> try: runner.run(test)
           ... finally: sys.stdin = real_stdin
-          --Return--
-          > <doctest foo-bar@baz[2]>(1)<module>()->None
+          > <doctest foo-bar@baz[2]>(1)<module>()
           -> import pdb; pdb.set_trace()
           (Pdb) print(x)
           42
@@ -2087,8 +2086,7 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
           ...     runner.run(test)
           ... finally:
           ...     sys.stdin = real_stdin
-          --Return--
-          > <doctest test.test_doctest.test_doctest.test_pdb_set_trace[9]>(3)calls_set_trace()->None
+          > <doctest test.test_doctest.test_doctest.test_pdb_set_trace[9]>(3)calls_set_trace()
           -> import pdb; pdb.set_trace()
           (Pdb) print(y)
           2
@@ -2114,6 +2112,7 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
           >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
           >>> real_stdin = sys.stdin
           >>> sys.stdin = FakeInput([
+          ...    'step',     # return event of g
           ...    'list',     # list source from example 2
           ...    'next',     # return from g()
           ...    'list',     # list source from example 1
@@ -2124,6 +2123,9 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
           >>> try: runner.run(test)
           ... finally: sys.stdin = real_stdin
           ... # doctest: +NORMALIZE_WHITESPACE
+          > <doctest foo-bar@baz[1]>(3)g()
+          -> import pdb; pdb.set_trace()
+          (Pdb) step
           --Return--
           > <doctest foo-bar@baz[1]>(3)g()->None
           -> import pdb; pdb.set_trace()
@@ -2188,6 +2190,7 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
         >>> test = parser.get_doctest(doc, globals(), "foo-bar@baz", "foo-bar@baz.py", 0)
         >>> real_stdin = sys.stdin
         >>> sys.stdin = FakeInput([
+        ...    'step',
         ...    'print(y)',  # print data defined in the function
         ...    'step', 'step', 'step', 'step', 'step', 'step', 'print(z)',
         ...    'up', 'print(x)',
@@ -2201,6 +2204,9 @@ if not hasattr(sys, 'gettrace') or not sys.gettrace():
         ... finally:
         ...     sys.stdin = real_stdin
         ... # doctest: +REPORT_NDIFF
+        > <doctest test.test_doctest.test_doctest.test_pdb_set_trace_nested[0]>(4)calls_set_trace()
+        -> import pdb; pdb.set_trace()
+        (Pdb) step
         > <doctest test.test_doctest.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
         -> self.f1()
         (Pdb) print(y)
index 001562acae74586e202a9af00e719227a088cef8..82f3fbc26b90d9554a60588042ed29bc0051b0d7 100644 (file)
@@ -46,7 +46,6 @@ def test_pdb_displayhook():
 
     >>> def test_function(foo, bar):
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...     pass
 
     >>> with PdbTestInput([
     ...     'foo',
@@ -55,8 +54,8 @@ def test_pdb_displayhook():
     ...     'continue',
     ... ]):
     ...     test_function(1, None)
-    > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_displayhook[0]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) foo
     1
     (Pdb) bar
@@ -98,6 +97,7 @@ def test_pdb_basic_commands():
     ...     print(ret)
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+    ...     'step',       # go to line ret = test_function_2('baz')
     ...     'step',       # entering the function call
     ...     'args',       # display function args
     ...     'list',       # list function source
@@ -122,6 +122,9 @@ def test_pdb_basic_commands():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_pdb_basic_commands[3]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_basic_commands[3]>(3)test_function()
     -> ret = test_function_2('baz')
     (Pdb) step
@@ -145,7 +148,7 @@ def test_pdb_basic_commands():
     [EOF]
     (Pdb) bt
     ...
-      <doctest test.test_pdb.test_pdb_basic_commands[4]>(25)<module>()
+      <doctest test.test_pdb.test_pdb_basic_commands[4]>(26)<module>()
     -> test_function()
       <doctest test.test_pdb.test_pdb_basic_commands[3]>(3)test_function()
     -> ret = test_function_2('baz')
@@ -275,8 +278,8 @@ def test_pdb_breakpoint_commands():
     ...     'continue',
     ... ]):
     ...    test_function()
-    > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(3)test_function()
-    -> print(1)
+    > <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break 3
     Breakpoint 1 at <doctest test.test_pdb.test_pdb_breakpoint_commands[0]>:3
     (Pdb) break 4, +
@@ -380,8 +383,8 @@ def test_pdb_breakpoint_with_filename():
     ...     'continue',
     ... ]):
     ...    test_function()
-    > <doctest test.test_pdb.test_pdb_breakpoint_with_filename[0]>(5)test_function()
-    -> mod2.func88()
+    > <doctest test.test_pdb.test_pdb_breakpoint_with_filename[0]>(4)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break test.test_inspect.inspect_fodder2:90
     Breakpoint 1 at ...inspect_fodder2.py:90
     (Pdb) continue
@@ -479,8 +482,7 @@ def test_pdb_pp_repr_exc():
     ...     'continue',
     ... ]):
     ...    test_function()
-    --Return--
-    > <doctest test.test_pdb.test_pdb_pp_repr_exc[2]>(2)test_function()->None
+    > <doctest test.test_pdb.test_pdb_pp_repr_exc[2]>(2)test_function()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) p obj
     *** Exception: repr_exc
@@ -520,6 +522,7 @@ def test_list_commands():
     ...     ret = test_function_2('baz')
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+    ...     'step',      # go to the test function line
     ...     'list',      # list first function
     ...     'step',      # step into second function
     ...     'list',      # list second function
@@ -535,6 +538,9 @@ def test_list_commands():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_list_commands[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_list_commands[1]>(3)test_function()
     -> ret = test_function_2('baz')
     (Pdb) list
@@ -615,8 +621,7 @@ def test_pdb_whatis_command():
     ...    'continue',
     ... ]):
     ...    test_function()
-    --Return--
-    > <doctest test.test_pdb.test_pdb_whatis_command[3]>(2)test_function()->None
+    > <doctest test.test_pdb.test_pdb_whatis_command[3]>(2)test_function()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) whatis myvar
     <class 'tuple'>
@@ -645,6 +650,7 @@ def test_pdb_display_command():
     ...     a = 4
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS
+    ...     's',
     ...     'display +',
     ...     'display',
     ...     'display a',
@@ -660,6 +666,9 @@ def test_pdb_display_command():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_pdb_display_command[0]>(3)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) s
     > <doctest test.test_pdb.test_pdb_display_command[0]>(4)test_function()
     -> a = 1
     (Pdb) display +
@@ -708,6 +717,7 @@ def test_pdb_alias_command():
     ...     o.method()
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS
+    ...     's',
     ...     'alias pi',
     ...     'alias pi for k in %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}")',
     ...     'alias ps pi self',
@@ -726,6 +736,9 @@ def test_pdb_alias_command():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_pdb_alias_command[1]>(3)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) s
     > <doctest test.test_pdb.test_pdb_alias_command[1]>(4)test_function()
     -> o.method()
     (Pdb) alias pi
@@ -781,8 +794,7 @@ def test_pdb_where_command():
     ...     'continue',
     ... ]):
     ...    test_function()
-    --Return--
-    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()->None
+    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) w
     ...
@@ -792,7 +804,7 @@ def test_pdb_where_command():
     -> f()
       <doctest test.test_pdb.test_pdb_where_command[1]>(2)f()
     -> g();
-    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()->None
+    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) where
     ...
@@ -802,7 +814,7 @@ def test_pdb_where_command():
     -> f()
       <doctest test.test_pdb.test_pdb_where_command[1]>(2)f()
     -> g();
-    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()->None
+    > <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) u
     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f()
@@ -815,7 +827,7 @@ def test_pdb_where_command():
     -> f()
     > <doctest test.test_pdb.test_pdb_where_command[1]>(2)f()
     -> g();
-      <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()->None
+      <doctest test.test_pdb.test_pdb_where_command[0]>(2)g()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) continue
     """
@@ -851,8 +863,7 @@ if not sys.flags.no_site:
         ...     'continue',
         ... ]):
         ...    test_function()
-        --Return--
-        > <doctest test.test_pdb.test_pdb_interact_command[2]>(4)test_function()->None
+        > <doctest test.test_pdb.test_pdb_interact_command[2]>(4)test_function()
         -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
         (Pdb) interact
         *pdb interact start*
@@ -892,6 +903,7 @@ def test_convenience_variables():
     ...     util_function()
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+    ...     'step',             # Step to try statement
     ...     '$_frame.f_lineno', # Check frame convenience variable
     ...     '$ _frame',         # This should be a syntax error
     ...     '$a = 10',          # Set a convenience variable
@@ -914,6 +926,9 @@ def test_convenience_variables():
     ...     'continue',
     ... ]):
     ...     test_function()
+    > <doctest test.test_pdb.test_convenience_variables[0]>(2)util_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_convenience_variables[0]>(3)util_function()
     -> try:
     (Pdb) $_frame.f_lineno
@@ -1387,6 +1402,7 @@ def test_post_mortem():
     ...     print('Not reached.')
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+    ...     'step',      # step to test_function_2() line
     ...     'next',      # step over exception-raising call
     ...     'bt',        # get a backtrace
     ...     'list',      # list code of test_function()
@@ -1398,6 +1414,9 @@ def test_post_mortem():
     ...        test_function()
     ...    except ZeroDivisionError:
     ...        print('Correctly reraised.')
+    > <doctest test.test_pdb.test_post_mortem[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
     -> test_function_2()
     (Pdb) next
@@ -1407,7 +1426,7 @@ def test_post_mortem():
     -> test_function_2()
     (Pdb) bt
     ...
-      <doctest test.test_pdb.test_post_mortem[2]>(10)<module>()
+      <doctest test.test_pdb.test_post_mortem[2]>(11)<module>()
     -> test_function()
     > <doctest test.test_pdb.test_post_mortem[1]>(3)test_function()
     -> test_function_2()
@@ -1444,9 +1463,13 @@ def test_pdb_skip_modules():
 
     >>> with PdbTestInput([
     ...     'step',
+    ...     'step',
     ...     'continue',
     ... ]):
     ...     skip_module()
+    > <doctest test.test_pdb.test_pdb_skip_modules[0]>(3)skip_module()
+    -> import pdb; pdb.Pdb(skip=['stri*'], nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()
     -> string.capwords('FOO')
     (Pdb) step
@@ -1461,7 +1484,6 @@ def test_pdb_invalid_arg():
 
     >>> def test_function():
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...     pass
 
     >>> with PdbTestInput([
     ...     'a = 3',
@@ -1470,8 +1492,8 @@ def test_pdb_invalid_arg():
     ...     'continue'
     ... ]):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_invalid_arg[0]>(3)test_function()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_invalid_arg[0]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) a = 3
     *** Invalid argument: = 3
           Usage: a(rgs)
@@ -1505,10 +1527,14 @@ def test_pdb_skip_modules_with_callback():
     ...     'step',
     ...     'step',
     ...     'step',
+    ...     'step',
     ...     'continue',
     ... ]):
     ...     skip_module()
     ...     pass  # provides something to "step" to
+    > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(4)skip_module()
+    -> import pdb; pdb.Pdb(skip=['module_to_skip*'], nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()
     -> mod.foo_pony(callback)
     (Pdb) step
@@ -1527,7 +1553,7 @@ def test_pdb_skip_modules_with_callback():
     > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None
     -> mod.foo_pony(callback)
     (Pdb) step
-    > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>()
+    > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(11)<module>()
     -> pass  # provides something to "step" to
     (Pdb) continue
     """
@@ -1546,6 +1572,7 @@ def test_pdb_continue_in_bottomframe():
     ...     print(4)
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS
+    ...     'step',
     ...     'next',
     ...     'break 7',
     ...     'continue',
@@ -1554,6 +1581,9 @@ def test_pdb_continue_in_bottomframe():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(3)test_function()
+    -> inst.set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_continue_in_bottomframe[0]>(4)test_function()
     -> inst.botframe = sys._getframe()  # hackery to get the right botframe
     (Pdb) next
@@ -1645,8 +1675,8 @@ def test_next_until_return_at_return_event():
     ...                    'return',
     ...                    'continue']):
     ...     test_function()
-    > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(3)test_function()
-    -> test_function_2()
+    > <doctest test.test_pdb.test_next_until_return_at_return_event[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break test_function_2
     Breakpoint 1 at <doctest test.test_pdb.test_next_until_return_at_return_event[0]>:2
     (Pdb) continue
@@ -1705,12 +1735,16 @@ def test_pdb_next_command_for_generator():
     >>> with PdbTestInput(['step',
     ...                    'step',
     ...                    'step',
+    ...                    'step',
     ...                    'next',
     ...                    'next',
     ...                    'step',
     ...                    'step',
     ...                    'continue']):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_next_command_for_generator[1]>(3)test_function()
     -> it = test_gen()
     (Pdb) step
@@ -1765,12 +1799,16 @@ if not SKIP_ASYNCIO_TESTS:
 
         >>> with PdbTestInput(['step',
         ...                    'step',
+        ...                    'step',
         ...                    'next',
         ...                    'next',
         ...                    'next',
         ...                    'step',
         ...                    'continue']):
         ...     test_function()
+        > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(2)test_main()
+        -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+        (Pdb) step
         > <doctest test.test_pdb.test_pdb_next_command_for_coroutine[2]>(3)test_main()
         -> await test_coro()
         (Pdb) step
@@ -1825,12 +1863,16 @@ if not SKIP_ASYNCIO_TESTS:
 
         >>> with PdbTestInput(['step',
         ...                    'step',
+        ...                    'step',
         ...                    'next',
         ...                    'next',
         ...                    'step',
         ...                    'next',
         ...                    'continue']):
         ...     test_function()
+        > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[3]>(2)test_main()
+        -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+        (Pdb) step
         > <doctest test.test_pdb.test_pdb_next_command_for_asyncgen[3]>(3)test_main()
         -> await test_coro()
         (Pdb) step
@@ -1883,11 +1925,15 @@ def test_pdb_return_command_for_generator():
     >>> with PdbTestInput(['step',
     ...                    'step',
     ...                    'step',
+    ...                    'step',
     ...                    'return',
     ...                    'step',
     ...                    'step',
     ...                    'continue']):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_return_command_for_generator[1]>(3)test_function()
     -> it = test_gen()
     (Pdb) step
@@ -1938,9 +1984,13 @@ if not SKIP_ASYNCIO_TESTS:
 
         >>> with PdbTestInput(['step',
         ...                    'step',
+        ...                    'step',
         ...                    'next',
         ...                    'continue']):
         ...     test_function()
+        > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[2]>(2)test_main()
+        -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+        (Pdb) step
         > <doctest test.test_pdb.test_pdb_return_command_for_coroutine[2]>(3)test_main()
         -> await test_coro()
         (Pdb) step
@@ -1973,11 +2023,15 @@ def test_pdb_until_command_for_generator():
     ...     print("finished")
 
     >>> with PdbTestInput(['step',
+    ...                    'step',
     ...                    'until 4',
     ...                    'step',
     ...                    'step',
     ...                    'continue']):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_until_command_for_generator[1]>(3)test_function()
     -> for i in test_gen():
     (Pdb) step
@@ -2029,9 +2083,13 @@ if not SKIP_ASYNCIO_TESTS:
         ...     print("finished")
 
         >>> with PdbTestInput(['step',
+        ...                    'step',
         ...                    'until 8',
         ...                    'continue']):
         ...     test_function()
+        > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[2]>(2)test_main()
+        -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+        (Pdb) step
         > <doctest test.test_pdb.test_pdb_until_command_for_coroutine[2]>(3)test_main()
         -> await test_coro()
         (Pdb) step
@@ -2070,8 +2128,8 @@ def test_pdb_next_command_in_generator_for_loop():
     ...                    'next',
     ...                    'continue']):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(3)test_function()
-    -> for i in test_gen():
+    > <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[1]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break test_gen
     Breakpoint 1 at <doctest test.test_pdb.test_pdb_next_command_in_generator_for_loop[0]>:2
     (Pdb) continue
@@ -2110,11 +2168,15 @@ def test_pdb_next_command_subiterator():
 
     >>> with PdbTestInput(['step',
     ...                    'step',
+    ...                    'step',
     ...                    'next',
     ...                    'next',
     ...                    'next',
     ...                    'continue']):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_next_command_subiterator[2]>(3)test_function()
     -> for i in test_gen():
     (Pdb) step
@@ -2143,7 +2205,6 @@ def test_pdb_multiline_statement():
 
     >>> def test_function():
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...     pass
 
     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
     ...     'def f(x):',
@@ -2153,8 +2214,8 @@ def test_pdb_multiline_statement():
     ...     'c'
     ... ]):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_multiline_statement[0]>(3)test_function()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_multiline_statement[0]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) def f(x):
     ...     return x * 2
     ...
@@ -2170,7 +2231,6 @@ def test_pdb_show_attribute_and_item():
     ...     n = lambda x: x
     ...     c = {"a": 1}
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...     pass
 
     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
     ...     'c["a"]',
@@ -2184,8 +2244,8 @@ def test_pdb_show_attribute_and_item():
     ...     'c'
     ... ]):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_show_attribute_and_item[0]>(5)test_function()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_show_attribute_and_item[0]>(4)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) c["a"]
     1
     (Pdb) c.get("a")
@@ -2219,12 +2279,12 @@ def test_pdb_issue_20766():
     >>> with PdbTestInput(['continue',
     ...                    'continue']):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
-    -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+    > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function()
+    -> sess.set_trace(sys._getframe())
     (Pdb) continue
     pdb 1: <built-in function default_int_handler>
-    > <doctest test.test_pdb.test_pdb_issue_20766[0]>(6)test_function()
-    -> print('pdb %d: %s' % (i, sess._previous_sigint_handler))
+    > <doctest test.test_pdb.test_pdb_issue_20766[0]>(5)test_function()
+    -> sess.set_trace(sys._getframe())
     (Pdb) continue
     pdb 2: <built-in function default_int_handler>
     """
@@ -2245,8 +2305,8 @@ def test_pdb_issue_43318():
     ...     'continue'
     ... ]):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_issue_43318[0]>(3)test_function()
-    -> print(1)
+    > <doctest test.test_pdb.test_pdb_issue_43318[0]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break 3
     Breakpoint 1 at <doctest test.test_pdb.test_pdb_issue_43318[0]>:3
     (Pdb) clear <doctest test.test_pdb.test_pdb_issue_43318[0]>:3
@@ -2278,12 +2338,16 @@ def test_pdb_issue_gh_91742():
     >>> reset_Breakpoint()
     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
     ...     'step',
+    ...     'step',
     ...     'next',
     ...     'next',
     ...     'jump 5',
     ...     'continue'
     ... ]):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(11)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_issue_gh_91742[0]>(12)test_function()
     -> about()
     (Pdb) step
@@ -2321,6 +2385,7 @@ def test_pdb_issue_gh_94215():
     >>> reset_Breakpoint()
     >>> with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
     ...     'step',
+    ...     'step',
     ...     'next',
     ...     'next',
     ...     'jump 3',
@@ -2333,6 +2398,9 @@ def test_pdb_issue_gh_94215():
     ...     'continue'
     ... ]):
     ...     test_function()
+    > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(8)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) step
     > <doctest test.test_pdb.test_pdb_issue_gh_94215[0]>(9)test_function()
     -> func()
     (Pdb) step
@@ -2385,8 +2453,7 @@ def test_pdb_issue_gh_101673():
     ...     'continue'
     ... ]):
     ...     test_function()
-    --Return--
-    > <doctest test.test_pdb.test_pdb_issue_gh_101673[0]>(3)test_function()->None
+    > <doctest test.test_pdb.test_pdb_issue_gh_101673[0]>(3)test_function()
     -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) !a = 2
     (Pdb) ll
@@ -2410,16 +2477,16 @@ def test_pdb_issue_gh_103225():
     ...     a = 1
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     ...     b = 2
-    > <doctest test.test_pdb.test_pdb_issue_gh_103225[0]>(7)<module>()
-    -> b = 2
+    > <doctest test.test_pdb.test_pdb_issue_gh_103225[0]>(6)<module>()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) longlist
       1     with PdbTestInput([  # doctest: +NORMALIZE_WHITESPACE
       2         'longlist',
       3         'continue'
       4     ]):
       5         a = 1
-      6         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-      7  ->     b = 2
+      6 ->      import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+      7         b = 2
     (Pdb) continue
     """
 
@@ -2438,9 +2505,8 @@ def test_pdb_issue_gh_101517():
     ...     'continue'
     ... ]):
     ...    test_function()
-    --Return--
-    > <doctest test.test_pdb.test_pdb_issue_gh_101517[0]>(None)test_function()->None
-    -> Warning: lineno is None
+    > <doctest test.test_pdb.test_pdb_issue_gh_101517[0]>(5)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) continue
     """
 
@@ -2456,8 +2522,8 @@ def test_pdb_issue_gh_108976():
     ...     'continue'
     ... ]):
     ...    test_function()
-    > <doctest test.test_pdb.test_pdb_issue_gh_108976[0]>(5)test_function()
-    -> a = 1
+    > <doctest test.test_pdb.test_pdb_issue_gh_108976[0]>(4)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) continue
     """
 
@@ -2476,9 +2542,8 @@ def test_pdb_issue_gh_80731():
     ...         raise ValueError('Correct')
     ...     except ValueError:
     ...         import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...         pass
-    > <doctest test.test_pdb.test_pdb_issue_gh_80731[0]>(10)<module>()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_issue_gh_80731[0]>(9)<module>()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) import sys
     (Pdb) sys.exc_info()
     (<class 'ValueError'>, ValueError('Correct'), <traceback object at ...>)
@@ -2492,6 +2557,7 @@ def test_pdb_ambiguous_statements():
     Make sure that ambiguous statements prefixed by '!' are properly disambiguated
 
     >>> with PdbTestInput([
+    ...     's',         # step to the print line
     ...     '! n = 42',  # disambiguated statement: reassign the name n
     ...     'n',         # advance the debugger into the print()
     ...     'continue'
@@ -2500,6 +2566,9 @@ def test_pdb_ambiguous_statements():
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     ...     print(f"The value of n is {n}")
     > <doctest test.test_pdb.test_pdb_ambiguous_statements[0]>(8)<module>()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) s
+    > <doctest test.test_pdb.test_pdb_ambiguous_statements[0]>(9)<module>()
     -> print(f"The value of n is {n}")
     (Pdb) ! n = 42
     (Pdb) n
@@ -2528,8 +2597,8 @@ def test_pdb_f_trace_lines():
     ...     'continue'
     ... ]):
     ...    test_function()
-    > <doctest test.test_pdb.test_pdb_f_trace_lines[1]>(6)test_function()
-    -> if frame.f_trace_lines != False:
+    > <doctest test.test_pdb.test_pdb_f_trace_lines[1]>(5)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) continue
     """
 
@@ -2552,7 +2621,6 @@ def test_pdb_function_break():
 
     >>> def test_function():
     ...     import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
-    ...     pass
 
     >>> with PdbTestInput([  # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
     ...     'break foo',
@@ -2562,8 +2630,8 @@ def test_pdb_function_break():
     ...     'continue'
     ... ]):
     ...     test_function()
-    > <doctest test.test_pdb.test_pdb_function_break[4]>(3)test_function()
-    -> pass
+    > <doctest test.test_pdb.test_pdb_function_break[4]>(2)test_function()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) break foo
     Breakpoint ... at <doctest test.test_pdb.test_pdb_function_break[0]>:1
     (Pdb) break bar
@@ -2593,6 +2661,7 @@ def test_pdb_issue_gh_65052():
     ...     A()
     >>> with PdbTestInput([  # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
     ...     's',
+    ...     's',
     ...     'retval',
     ...     'continue',
     ...     'args',
@@ -2601,6 +2670,9 @@ def test_pdb_issue_gh_65052():
     ...     'continue',
     ... ]):
     ...    test_function()
+    > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(3)__new__()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+    (Pdb) s
     > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(4)__new__()
     -> return object.__new__(cls)
     (Pdb) s
@@ -2610,8 +2682,8 @@ def test_pdb_issue_gh_65052():
     (Pdb) retval
     *** repr(retval) failed: AttributeError: 'A' object has no attribute 'a' ***
     (Pdb) continue
-    > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(7)__init__()
-    -> self.a = 1
+    > <doctest test.test_pdb.test_pdb_issue_gh_65052[0]>(6)__init__()
+    -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
     (Pdb) args
     self = *** repr(self) failed: AttributeError: 'A' object has no attribute 'a' ***
     (Pdb) display self
diff --git a/Misc/NEWS.d/next/Library/2024-05-04-18-40-43.gh-issue-111744.nuCtwN.rst b/Misc/NEWS.d/next/Library/2024-05-04-18-40-43.gh-issue-111744.nuCtwN.rst
new file mode 100644 (file)
index 0000000..6986aaa
--- /dev/null
@@ -0,0 +1 @@
+``breakpoint()`` and ``pdb.set_trace()`` now enter the debugger immediately after the call rather than before the next line is executed.