Skip to content

Commit 585c569

Browse files
committed
stop_here: always stop where set_trace was used from
This is relevant for when `skip` is used. Ref: https://bugs.python.org/issue38806 Ref: python/cpython#17159 NOTE: pypy2: needs the extra check for frame, which makes sense in general (via test_sigint_in_interaction_without_new_cmdloop).
1 parent 1f6571a commit 585c569

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/pdbpp.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1767,6 +1767,15 @@ def set_step(self):
17671767
del self._set_trace_use_next
17681768
self.set_next(self._via_set_trace_frame)
17691769

1770+
def stop_here(self, frame):
1771+
# Always stop at starting frame (https://bugs.python.org/issue38806).
1772+
if self.stopframe is None:
1773+
if getattr(self, "_via_set_trace_frame", None) == frame:
1774+
if not self._stopped_for_set_trace:
1775+
self._stopped_for_set_trace = True
1776+
return True
1777+
return super(Pdb, self).stop_here(frame)
1778+
17701779
def set_trace(self, frame=None):
17711780
"""Remember starting frame.
17721781
@@ -1782,6 +1791,7 @@ def set_trace(self, frame=None):
17821791
if frame is None:
17831792
frame = sys._getframe().f_back
17841793
self._via_set_trace_frame = frame
1794+
self._stopped_for_set_trace = False
17851795

17861796
self.start_filename = frame.f_code.co_filename
17871797
self.start_lineno = frame.f_lineno

testing/test_pdb.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5084,3 +5084,44 @@ def cm():
50845084
]
50855085
else:
50865086
assert pos[0] == contextlib.__file__.rstrip("c")
5087+
5088+
5089+
def test_set_trace_in_skipped_module(testdir):
5090+
def fn():
5091+
class SkippingPdbTest(PdbTest):
5092+
def __init__(self, *args, **kwargs):
5093+
kwargs["skip"] = ["testing.test_pdb"]
5094+
super(SkippingPdbTest, self).__init__(*args, **kwargs)
5095+
5096+
self.calls = []
5097+
5098+
def is_skipped_module(self, module_name):
5099+
self.calls.append(module_name)
5100+
if len(self.calls) == 1:
5101+
print("is_skipped_module?", module_name)
5102+
ret = super(SkippingPdbTest, self).is_skipped_module(module_name)
5103+
assert module_name == "testing.test_pdb"
5104+
assert ret is True
5105+
return True
5106+
return False
5107+
5108+
set_trace(Pdb=SkippingPdbTest) # 1
5109+
set_trace(Pdb=SkippingPdbTest, cleanup=False) # 2
5110+
set_trace(Pdb=SkippingPdbTest, cleanup=False) # 3
5111+
5112+
check(fn, r"""
5113+
[NUM] > .*fn()
5114+
-> set_trace(Pdb=SkippingPdbTest, cleanup=False) # 2
5115+
5 frames hidden (try 'help hidden_frames')
5116+
# n
5117+
is_skipped_module\? testing.test_pdb
5118+
[NUM] > .*fn()
5119+
-> set_trace(Pdb=SkippingPdbTest, cleanup=False) # 3
5120+
5 frames hidden (try 'help hidden_frames')
5121+
# c
5122+
--Return--
5123+
[NUM] > .*fn()
5124+
-> set_trace(Pdb=SkippingPdbTest, cleanup=False) # 3
5125+
5 frames hidden (try 'help hidden_frames')
5126+
# c
5127+
""")

0 commit comments

Comments
 (0)