X-Git-Url: https://code.delx.au/bg-scripts/blobdiff_plain/b90108b29cbac4325a1927069ef13ca475cd61eb..437cc3ef42a0038caa22c4676c4e25831697f258:/lib/GregDebug.py diff --git a/lib/GregDebug.py b/lib/GregDebug.py new file mode 100644 index 0000000..c431317 --- /dev/null +++ b/lib/GregDebug.py @@ -0,0 +1,70 @@ +#! python + +import sys +import cgitb +import inspect + +DEBUG_INCREMENT = 5 +DEBUG_LEVEL_DEBUG = DEBUG_INCREMENT * -2 +DEBUG_LEVEL_LOW = DEBUG_INCREMENT * -1 +DEBUG_LEVEL_MEDIUM = DEBUG_INCREMENT * 0 +DEBUG_LEVEL_HIGH = DEBUG_INCREMENT * 1 +DEBUG_LEVEL = DEBUG_LEVEL_MEDIUM + +__stackTraceEnabled = True + +def stackTraceEnabled(value): + global __stackTraceEnabled + __stackTraceEnabled = value + +def setDebugLevel(level): + global DEBUG_LEVEL + DEBUG_LEVEL = level + +def isBoundMethod(stackFrame): + """Checks to see if the method that is running in the specified stackFrame is +a bound method. +Returns a 2-tuple containing if it is a bound method, and the object that it is +bound to if it is bound.""" + def errout(): + return (False, None) + + if stackFrame.f_code.co_argcount < 1: + return errout() + firstVarName = stackFrame.f_code.co_varnames[0] + firstVar = stackFrame.f_locals[firstVarName] + if not hasattr(firstVar, stackFrame.f_code.co_name): + return errout() + if not hasattr(getattr(firstVar, stackFrame.f_code.co_name), 'func_code'): + return errout() + if getattr(getattr(firstVar, stackFrame.f_code.co_name), 'func_code') == stackFrame.f_code: + return (True, firstVar) + else: + return errout() + +def createStackTrace(stackList): + if not __stackTraceEnabled: + return '' + strStackList = [] + for stackItem in stackList: + stackItemRepr = "" + bm = isBoundMethod(stackItem[0]) # stackframe + if bm[0]: + stackItemRepr = '%s.' % bm[1].__class__.__name__ + stackItemRepr += stackItem[3] # Function Name + del bm # Help remove circular dependencies (reduces memory useage) + strStackList.append(stackItemRepr) + + return '=>'.join(strStackList) + +def debug(message, level=DEBUG_LEVEL_MEDIUM, indent_level = None): + if level >= DEBUG_LEVEL: + stack = inspect.stack()[1:-1] # Ignore this method + stack.reverse() + if indent_level == None: + indent_level = len(stack) + for line in message.split('\n'): + print >>sys.stderr, '%s %s [%s]' %('>' * indent_level, line, createStackTrace(stack)) + +def tracebackHook(etype, evalue, etb): + print cgitb.text( (etype, evalue, etb), context = 5)