Skip to content

Commit 7518a93

Browse files
committed
Fixed py3 behaviour when trace set via import pudb.b
1 parent c1df0e3 commit 7518a93

File tree

1 file changed

+39
-32
lines changed

1 file changed

+39
-32
lines changed

pudb/debugger.py

+39-32
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def set_continue(self):
187187
if not self.breaks:
188188
# no breakpoints; run without debugger overhead
189189
sys.settrace(None)
190-
frame = sys._getframe().f_back
190+
frame = sys._getframe(1)
191191
while frame:
192192
del frame.f_trace
193193
if frame is self.botframe:
@@ -216,34 +216,36 @@ def set_trace(self, frame=None, as_breakpoint=None, paused=True):
216216
as_breakpoint = True
217217

218218
if frame is None:
219-
frame = thisframe = sys._getframe().f_back
220-
else:
221-
thisframe = frame
219+
frame = sys._getframe(1)
220+
222221
# See pudb issue #52. If this works well enough we should upstream to
223222
# stdlib bdb.py.
224223
#self.reset()
225224

226-
while frame:
227-
frame.f_trace = self.trace_dispatch
228-
self.botframe = frame
229-
frame = frame.f_back
230-
231-
thisframe_info = (
232-
self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno)
233-
if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]:
234-
if as_breakpoint:
235-
self.set_traces[thisframe_info] = True
236-
if self.ui.source_code_provider is not None:
237-
self.ui.set_source_code_provider(
238-
self.ui.source_code_provider, force_update=True)
239-
240-
if paused:
241-
self.set_step()
242-
else:
243-
self.set_continue()
244-
sys.settrace(self.trace_dispatch)
245-
else:
246-
return
225+
self.botframe = frame
226+
self.botframe.f_trace = self.trace_dispatch
227+
while self.botframe.f_back:
228+
self.botframe = self.botframe.f_back
229+
self.botframe.f_trace = self.trace_dispatch
230+
231+
stack, _ = self.get_stack(frame, None)
232+
if stack:
233+
thisframe, _ = stack[-1]
234+
thisframe_info = (
235+
self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno)
236+
237+
if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]:
238+
if as_breakpoint:
239+
self.set_traces[thisframe_info] = True
240+
if self.ui.source_code_provider is not None:
241+
self.ui.set_source_code_provider(
242+
self.ui.source_code_provider, force_update=True)
243+
244+
if paused:
245+
self.set_next(thisframe)
246+
else:
247+
self.set_continue()
248+
sys.settrace(self.trace_dispatch)
247249

248250
def save_breakpoints(self):
249251
from pudb.settings import save_breakpoints
@@ -313,13 +315,8 @@ def move_down_frame(self):
313315
if self.curindex < len(self.stack)-1:
314316
self.set_frame_index(self.curindex+1)
315317

316-
def get_shortened_stack(self, frame, tb):
317-
stack, index = self.get_stack(frame, tb)
318-
319-
for i, (s_frame, lineno) in enumerate(stack):
320-
if s_frame is self.bottom_frame and index >= i:
321-
stack = stack[i:]
322-
index -= i
318+
def get_stack(self, f, t):
319+
stack, index = bdb.Bdb.get_stack(self, f, t)
323320

324321
if CONFIG['hide_importlib_frames']:
325322
# see Python/import.c remove_importlib_frames function for more info
@@ -333,6 +330,16 @@ def get_shortened_stack(self, frame, tb):
333330

334331
return stack, index
335332

333+
def get_shortened_stack(self, frame, tb):
334+
stack, index = self.get_stack(frame, tb)
335+
336+
for i, (s_frame, lineno) in enumerate(stack):
337+
if s_frame is self.bottom_frame and index >= i:
338+
stack = stack[i:]
339+
index -= i
340+
341+
return stack, index
342+
336343
def interaction(self, frame, exc_tuple=None, show_exc_dialog=True):
337344
if exc_tuple is None:
338345
tb = None

0 commit comments

Comments
 (0)