360 def set_trace(self, frame=None): |
360 def set_trace(self, frame=None): |
361 """ |
361 """ |
362 Public method to start debugging from 'frame'. |
362 Public method to start debugging from 'frame'. |
363 |
363 |
364 If frame is not specified, debugging starts from caller's frame. |
364 If frame is not specified, debugging starts from caller's frame. |
365 |
365 Because of jump optimizations it's not possible to use sys.breakpoint() |
366 @param frame frame to start debugging from |
366 as last instruction in a function or method. |
|
367 |
|
368 @keyparam frame frame to start debugging from |
367 @type frame object |
369 @type frame object |
368 """ |
370 """ |
369 if frame is None: |
371 if frame is None: |
370 frame = sys._getframe().f_back |
372 frame = sys._getframe().f_back # Skip set_trace method |
371 |
373 |
372 # stop at erics debugger frame |
374 frame.f_trace = self.trace_dispatch |
373 while frame: |
375 while frame is not None: |
374 if not self.__skipFrame(frame): |
376 # stop at erics debugger frame |
|
377 if frame.f_back.f_code == self._dbgClient.handleLine.__code__: |
375 frame.f_trace = self.trace_dispatch |
378 frame.f_trace = self.trace_dispatch |
|
379 self.botframe = frame |
|
380 self._dbgClient.mainFrame = frame |
|
381 break |
|
382 |
376 frame = frame.f_back |
383 frame = frame.f_back |
377 self.botframe = frame |
384 |
378 if self.__skipFrame(frame): |
385 self.stop_everywhere = True |
379 break |
|
380 |
|
381 self.set_step() |
|
382 sys.settrace(self.trace_dispatch) |
386 sys.settrace(self.trace_dispatch) |
383 sys.setprofile(self._dbgClient.callTraceEnabled) |
387 sys.setprofile(self._dbgClient.callTraceEnabled) |
384 |
388 |
385 def run(self, cmd, globals=None, locals=None): |
389 def run(self, cmd, globals=None, locals=None): |
386 """ |
390 """ |