@@ -199,6 +199,8 @@ def __init__(self, skip=None, backend='settrace'):
199199 self .frame_returning = None
200200 self .trace_opcodes = False
201201 self .enterframe = None
202+ self .cmdframe = None
203+ self .cmdlineno = None
202204 self .code_linenos = weakref .WeakKeyDictionary ()
203205 self .backend = backend
204206 if backend == 'monitoring' :
@@ -297,7 +299,12 @@ def dispatch_line(self, frame):
297299 self.user_line(). Raise BdbQuit if self.quitting is set.
298300 Return self.trace_dispatch to continue tracing in this scope.
299301 """
300- if self .stop_here (frame ) or self .break_here (frame ):
302+ # GH-136057
303+ # For line events, we don't want to stop at the same line where
304+ # the latest next/step command was issued.
305+ if (self .stop_here (frame ) or self .break_here (frame )) and not (
306+ self .cmdframe == frame and self .cmdlineno == frame .f_lineno
307+ ):
301308 self .user_line (frame )
302309 self .restart_events ()
303310 if self .quitting : raise BdbQuit
@@ -526,7 +533,8 @@ def _set_trace_opcodes(self, trace_opcodes):
526533 if self .monitoring_tracer :
527534 self .monitoring_tracer .update_local_events ()
528535
529- def _set_stopinfo (self , stopframe , returnframe , stoplineno = 0 , opcode = False ):
536+ def _set_stopinfo (self , stopframe , returnframe , stoplineno = 0 , opcode = False ,
537+ cmdframe = None , cmdlineno = None ):
530538 """Set the attributes for stopping.
531539
532540 If stoplineno is greater than or equal to 0, then stop at line
@@ -539,6 +547,10 @@ def _set_stopinfo(self, stopframe, returnframe, stoplineno=0, opcode=False):
539547 # stoplineno >= 0 means: stop at line >= the stoplineno
540548 # stoplineno -1 means: don't stop at all
541549 self .stoplineno = stoplineno
550+ # cmdframe/cmdlineno is the frame/line number when the user issued
551+ # step/next commands.
552+ self .cmdframe = cmdframe
553+ self .cmdlineno = cmdlineno
542554 self ._set_trace_opcodes (opcode )
543555
544556 def _set_caller_tracefunc (self , current_frame ):
@@ -564,15 +576,17 @@ def set_until(self, frame, lineno=None):
564576
565577 def set_step (self ):
566578 """Stop after one line of code."""
567- self ._set_stopinfo (None , None )
579+ # set_step() could be called from signal handler so enterframe might be None
580+ self ._set_stopinfo (None , None , cmdframe = self .enterframe ,
581+ cmdlineno = getattr (self .enterframe , 'f_lineno' , None ))
568582
569583 def set_stepinstr (self ):
570584 """Stop before the next instruction."""
571585 self ._set_stopinfo (None , None , opcode = True )
572586
573587 def set_next (self , frame ):
574588 """Stop on the next line in or below the given frame."""
575- self ._set_stopinfo (frame , None )
589+ self ._set_stopinfo (frame , None , cmdframe = frame , cmdlineno = frame . f_lineno )
576590
577591 def set_return (self , frame ):
578592 """Stop when returning from the given frame."""
0 commit comments