6
from twisted.application import service
7
from twisted.python import reflect, log
9
class CannotFindFunction(ValueError):
19
sys.settrace(self.trace)
20
threading.settrace(self.trace)
23
self.installed = False
25
threading.setttrace(None)
33
def trace(self, frame, event, arg):
34
r = getattr(self, 'trace_' + event.upper())(frame, arg)
42
def trace_CALL(self, frame, arg):
45
def trace_LINE(self, frame, arg):
48
def trace_RETURN(self, frame, arg):
51
def trace_EXCEPTION(self, frame, arg):
55
def extractArgs(frame):
59
if co.co_flags & 4: n = n+1
60
if co.co_flags & 8: n = n+1
63
name = co.co_varnames[i]
64
result[name] = dict.get(name, "*** undefined ***")
69
return ', '.join(['='.join((k, reflect.safe_repr(v))) for (k, v) in args.iteritems()])
75
def trace_CALL(self, frame, arg):
78
frameSelf = frame.f_locals.get('self')
79
if frameSelf is not None:
80
if hasattr(frameSelf, '__class__'):
81
k = reflect.qual(frameSelf.__class__)
83
k = reflect.qual(type(frameSelf))
88
print ("%X %s%s%s(%s)" % (
89
id(threading.currentThread()),
93
formatArgs(extractArgs(frame))))
95
def trace_RETURN(self, frame, arg):
97
print ("%X %s<= %s" % (
98
id(threading.currentThread()),
100
reflect.safe_repr(arg),))
101
self.callDepth = max(0, self.callDepth - 1)
103
def trace_EXCEPTION(self, frame, arg):
104
print ("%X %s^- %s" % (
105
id(threading.currentThread()),
106
self.callDepth * ' ',
107
reflect.safe_repr(arg),))
108
self.callDepth = max(0, self.callDepth - 1)
111
class SignalService(service.Service):
112
def __init__(self, sigmap):
115
def startService(self):
116
service.Service.startService(self)
118
for sig, handler in self.sigmap.items():
119
self.oldsigmap[sig] = signal.signal(sig, handler)
121
def stopService(self):
122
for sig, handler in self.oldsigmap.items():
123
signal.signal(sig, handler)
125
service.Service.stopService(self)