91 # frames, where we want to stop or release debugger |
91 # frames, where we want to stop or release debugger |
92 self.botframe = None |
92 self.botframe = None |
93 self.stopframe = None |
93 self.stopframe = None |
94 self.returnframe = None |
94 self.returnframe = None |
95 self.stop_everywhere = False |
95 self.stop_everywhere = False |
96 |
|
97 # provide a hook to perform a hard breakpoint |
|
98 # Use it like this: |
|
99 # if hasattr(sys, 'breakpoint): sys.breakpoint() |
|
100 sys.breakpoint = self.set_trace |
|
101 |
96 |
102 self.__recursionDepth = -1 |
97 self.__recursionDepth = -1 |
103 self.setRecursionDepth(inspect.currentframe()) |
98 self.setRecursionDepth(inspect.currentframe()) |
104 |
99 |
105 # background task to periodicaly check for client interactions |
100 # background task to periodicaly check for client interactions |
397 |
392 |
398 self.stop_everywhere = True |
393 self.stop_everywhere = True |
399 sys.settrace(self.trace_dispatch) |
394 sys.settrace(self.trace_dispatch) |
400 sys.setprofile(self._dbgClient.callTraceEnabled) |
395 sys.setprofile(self._dbgClient.callTraceEnabled) |
401 |
396 |
|
397 def bootstrap(self): |
|
398 """ |
|
399 Public method to bootstrap the thread. |
|
400 |
|
401 It wraps the call to the user function to enable tracing |
|
402 before hand. |
|
403 """ |
|
404 try: |
|
405 self._threadRunning = True |
|
406 self.traceThread() |
|
407 self._target(*self._args, **self._kwargs) |
|
408 except SystemExit: |
|
409 pass |
|
410 finally: |
|
411 self._threadRunning = False |
|
412 self.quitting = True |
|
413 self._dbgClient.threadTerminated(self) |
|
414 sys.settrace(None) |
|
415 sys.setprofile(None) |
|
416 |
402 def run(self, cmd, globals=None, locals=None): |
417 def run(self, cmd, globals=None, locals=None): |
403 """ |
418 """ |
404 Public method to start a given command under debugger control. |
419 Public method to start a given command under debugger control. |
405 |
420 |
406 @param cmd command / code to execute under debugger control |
421 @param cmd command / code to execute under debugger control |
666 |
681 |
667 fname = self._dbgClient.absPath(self.fix_frame_filename(fr)) |
682 fname = self._dbgClient.absPath(self.fix_frame_filename(fr)) |
668 # Always show at least one stack frame, even if it's from eric. |
683 # Always show at least one stack frame, even if it's from eric. |
669 if stack and os.path.basename(fname).startswith( |
684 if stack and os.path.basename(fname).startswith( |
670 ("DebugBase.py", "DebugClientBase.py", |
685 ("DebugBase.py", "DebugClientBase.py", |
671 "ThreadExtension.py", "threading.py")): |
686 "ThreadExtension.py", "threading.py")): |
672 break |
687 break |
673 |
688 |
674 fline = fr.f_lineno |
689 fline = fr.f_lineno |
675 ffunc = fr.f_code.co_name |
690 ffunc = fr.f_code.co_name |
676 |
691 |