--- a/DebugClients/Python3/DebugBase.py Mon Aug 08 22:50:36 2016 +0200 +++ b/DebugClients/Python3/DebugBase.py Mon Aug 08 22:51:36 2016 +0200 @@ -4,11 +4,10 @@ # """ -Module implementing the debug base class. +Module implementing the debug base class which based originally on bdb. """ import sys -import bdb import os import atexit import inspect @@ -45,18 +44,17 @@ gRecursionLimit = limit -class DebugBase(bdb.Bdb): +class DebugBase(object): """ Class implementing base class of the debugger. - Provides simple wrapper methods around bdb for the 'owning' client to - call to step etc. + Provides methods for the 'owning' client to call to step etc. """ # Don't thrust distutils.sysconfig.get_python_lib: possible case mismatch # on Windows - lib = os.path.dirname(bdb.__file__) + lib = os.path.dirname(inspect.__file__) # tuple required because it's accessed a lot of times by startswith method - pathsToSkip = ('<', os.path.dirname(__file__), bdb.__file__[:-1]) + pathsToSkip = ('<', os.path.dirname(__file__), inspect.__file__[:-1]) filesToSkip = {} # cache for fixed file names @@ -68,8 +66,6 @@ @param dbgClient the owning client """ - bdb.Bdb.__init__(self) - self._dbgClient = dbgClient self._mainThread = True self.quitting = 0 @@ -98,9 +94,6 @@ # if hasattr(sys, 'breakpoint): sys.breakpoint() sys.breakpoint = self.set_trace - # initialize parent - bdb.Bdb.reset(self) - self.__recursionDepth = -1 self.setRecursionDepth(inspect.currentframe()) @@ -452,15 +445,38 @@ self._set_stopinfo(None, None) self.stop_everywhere = True + def set_next(self, frame): + """ + Public method to stop on the next line in or below the given frame. + + @param frame the frame object + @type frame object + """ + self._set_stopinfo(frame, frame.f_back) + frame.f_back.f_trace = self.trace_dispatch + frame.f_trace = self.trace_dispatch + + def set_return(self, frame): + """ + Public method to stop when returning from the given frame. + + @param frame the frame object + @type frame object + """ + self._set_stopinfo(None, frame.f_back) + def set_quit(self): """ Public method to quit. - It wraps call to bdb to clear the current frame properly. + Disables the trace functions and resets all frame pointer. """ self.currentFrame = None sys.setprofile(None) - bdb.Bdb.set_quit(self) + sys.settrace(None) + self.stopframe = None + self.returnframe = None + self.quitting = 1 def fix_frame_filename(self, frame): """ @@ -796,8 +812,7 @@ for fr in frlist[self.skipFrames:]: filename = self._dbgClient.absPath(self.fix_frame_filename(fr)) - if os.path.basename(filename).startswith("DebugClient") or \ - os.path.basename(filename) == "bdb.py": + if os.path.basename(filename).startswith("DebugClientBase"): break linenr = fr.f_lineno