Spaces:
Paused
Paused
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.framework.app" not in sys.modules | |
else: | |
need = 0 | |
if need: | |
import pywin.framework.app | |
from . 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() | |
from . 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) | |