/Python/Lib/site-packages/pythonwin/pywin/debugger/__init__.py
Python | 113 lines | 82 code | 18 blank | 13 comment | 18 complexity | 3616de95a8de799ae6e45c75ffbf982b MD5 | raw file
- import sys
-
- # Some cruft to deal with the Pythonwin GUI booting up from a non GUI app.
- def _MakeDebuggerGUI():
- app.InitInstance()
-
- isInprocApp = -1
- def _CheckNeedGUI():
- global isInprocApp
- if isInprocApp==-1:
- import win32ui
- isInprocApp = win32ui.GetApp().IsInproc()
- if isInprocApp:
- # MAY Need it - may already have one
- need = "pywin.debugger.dbgpyapp" not in sys.modules
- else:
- need = 0
- if need:
- import pywin.framework.app
- import dbgpyapp
- pywin.framework.app.CreateDefaultGUI(dbgpyapp.DebuggerPythonApp)
-
- else:
- # Check we have the appropriate editor
- # No longer necessary!
- pass
- return need
-
- # Inject some methods in the top level name-space.
- currentDebugger = None # Wipe out any old one on reload.
-
- def _GetCurrentDebugger():
- global currentDebugger
- if currentDebugger is None:
- _CheckNeedGUI()
- import debugger
- currentDebugger = debugger.Debugger()
- return currentDebugger
-
- def GetDebugger():
- # An error here is not nice - as we are probably trying to
- # break into the debugger on a Python error, any
- # error raised by this is usually silent, and causes
- # big problems later!
- try:
- rc = _GetCurrentDebugger()
- rc.GUICheckInit()
- return rc
- except:
- print "Could not create the debugger!"
- import traceback
- traceback.print_exc()
- return None
-
- def close():
- if currentDebugger is not None:
- currentDebugger.close()
-
- def run(cmd,globals=None, locals=None, start_stepping = 1):
- _GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
-
- def runeval(expression, globals=None, locals=None):
- return _GetCurrentDebugger().runeval(expression, globals, locals)
-
- def runcall(*args):
- return _GetCurrentDebugger().runcall(*args)
-
- def set_trace():
- import sys
- d = _GetCurrentDebugger()
-
- if d.frameShutdown: return # App closing
-
- if d.stopframe != d.botframe:
- # If im not "running"
- return
-
- sys.settrace(None) # May be hooked
- d.reset()
- d.set_trace()
-
- # "brk" is an alias for "set_trace" ("break" is a reserved word :-(
- brk = set_trace
-
- # Post-Mortem interface
-
- def post_mortem(t=None):
- if t is None:
- t = sys.exc_info()[2] # Will be valid if we are called from an except handler.
- if t is None:
- try:
- t = sys.last_traceback
- except AttributeError:
- print "No traceback can be found from which to perform post-mortem debugging!"
- print "No debugging can continue"
- return
- p = _GetCurrentDebugger()
- if p.frameShutdown: return # App closing
- # No idea why I need to settrace to None - it should have been reset by now?
- sys.settrace(None)
- p.reset()
- while t.tb_next != None: t = t.tb_next
- p.bAtPostMortem = 1
- p.prep_run(None)
- try:
- p.interaction(t.tb_frame, t)
- finally:
- t = None
- p.bAtPostMortem = 0
- p.done_run()
-
- def pm(t=None):
- post_mortem(t)