Don't track the recursion limit by hand. debugger speed

Wed, 20 Jul 2016 22:14:24 +0200

author
T.Rzepka <Tobias.Rzepka@gmail.com>
date
Wed, 20 Jul 2016 22:14:24 +0200
branch
debugger speed
changeset 5046
d57f18f15f1a
parent 5045
50862a6a2c63
child 5048
9899fb545b1f

Don't track the recursion limit by hand.

DebugClients/Python/DebugBase.py file | annotate | diff | comparison | revisions
DebugClients/Python/DebugClientBase.py file | annotate | diff | comparison | revisions
DebugClients/Python3/DebugBase.py file | annotate | diff | comparison | revisions
DebugClients/Python3/DebugClientBase.py file | annotate | diff | comparison | revisions
--- 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

eric ide

mercurial