3
from collections import OrderedDict
6
def __init__(self,traceback):
10
return FrameFancy(self.t.tb_frame)
12
def getLineNumber(self):
13
return self.t.tb_lineno if self.t != None else None
16
return TracebackFancy(self.t.tb_next)
21
str_self = "%s @ %s" % (self.getFrame().getName(), self.getLineNumber())
22
return str_self + "\n" + self.getNext().__str__()
25
def __init__(self,frame):
26
self.etraceback = frame.f_exc_traceback
27
self.etype = frame.exc_type
28
self.evalue = frame.f_exc_value
30
def __init__(self,tb,ty,va):
35
def getTraceback(self):
36
return TracebackFancy(self.etraceback)
38
def __nonzero__(self):
39
return self.etraceback != None or self.etype != None or self.evalue != None
42
return str(self.etype)
48
def __init__(self,code):
51
def getArgCount(self):
52
return self.c.co_argcount if self.c != None else 0
54
def getFilename(self):
55
return self.c.co_filename if self.c != None else ""
57
def getVariables(self):
58
return self.c.co_varnames if self.c != None else []
61
return self.c.co_name if self.c != None else ""
63
def getFileName(self):
64
return self.c.co_filename if self.c != None else ""
67
def __init__(self,frame,arginfo):
72
args, varargs, kwargs = self.getArgs(), self.getVarArgs(), self.getKWArgs()
77
ret = ret + ("%s = %s" % (arg, args[arg]))
84
ret = ret + "varargs are " + str(varargs)
88
ret = ret + "kwargs are " + str(kwargs)
91
def getNumArgs(wantVarargs = False, wantKWArgs=False):
92
args, varargs, keywords, values = self.a
94
if varargs and wantVarargs:
95
size = size+len(self.getVarArgs())
96
if keywords and wantKWArgs:
97
size = size+len(self.getKWArgs())
101
args, _, _, values = self.a
102
argWValues = OrderedDict()
104
argWValues[arg] = values[arg]
107
def getVarArgs(self):
108
_, vargs, _, _ = self.a
110
return self.f.f_locals[vargs]
114
_, _, kwargs, _ = self.a
116
return self.f.f_locals[kwargs]
120
def __init__(self,frame):
124
return FrameFancy(self.f.f_back)
126
def getLineNumber(self):
127
return self.f.f_lineno if self.f != None else 0
129
def getCodeInformation(self):
130
return CodeFancy(self.f.f_code) if self.f != None else None
132
def getExceptionInfo(self):
133
return ExceptionFancy(self.f) if self.f != None else None
136
return self.getCodeInformation().getName() if self.f != None else ""
138
def getFileName(self):
139
return self.getCodeInformation().getFileName() if self.f != None else ""
142
return self.f.f_locals if self.f != None else {}
144
def getArgumentInfo(self):
145
return ArgsFancy(self.f,inspect.getargvalues(self.f)) if self.f != None else None
148
def callEvent(self,frame):
151
def lineEvent(self,frame):
154
def returnEvent(self,frame,retval):
157
def exceptionEvent(self,frame,exception,value,traceback):
160
def cCallEvent(self,frame,cfunct):
163
def cReturnEvent(self,frame,cfunct):
166
def cExceptionEvent(self,frame,cfunct):
169
tracer_impl = TracerClass()
172
def the_tracer_entrypoint(frame,event,args):
173
if tracer_impl == None:
176
call_retval = tracer_impl.callEvent(FrameFancy(frame))
177
if call_retval == False:
179
return the_tracer_entrypoint
180
elif event == "line":
181
line_retval = tracer_impl.lineEvent(FrameFancy(frame))
182
if line_retval == False:
184
return the_tracer_entrypoint
185
elif event == "return":
186
tracer_impl.returnEvent(FrameFancy(frame),args)
187
elif event == "exception":
188
exty,exva,extb = args
189
exception_retval = tracer_impl.exceptionEvent(FrameFancy(frame),ExceptionFancy(extb,exty,exva))
190
if exception_retval == False:
192
return the_tracer_entrypoint
193
elif event == "c_call":
194
tracer_impl.cCallEvent(FrameFancy(frame),args)
195
elif event == "c_return":
196
tracer_impl.cReturnEvent(FrameFancy(frame),args)
197
elif event == "c_exception":
198
tracer_impl.cExceptionEvent(FrameFancy(frame),args)
205
sys.settrace(the_tracer_entrypoint)
211
def callEvent(self,frame):
212
print "call " + frame.getName() + " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo())
214
def lineEvent(self,frame):
215
print "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are " + str(frame.getLocals()) + " in " + frame.getFileName()
217
def returnEvent(self,frame,retval):
218
print "return from " + frame.getName() + " value is " + str(retval) + " locals are " + str(frame.getLocals())
220
def exceptionEvent(self,frame,exception):
221
print "exception %s %s raised from %s @ %s" % (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber())
222
print "tb: " + str(exception.getTraceback())
224
# the same functionality as LoggingTracer, but with a little more lldb-specific smarts
225
class LLDBAwareTracer:
226
def callEvent(self,frame):
227
if frame.getName() == "<module>":
229
if frame.getName() == "run_one_line":
230
print "call run_one_line(%s)" % (frame.getArgumentInfo().getArgs()["input_string"])
232
if "Python.framework" in frame.getFileName():
233
print "call into Python at " + frame.getName()
235
if frame.getName() == "__init__" and frame.getCaller().getName() == "run_one_line" and frame.getCaller().getLineNumber() == 101:
237
strout = "call " + frame.getName()
238
if (frame.getCaller().getFileName() == ""):
239
strout += " from LLDB - args are "
240
args = frame.getArgumentInfo().getArgs()
242
if arg == "dict" or arg == "internal_dict":
244
strout = strout + ("%s = %s " % (arg,args[arg]))
246
strout += " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo())
249
def lineEvent(self,frame):
250
if frame.getName() == "<module>":
252
if frame.getName() == "run_one_line":
253
print "running run_one_line(%s) @ %s" % (frame.getArgumentInfo().getArgs()["input_string"],frame.getLineNumber())
255
if "Python.framework" in frame.getFileName():
256
print "running into Python at " + frame.getName() + " @ " + str(frame.getLineNumber())
258
strout = "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are "
259
if (frame.getCaller().getFileName() == ""):
260
locals = frame.getLocals()
262
if local == "dict" or local == "internal_dict":
264
strout = strout + ("%s = %s " % (local,locals[local]))
266
strout = strout + str(frame.getLocals())
267
strout = strout + " in " + frame.getFileName()
270
def returnEvent(self,frame,retval):
271
if frame.getName() == "<module>":
273
if frame.getName() == "run_one_line":
274
print "return from run_one_line(%s) return value is %s" % (frame.getArgumentInfo().getArgs()["input_string"],retval)
276
if "Python.framework" in frame.getFileName():
277
print "return from Python at " + frame.getName() + " return value is " + str(retval)
279
strout = "return from " + frame.getName() + " return value is " + str(retval) + " locals are "
280
if (frame.getCaller().getFileName() == ""):
281
locals = frame.getLocals()
283
if local == "dict" or local == "internal_dict":
285
strout = strout + ("%s = %s " % (local,locals[local]))
287
strout = strout + str(frame.getLocals())
288
strout = strout + " in " + frame.getFileName()
291
def exceptionEvent(self,frame,exception):
292
if frame.getName() == "<module>":
294
print "exception %s %s raised from %s @ %s" % (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber())
295
print "tb: " + str(exception.getTraceback())
305
def print_keyword_args(**kwargs):
306
# kwargs is a dict of the keyword args passed to the function
307
for key, value in kwargs.iteritems():
308
print "%s = %s" % (key, value)
310
def total(initial=5, *numbers, **keywords):
312
for number in numbers:
315
count += keywords[key]
318
if __name__ == "__main__":
319
enable(LoggingTracer())
322
print_keyword_args(first_name="John", last_name="Doe")
323
total(10, 1, 2, 3, vegetables=50, fruits=100)