342 def set_trace(self, frame=None): |
342 def set_trace(self, frame=None): |
343 """ |
343 """ |
344 Public method to start debugging from 'frame'. |
344 Public method to start debugging from 'frame'. |
345 |
345 |
346 If frame is not specified, debugging starts from caller's frame. |
346 If frame is not specified, debugging starts from caller's frame. |
347 |
347 Because of jump optimizations it's not possible to use sys.breakpoint() |
348 @param frame frame to start debugging from |
348 as last instruction in a function or method. |
|
349 |
|
350 @keyparam frame frame to start debugging from |
349 @type frame object |
351 @type frame object |
350 """ |
352 """ |
351 if frame is None: |
353 if frame is None: |
352 frame = sys._getframe().f_back |
354 frame = sys._getframe().f_back # Skip set_trace method |
353 |
355 |
354 # stop at erics debugger frame |
356 frame.f_trace = self.trace_dispatch |
355 while frame: |
357 while frame is not None: |
356 if not self.__skipFrame(frame): |
358 # stop at erics debugger frame |
|
359 if frame.f_back.f_code == self._dbgClient.handleLine.func_code: |
357 frame.f_trace = self.trace_dispatch |
360 frame.f_trace = self.trace_dispatch |
|
361 self.botframe = frame |
|
362 self._dbgClient.mainFrame = frame |
|
363 break |
|
364 |
358 frame = frame.f_back |
365 frame = frame.f_back |
359 self.botframe = frame |
366 |
360 if self.__skipFrame(frame): |
367 self.stop_everywhere = True |
361 break |
|
362 |
|
363 self.set_step() |
|
364 sys.settrace(self.trace_dispatch) |
368 sys.settrace(self.trace_dispatch) |
365 sys.setprofile(self._dbgClient.callTraceEnabled) |
369 sys.setprofile(self._dbgClient.callTraceEnabled) |
366 |
370 |
367 def run(self, cmd, globals=None, locals=None): |
371 def run(self, cmd, globals=None, locals=None): |
368 """ |
372 """ |