188 self.__recursionDepth = 0 |
188 self.__recursionDepth = 0 |
189 while frame is not None: |
189 while frame is not None: |
190 self.__recursionDepth += 1 |
190 self.__recursionDepth += 1 |
191 frame = frame.f_back |
191 frame = frame.f_back |
192 |
192 |
193 def profile(self, frame, event, arg): |
193 def profileWithRecursion(self, frame, event, arg): |
194 """ |
194 """ |
195 Public method used to trace some stuff independent of the debugger |
195 Public method used to trace some stuff independent of the debugger |
196 trace function. |
196 trace function. |
197 |
197 |
198 @param frame current stack frame. |
198 @param frame current stack frame |
199 @param event trace event (string) |
199 @type frame object |
|
200 @param event trace event |
|
201 @type str |
200 @param arg arguments |
202 @param arg arguments |
|
203 @type depends on the previous event parameter |
201 @exception RuntimeError raised to indicate too many recursions |
204 @exception RuntimeError raised to indicate too many recursions |
202 """ |
205 """ |
203 if event == 'return': |
206 if event == 'return': |
204 self.cFrame = frame.f_back |
207 self.cFrame = frame.f_back |
205 self.__recursionDepth -= 1 |
208 self.__recursionDepth -= 1 |
206 self.__sendCallTrace(event, frame, self.cFrame) |
209 if self._dbgClient.callTraceEnabled: |
|
210 self.__sendCallTrace(event, frame, self.cFrame) |
207 elif event == 'call': |
211 elif event == 'call': |
208 self.__sendCallTrace(event, self.cFrame, frame) |
212 if self._dbgClient.callTraceEnabled: |
|
213 self.__sendCallTrace(event, self.cFrame, frame) |
209 self.cFrame = frame |
214 self.cFrame = frame |
210 self.__recursionDepth += 1 |
215 self.__recursionDepth += 1 |
211 if self.__recursionDepth > gRecursionLimit: |
216 if self.__recursionDepth > gRecursionLimit: |
212 raise RuntimeError( |
217 raise RuntimeError( |
213 'maximum recursion depth exceeded\n' |
218 'maximum recursion depth exceeded\n' |
214 '(offending frame is two down the stack)') |
219 '(offending frame is two down the stack)') |
215 |
220 |
|
221 def profile(self, frame, event, arg): |
|
222 """ |
|
223 Public method used to trace some stuff independent of the debugger |
|
224 trace function. |
|
225 |
|
226 @param frame current stack frame |
|
227 @type frame object |
|
228 @param event trace event |
|
229 @type str |
|
230 @param arg arguments |
|
231 @type depends on the previous event parameter |
|
232 """ |
|
233 if event == 'return': |
|
234 self.__sendCallTrace(event, frame, frame.f_back) |
|
235 elif event == 'call': |
|
236 self.__sendCallTrace(event, frame.f_back, frame) |
|
237 |
216 def __sendCallTrace(self, event, fromFrame, toFrame): |
238 def __sendCallTrace(self, event, fromFrame, toFrame): |
217 """ |
239 """ |
218 Private method to send a call/return trace. |
240 Private method to send a call/return trace. |
219 |
241 |
220 @param event trace event (string) |
242 @param event trace event |
221 @param fromFrame originating frame (frame) |
243 @type str |
222 @param toFrame destination frame (frame) |
244 @param fromFrame originating frame |
223 """ |
245 @type frame object |
224 if self._dbgClient.callTraceEnabled: |
246 @param toFrame destination frame |
225 if (not self.__skipFrame(fromFrame) and |
247 @type frame object |
226 not self.__skipFrame(toFrame)): |
248 """ |
227 if event in ["call", "return"]: |
249 if not self.__skipFrame(fromFrame) and not self.__skipFrame(toFrame): |
228 fr = fromFrame |
250 fromStr = "{0}:{1}:{2}".format( |
229 fromStr = "{0}:{1}:{2}".format( |
251 self._dbgClient.absPath(self.fix_frame_filename(fromFrame)), |
230 self._dbgClient.absPath(self.fix_frame_filename(fr)), |
252 fromFrame.f_lineno, |
231 fr.f_lineno, |
253 fromFrame.f_code.co_name) |
232 fr.f_code.co_name) |
254 toStr = "{0}:{1}:{2}".format( |
233 fr = toFrame |
255 self._dbgClient.absPath(self.fix_frame_filename(toFrame)), |
234 toStr = "{0}:{1}:{2}".format( |
256 toFrame.f_lineno, |
235 self._dbgClient.absPath(self.fix_frame_filename(fr)), |
257 toFrame.f_code.co_name) |
236 fr.f_lineno, |
258 self._dbgClient.write("{0}{1}@@{2}@@{3}\n".format( |
237 fr.f_code.co_name) |
259 CallTrace, event[0], fromStr, toStr)) |
238 self._dbgClient.write("{0}{1}@@{2}@@{3}\n".format( |
|
239 CallTrace, event[0], fromStr, toStr)) |
|
240 |
260 |
241 def trace_dispatch(self, frame, event, arg): |
261 def trace_dispatch(self, frame, event, arg): |
242 """ |
262 """ |
243 Public method reimplemented from bdb.py to do some special things. |
263 Public method reimplemented from bdb.py to do some special things. |
244 |
264 |