DebugClients/Python3/DebugBase.py

changeset 2170
f4e0f6133ace
parent 2166
15b4e58d61d7
child 2302
f29e9405c851
equal deleted inserted replaced
2169:a890aab08ae4 2170:f4e0f6133ace
12 import os 12 import os
13 import atexit 13 import atexit
14 import inspect 14 import inspect
15 15
16 from DebugProtocol import ResponseClearWatch, ResponseClearBreak, ResponseLine, \ 16 from DebugProtocol import ResponseClearWatch, ResponseClearBreak, ResponseLine, \
17 ResponseSyntax, ResponseException 17 ResponseSyntax, ResponseException, CallTrace
18 18
19 gRecursionLimit = 64 19 gRecursionLimit = 64
20 20
21 21
22 def printerr(s): 22 def printerr(s):
151 @param arg The arguments 151 @param arg The arguments
152 """ 152 """
153 if event == 'return': 153 if event == 'return':
154 self.cFrame = frame.f_back 154 self.cFrame = frame.f_back
155 self.__recursionDepth -= 1 155 self.__recursionDepth -= 1
156 self.__sendCallTrace(event, frame, self.cFrame)
156 elif event == 'call': 157 elif event == 'call':
158 self.__sendCallTrace(event, self.cFrame, frame)
157 self.cFrame = frame 159 self.cFrame = frame
158 self.__recursionDepth += 1 160 self.__recursionDepth += 1
159 if self.__recursionDepth > gRecursionLimit: 161 if self.__recursionDepth > gRecursionLimit:
160 raise RuntimeError('maximum recursion depth exceeded\n' 162 raise RuntimeError('maximum recursion depth exceeded\n'
161 '(offending frame is two down the stack)') 163 '(offending frame is two down the stack)')
164
165 def __sendCallTrace(self, event, fromFrame, toFrame):
166 """
167 Private method to send a call/return trace.
168
169 @param event trace event (string)
170 @param fromFrame originating frame (frame)
171 @param toFrame destination frame (frame)
172 """
173 if self._dbgClient.callTraceEnabled:
174 if not self.__skip_it(fromFrame) and not self.__skip_it(toFrame):
175 if event in ["call", "return"]:
176 fr = fromFrame
177 fromStr = "{0}:{1}:{2}".format(
178 self._dbgClient.absPath(self.fix_frame_filename(fr)),
179 fr.f_lineno,
180 fr.f_code.co_name)
181 fr = toFrame
182 toStr = "{0}:{1}:{2}".format(
183 self._dbgClient.absPath(self.fix_frame_filename(fr)),
184 fr.f_lineno,
185 fr.f_code.co_name)
186 self._dbgClient.write("{0}{1}@@{2}@@{3}\n".format(
187 CallTrace, event[0], fromStr, toStr))
162 188
163 def trace_dispatch(self, frame, event, arg): 189 def trace_dispatch(self, frame, event, arg):
164 """ 190 """
165 Reimplemented from bdb.py to do some special things. 191 Reimplemented from bdb.py to do some special things.
166 192
716 debugger that are called from the application being debugged. 742 debugger that are called from the application being debugged.
717 743
718 @param frame the frame object 744 @param frame the frame object
719 @return flag indicating whether the debugger should skip this frame 745 @return flag indicating whether the debugger should skip this frame
720 """ 746 """
747 if frame is None:
748 return True
749
721 fn = self.fix_frame_filename(frame) 750 fn = self.fix_frame_filename(frame)
722 751
723 # Eliminate things like <string> and <stdin>. 752 # Eliminate things like <string> and <stdin>.
724 if fn[0] == '<': 753 if fn[0] == '<':
725 return 1 754 return 1

eric ide

mercurial