From c1df0e383ebfb593bd7734b77311616339bd8977 Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Thu, 6 Apr 2017 19:02:15 +0300 Subject: [PATCH 1/4] Added option to hide importlib frames in stack --- pudb/debugger.py | 10 ++++++++++ pudb/settings.py | 3 +++ 2 files changed, 13 insertions(+) diff --git a/pudb/debugger.py b/pudb/debugger.py index 92979ace..cb552694 100644 --- a/pudb/debugger.py +++ b/pudb/debugger.py @@ -321,6 +321,16 @@ def get_shortened_stack(self, frame, tb): stack = stack[i:] index -= i + if CONFIG['hide_importlib_frames']: + # see Python/import.c remove_importlib_frames function for more info + hidden_filenames = [ + "", + "", + ] + pref_len = len(stack) + stack = [f for f in stack if f[0].f_code.co_filename not in hidden_filenames] + index -= pref_len - len(stack) + return stack, index def interaction(self, frame, exc_tuple=None, show_exc_dialog=True): diff --git a/pudb/settings.py b/pudb/settings.py index 81c4d5b3..c9ed7c83 100644 --- a/pudb/settings.py +++ b/pudb/settings.py @@ -84,6 +84,8 @@ def load_config(): conf_dict.setdefault("prompt_on_quit", True) + conf_dict.setdefault("hide_importlib_frames", True) + def normalize_bool_inplace(name): try: if conf_dict[name].lower() in ["0", "false", "off"]: @@ -96,6 +98,7 @@ def normalize_bool_inplace(name): normalize_bool_inplace("line_numbers") normalize_bool_inplace("wrap_variables") normalize_bool_inplace("prompt_on_quit") + normalize_bool_inplace("hide_importlib_frames") return conf_dict From 7518a93b93014cf38a2ccf68200e03ba4e4ae5de Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Fri, 14 Apr 2017 00:10:09 +0500 Subject: [PATCH 2/4] Fixed py3 behaviour when trace set via import pudb.b --- pudb/debugger.py | 71 ++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/pudb/debugger.py b/pudb/debugger.py index cb552694..172f2ef5 100644 --- a/pudb/debugger.py +++ b/pudb/debugger.py @@ -187,7 +187,7 @@ def set_continue(self): if not self.breaks: # no breakpoints; run without debugger overhead sys.settrace(None) - frame = sys._getframe().f_back + frame = sys._getframe(1) while frame: del frame.f_trace if frame is self.botframe: @@ -216,34 +216,36 @@ def set_trace(self, frame=None, as_breakpoint=None, paused=True): as_breakpoint = True if frame is None: - frame = thisframe = sys._getframe().f_back - else: - thisframe = frame + frame = sys._getframe(1) + # See pudb issue #52. If this works well enough we should upstream to # stdlib bdb.py. #self.reset() - while frame: - frame.f_trace = self.trace_dispatch - self.botframe = frame - frame = frame.f_back - - thisframe_info = ( - self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno) - if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]: - if as_breakpoint: - self.set_traces[thisframe_info] = True - if self.ui.source_code_provider is not None: - self.ui.set_source_code_provider( - self.ui.source_code_provider, force_update=True) - - if paused: - self.set_step() - else: - self.set_continue() - sys.settrace(self.trace_dispatch) - else: - return + self.botframe = frame + self.botframe.f_trace = self.trace_dispatch + while self.botframe.f_back: + self.botframe = self.botframe.f_back + self.botframe.f_trace = self.trace_dispatch + + stack, _ = self.get_stack(frame, None) + if stack: + thisframe, _ = stack[-1] + thisframe_info = ( + self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno) + + if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]: + if as_breakpoint: + self.set_traces[thisframe_info] = True + if self.ui.source_code_provider is not None: + self.ui.set_source_code_provider( + self.ui.source_code_provider, force_update=True) + + if paused: + self.set_next(thisframe) + else: + self.set_continue() + sys.settrace(self.trace_dispatch) def save_breakpoints(self): from pudb.settings import save_breakpoints @@ -313,13 +315,8 @@ def move_down_frame(self): if self.curindex < len(self.stack)-1: self.set_frame_index(self.curindex+1) - def get_shortened_stack(self, frame, tb): - stack, index = self.get_stack(frame, tb) - - for i, (s_frame, lineno) in enumerate(stack): - if s_frame is self.bottom_frame and index >= i: - stack = stack[i:] - index -= i + def get_stack(self, f, t): + stack, index = bdb.Bdb.get_stack(self, f, t) if CONFIG['hide_importlib_frames']: # see Python/import.c remove_importlib_frames function for more info @@ -333,6 +330,16 @@ def get_shortened_stack(self, frame, tb): return stack, index + def get_shortened_stack(self, frame, tb): + stack, index = self.get_stack(frame, tb) + + for i, (s_frame, lineno) in enumerate(stack): + if s_frame is self.bottom_frame and index >= i: + stack = stack[i:] + index -= i + + return stack, index + def interaction(self, frame, exc_tuple=None, show_exc_dialog=True): if exc_tuple is None: tb = None From 0971e46df17a4ac4c94032ebc91c7c4f23131af8 Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Fri, 14 Apr 2017 00:13:26 +0500 Subject: [PATCH 3/4] Better var name --- pudb/debugger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pudb/debugger.py b/pudb/debugger.py index 172f2ef5..e0ddbd54 100644 --- a/pudb/debugger.py +++ b/pudb/debugger.py @@ -324,9 +324,9 @@ def get_stack(self, f, t): "", "", ] - pref_len = len(stack) + unhidden_len = len(stack) stack = [f for f in stack if f[0].f_code.co_filename not in hidden_filenames] - index -= pref_len - len(stack) + index -= unhidden_len - len(stack) return stack, index From 87465f8ad49f33a2dc02de27744e6369d4201b2f Mon Sep 17 00:00:00 2001 From: Michael Elovskikh Date: Fri, 14 Apr 2017 01:16:58 +0500 Subject: [PATCH 4/4] Better code readability --- pudb/debugger.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/pudb/debugger.py b/pudb/debugger.py index e0ddbd54..aba12c5b 100644 --- a/pudb/debugger.py +++ b/pudb/debugger.py @@ -229,23 +229,25 @@ def set_trace(self, frame=None, as_breakpoint=None, paused=True): self.botframe.f_trace = self.trace_dispatch stack, _ = self.get_stack(frame, None) - if stack: - thisframe, _ = stack[-1] - thisframe_info = ( - self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno) - - if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]: - if as_breakpoint: - self.set_traces[thisframe_info] = True - if self.ui.source_code_provider is not None: - self.ui.set_source_code_provider( - self.ui.source_code_provider, force_update=True) - - if paused: - self.set_next(thisframe) - else: - self.set_continue() - sys.settrace(self.trace_dispatch) + if not stack: + return + + thisframe, _ = stack[-1] + thisframe_info = ( + self.canonic(thisframe.f_code.co_filename), thisframe.f_lineno) + + if thisframe_info not in self.set_traces or self.set_traces[thisframe_info]: + if as_breakpoint: + self.set_traces[thisframe_info] = True + if self.ui.source_code_provider is not None: + self.ui.set_source_code_provider( + self.ui.source_code_provider, force_update=True) + + if paused: + self.set_next(thisframe) + else: + self.set_continue() + sys.settrace(self.trace_dispatch) def save_breakpoints(self): from pudb.settings import save_breakpoints