Wed, 20 Jul 2016 22:14:24 +0200
Don't track the recursion limit by hand.
--- a/DebugClients/Python/DebugBase.py Tue Jul 19 22:20:51 2016 +0200 +++ b/DebugClients/Python/DebugBase.py Wed Jul 20 22:14:24 2016 +0200 @@ -189,22 +189,27 @@ self.__recursionDepth += 1 frame = frame.f_back - def profile(self, frame, event, arg): + def profileWithRecursion(self, frame, event, arg): """ Public method used to trace some stuff independent of the debugger trace function. - @param frame current stack frame. - @param event trace event (string) + @param frame current stack frame + @type frame object + @param event trace event + @type str @param arg arguments + @type depends on the previous event parameter @exception RuntimeError raised to indicate too many recursions """ if event == 'return': self.cFrame = frame.f_back self.__recursionDepth -= 1 - self.__sendCallTrace(event, frame, self.cFrame) + if self._dbgClient.callTraceEnabled: + self.__sendCallTrace(event, frame, self.cFrame) elif event == 'call': - self.__sendCallTrace(event, self.cFrame, frame) + if self._dbgClient.callTraceEnabled: + self.__sendCallTrace(event, self.cFrame, frame) self.cFrame = frame self.__recursionDepth += 1 if self.__recursionDepth > gRecursionLimit: @@ -212,30 +217,45 @@ 'maximum recursion depth exceeded\n' '(offending frame is two down the stack)') + def profile(self, frame, event, arg): + """ + Public method used to trace some stuff independent of the debugger + trace function. + + @param frame current stack frame + @type frame object + @param event trace event + @type str + @param arg arguments + @type depends on the previous event parameter + """ + if event == 'return': + self.__sendCallTrace(event, frame, frame.f_back) + elif event == 'call': + self.__sendCallTrace(event, frame.f_back, frame) + def __sendCallTrace(self, event, fromFrame, toFrame): """ Private method to send a call/return trace. - @param event trace event (string) - @param fromFrame originating frame (frame) - @param toFrame destination frame (frame) + @param event trace event + @type str + @param fromFrame originating frame + @type frame object + @param toFrame destination frame + @type frame object """ - if self._dbgClient.callTraceEnabled: - if (not self.__skipFrame(fromFrame) and - not self.__skipFrame(toFrame)): - if event in ["call", "return"]: - fr = fromFrame - fromStr = "%s:%s:%s" % ( - self._dbgClient.absPath(self.fix_frame_filename(fr)), - fr.f_lineno, - fr.f_code.co_name) - fr = toFrame - toStr = "%s:%s:%s" % ( - self._dbgClient.absPath(self.fix_frame_filename(fr)), - fr.f_lineno, - fr.f_code.co_name) - self._dbgClient.write("%s%s@@%s@@%s\n" % ( - CallTrace, event[0], fromStr, toStr)) + if not self.__skipFrame(fromFrame) and not self.__skipFrame(toFrame): + fromStr = "%s:%s:%s" % ( + self._dbgClient.absPath(self.fix_frame_filename(fromFrame)), + fromFrame.f_lineno, + fromFrame.f_code.co_name) + toStr = "%s:%s:%s" % ( + self._dbgClient.absPath(self.fix_frame_filename(toFrame)), + toFrame.f_lineno, + toFrame.f_code.co_name) + self._dbgClient.write("%s%s@@%s@@%s\n" % ( + CallTrace, event[0], fromStr, toStr)) def trace_dispatch(self, frame, event, arg): """
--- a/DebugClients/Python/DebugClientBase.py Tue Jul 19 22:20:51 2016 +0200 +++ b/DebugClients/Python/DebugClientBase.py Wed Jul 20 22:14:24 2016 +0200 @@ -222,7 +222,6 @@ self.passive = 0 # used to indicate the passive mode self.running = None self.test = None - self.tracePython = 0 self.debugging = 0 self.fork_auto = False @@ -233,8 +232,8 @@ self.errorstream = None self.pollingDisabled = False - self.callTraceEnabled = False - self.__newCallTraceEnabled = False + self.callTraceEnabled = None + self.__newCallTraceEnabled = None self.skipdirs = sys.path[:] @@ -302,8 +301,7 @@ @param mainThread non-zero, if we are attaching to the already started mainthread of the app """ - if self.debugging: - sys.setprofile(self.profile) + pass def __dumpThreadList(self): """ @@ -473,14 +471,15 @@ if cmd == DebugProtocol.RequestCallTrace: if arg.strip().lower() == "on": - callTraceEnabled = True + callTraceEnabled = self.profile else: - callTraceEnabled = False + callTraceEnabled = None if self.debugging: - self.callTraceEnabled = callTraceEnabled + sys.setprofile(callTraceEnabled) else: + # remember for later self.__newCallTraceEnabled = callTraceEnabled - # remember for later + return if cmd == DebugProtocol.RequestEnv: @@ -536,7 +535,7 @@ # as a normal str. self.debugMod.__dict__['__file__'] = self.running sys.modules['__main__'] = self.debugMod - self.callTraceEnabled = self.__newCallTraceEnabled + sys.setprofile(self.__newCallTraceEnabled) res = self.mainThread.run( 'execfile(' + repr(self.running) + ')', self.debugMod.__dict__)
--- a/DebugClients/Python3/DebugBase.py Tue Jul 19 22:20:51 2016 +0200 +++ b/DebugClients/Python3/DebugBase.py Wed Jul 20 22:14:24 2016 +0200 @@ -190,22 +190,27 @@ self.__recursionDepth += 1 frame = frame.f_back - def profile(self, frame, event, arg): + def profileWithRecursion(self, frame, event, arg): """ Public method used to trace some stuff independent of the debugger trace function. - @param frame current stack frame. - @param event trace event (string) + @param frame current stack frame + @type frame object + @param event trace event + @type str @param arg arguments + @type depends on the previous event parameter @exception RuntimeError raised to indicate too many recursions """ if event == 'return': self.cFrame = frame.f_back self.__recursionDepth -= 1 - self.__sendCallTrace(event, frame, self.cFrame) + if self._dbgClient.callTraceEnabled: + self.__sendCallTrace(event, frame, self.cFrame) elif event == 'call': - self.__sendCallTrace(event, self.cFrame, frame) + if self._dbgClient.callTraceEnabled: + self.__sendCallTrace(event, self.cFrame, frame) self.cFrame = frame self.__recursionDepth += 1 if self.__recursionDepth > gRecursionLimit: @@ -213,30 +218,45 @@ 'maximum recursion depth exceeded\n' '(offending frame is two down the stack)') + def profile(self, frame, event, arg): + """ + Public method used to trace some stuff independent of the debugger + trace function. + + @param frame current stack frame + @type frame object + @param event trace event + @type str + @param arg arguments + @type depends on the previous event parameter + """ + if event == 'return': + self.__sendCallTrace(event, frame, frame.f_back) + elif event == 'call': + self.__sendCallTrace(event, frame.f_back, frame) + def __sendCallTrace(self, event, fromFrame, toFrame): """ Private method to send a call/return trace. - @param event trace event (string) - @param fromFrame originating frame (frame) - @param toFrame destination frame (frame) + @param event trace event + @type str + @param fromFrame originating frame + @type frame object + @param toFrame destination frame + @type frame object """ - if self._dbgClient.callTraceEnabled: - if (not self.__skipFrame(fromFrame) and - not self.__skipFrame(toFrame)): - if event in ["call", "return"]: - fr = fromFrame - fromStr = "{0}:{1}:{2}".format( - self._dbgClient.absPath(self.fix_frame_filename(fr)), - fr.f_lineno, - fr.f_code.co_name) - fr = toFrame - toStr = "{0}:{1}:{2}".format( - self._dbgClient.absPath(self.fix_frame_filename(fr)), - fr.f_lineno, - fr.f_code.co_name) - self._dbgClient.write("{0}{1}@@{2}@@{3}\n".format( - CallTrace, event[0], fromStr, toStr)) + if not self.__skipFrame(fromFrame) and not self.__skipFrame(toFrame): + fromStr = "{0}:{1}:{2}".format( + self._dbgClient.absPath(self.fix_frame_filename(fromFrame)), + fromFrame.f_lineno, + fromFrame.f_code.co_name) + toStr = "{0}:{1}:{2}".format( + self._dbgClient.absPath(self.fix_frame_filename(toFrame)), + toFrame.f_lineno, + toFrame.f_code.co_name) + self._dbgClient.write("{0}{1}@@{2}@@{3}\n".format( + CallTrace, event[0], fromStr, toStr)) def trace_dispatch(self, frame, event, arg): """
--- a/DebugClients/Python3/DebugClientBase.py Tue Jul 19 22:20:51 2016 +0200 +++ b/DebugClients/Python3/DebugClientBase.py Wed Jul 20 22:14:24 2016 +0200 @@ -196,7 +196,6 @@ self.passive = False # used to indicate the passive mode self.running = None self.test = None - self.tracePython = False self.debugging = False self.fork_auto = False @@ -207,8 +206,8 @@ self.errorstream = None self.pollingDisabled = False - self.callTraceEnabled = False - self.__newCallTraceEnabled = False + self.callTraceEnabled = None + self.__newCallTraceEnabled = None self.skipdirs = sys.path[:] @@ -274,8 +273,7 @@ @param mainThread True, if we are attaching to the already started mainthread of the app """ - if self.debugging: - sys.setprofile(self.profile) + pass def __dumpThreadList(self): """ @@ -467,14 +465,15 @@ if cmd == DebugProtocol.RequestCallTrace: if arg.strip().lower() == "on": - callTraceEnabled = True + callTraceEnabled = self.profile else: - callTraceEnabled = False + callTraceEnabled = None if self.debugging: - self.callTraceEnabled = callTraceEnabled + sys.setprofile(callTraceEnabled) else: + # remember for later self.__newCallTraceEnabled = callTraceEnabled - # remember for later + return if cmd == DebugProtocol.RequestEnv: @@ -531,7 +530,7 @@ sys.modules['__main__'] = self.debugMod code = self.__compileFileSource(self.running) if code: - self.callTraceEnabled = self.__newCallTraceEnabled + sys.setprofile(self.__newCallTraceEnabled) res = self.mainThread.run(code, self.debugMod.__dict__) self.progTerminated(res) return