123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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)
|