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 |