Skip to content

Commit 2838f12

Browse files
committed
Clean up, fix set_trace
This makes the code a bit easier to follow, and it uses a more appropriate _set_stopinfo in the pause case, instead of set_step. Use of set_step was causing set_trace to stop somewhere in the guts of bdb. Closes gh-663
1 parent d2c233a commit 2838f12

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

pudb/debugger.py

+24-12
Original file line numberDiff line numberDiff line change
@@ -252,29 +252,41 @@ def set_trace(self, frame=None, as_breakpoint=None, paused=True):
252252
as_breakpoint = True
253253

254254
if frame is None:
255-
frame = thisframe = sys._getframe().f_back
256-
else:
257-
thisframe = frame
255+
frame = sys._getframe().f_back
256+
assert frame is not None
257+
258258
# See pudb issue #52. If this works well enough we should upstream to
259259
# stdlib bdb.py.
260260
# self.reset()
261261

262-
while frame:
263-
frame.f_trace = self.trace_dispatch
264-
self.botframe = frame
265-
frame = frame.f_back
262+
if paused:
263+
self.enterframe = frame
266264

267-
thisframe_info = (
268-
self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno)
269-
if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]:
265+
thisframe = frame
266+
while thisframe:
267+
thisframe.f_trace = self.trace_dispatch
268+
self.botframe = thisframe
269+
if sys.version_info >= (3, 13):
270+
# save trace flags, to be restored by set_continue
271+
self.frame_trace_lines_opcodes[thisframe] = ( # pylint: disable=no-member
272+
thisframe.f_trace_lines,
273+
thisframe.f_trace_opcodes)
274+
275+
# We need f_trace_lines == True for the debugger to work
276+
thisframe.f_trace_lines = True
277+
278+
thisframe = thisframe.f_back
279+
280+
frame_info = (self.canonic(frame.f_code.co_filename), frame.f_lineno)
281+
if frame_info not in self.set_traces or self.set_traces[frame_info]:
270282
if as_breakpoint:
271-
self.set_traces[thisframe_info] = True
283+
self.set_traces[frame_info] = True
272284
if self.ui.source_code_provider is not None:
273285
self.ui.set_source_code_provider(
274286
self.ui.source_code_provider, force_update=True)
275287

276288
if paused:
277-
self.set_step()
289+
self._set_stopinfo(frame, None)
278290
else:
279291
self.set_continue()
280292
sys.settrace(self.trace_dispatch)

0 commit comments

Comments
 (0)