1087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataimport sys 2087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataimport inspect 3087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatafrom collections import OrderedDict 4087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 5087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass TracebackFancy: 6087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,traceback): 7087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.t = traceback 8087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 9087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getFrame(self): 10087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return FrameFancy(self.t.tb_frame) 11087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 12087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getLineNumber(self): 138e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.t.tb_lineno if self.t != None else None 14087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 15087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getNext(self): 16087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return TracebackFancy(self.t.tb_next) 17087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 18087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __str__(self): 19087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if self.t == None: 20087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return "" 21087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata str_self = "%s @ %s" % (self.getFrame().getName(), self.getLineNumber()) 22087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return str_self + "\n" + self.getNext().__str__() 23087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 24087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass ExceptionFancy: 25087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,frame): 26087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.etraceback = frame.f_exc_traceback 27087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.etype = frame.exc_type 28087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.evalue = frame.f_exc_value 29087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 30087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,tb,ty,va): 31087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.etraceback = tb 32087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.etype = ty 33087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.evalue = va 34087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 35087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getTraceback(self): 36087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return TracebackFancy(self.etraceback) 37087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 38087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __nonzero__(self): 39087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return self.etraceback != None or self.etype != None or self.evalue != None 40087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 41087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getType(self): 42087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return str(self.etype) 43087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 44087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getValue(self): 45087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return self.evalue 46087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 47087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass CodeFancy: 48087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,code): 49087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.c = code 50087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 51087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getArgCount(self): 528e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.c.co_argcount if self.c != None else 0 53087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 54087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getFilename(self): 558e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.c.co_filename if self.c != None else "" 56087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 57087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getVariables(self): 588e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.c.co_varnames if self.c != None else [] 59087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 60087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getName(self): 618e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.c.co_name if self.c != None else "" 628e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 638e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def getFileName(self): 648e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.c.co_filename if self.c != None else "" 65087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 66087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass ArgsFancy: 67087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,frame,arginfo): 68087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.f = frame 69087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.a = arginfo 70087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 71087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __str__(self): 72087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata args, varargs, kwargs = self.getArgs(), self.getVarArgs(), self.getKWArgs() 73087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = "" 74087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata count = 0 75087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata size = len(args) 76087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata for arg in args: 77087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + ("%s = %s" % (arg, args[arg])) 78087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata count = count + 1 79087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if count < size: 80087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + ", " 81087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if varargs: 82087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if size > 0: 83087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + " " 84087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + "varargs are " + str(varargs) 85087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if kwargs: 86087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if size > 0: 87087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + " " 88087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata ret = ret + "kwargs are " + str(kwargs) 89087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return ret 90087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 91087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getNumArgs(wantVarargs = False, wantKWArgs=False): 92087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata args, varargs, keywords, values = self.a 93087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata size = len(args) 94087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if varargs and wantVarargs: 95087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata size = size+len(self.getVarArgs()) 96087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if keywords and wantKWArgs: 97087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata size = size+len(self.getKWArgs()) 98087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return size 99087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 100087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getArgs(self): 101087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata args, _, _, values = self.a 102087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata argWValues = OrderedDict() 103087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata for arg in args: 104087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata argWValues[arg] = values[arg] 105087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return argWValues 106087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 107087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getVarArgs(self): 108087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata _, vargs, _, _ = self.a 109087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if vargs: 110087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return self.f.f_locals[vargs] 111087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return () 112087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 113087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getKWArgs(self): 114087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata _, _, kwargs, _ = self.a 115087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if kwargs: 116087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return self.f.f_locals[kwargs] 117087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return {} 118087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 119087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass FrameFancy: 120087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def __init__(self,frame): 121087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata self.f = frame 122087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 123087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getCaller(self): 124087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return FrameFancy(self.f.f_back) 125087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 126087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getLineNumber(self): 1278e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.f.f_lineno if self.f != None else 0 128087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 129087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getCodeInformation(self): 1308e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return CodeFancy(self.f.f_code) if self.f != None else None 131087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 132087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getExceptionInfo(self): 1338e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return ExceptionFancy(self.f) if self.f != None else None 134087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 135087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getName(self): 1368e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.getCodeInformation().getName() if self.f != None else "" 1378e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 1388e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def getFileName(self): 1398e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.getCodeInformation().getFileName() if self.f != None else "" 140087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 141087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getLocals(self): 1428e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return self.f.f_locals if self.f != None else {} 143087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 144087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def getArgumentInfo(self): 1458e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return ArgsFancy(self.f,inspect.getargvalues(self.f)) if self.f != None else None 146087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 147087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass TracerClass: 148087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def callEvent(self,frame): 149087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 150087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 151087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def lineEvent(self,frame): 152087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 153087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 154087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def returnEvent(self,frame,retval): 155087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 156087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 157087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def exceptionEvent(self,frame,exception,value,traceback): 158087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 159087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 160087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def cCallEvent(self,frame,cfunct): 161087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 162087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 163087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def cReturnEvent(self,frame,cfunct): 164087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 165087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 166087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def cExceptionEvent(self,frame,cfunct): 167087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 168087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 169087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatatracer_impl = TracerClass() 170087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 171087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 172087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef the_tracer_entrypoint(frame,event,args): 173087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if tracer_impl == None: 174087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return None 175087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if event == "call": 176087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata call_retval = tracer_impl.callEvent(FrameFancy(frame)) 177087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if call_retval == False: 178087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return None 179087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return the_tracer_entrypoint 180087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "line": 181087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata line_retval = tracer_impl.lineEvent(FrameFancy(frame)) 182087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if line_retval == False: 183087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return None 184087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return the_tracer_entrypoint 185087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "return": 186087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata tracer_impl.returnEvent(FrameFancy(frame),args) 187087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "exception": 188087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata exty,exva,extb = args 189087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata exception_retval = tracer_impl.exceptionEvent(FrameFancy(frame),ExceptionFancy(extb,exty,exva)) 190087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if exception_retval == False: 191087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return None 192087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return the_tracer_entrypoint 193087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "c_call": 194087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata tracer_impl.cCallEvent(FrameFancy(frame),args) 195087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "c_return": 196087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata tracer_impl.cReturnEvent(FrameFancy(frame),args) 197087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata elif event == "c_exception": 198087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata tracer_impl.cExceptionEvent(FrameFancy(frame),args) 199087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return None 200087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 201087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef enable(t=None): 202087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata global tracer_impl 203087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if t: 204087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata tracer_impl = t 205087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata sys.settrace(the_tracer_entrypoint) 206087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 207087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef disable(): 208087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata sys.settrace(None) 209087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 210087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataclass LoggingTracer: 211087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def callEvent(self,frame): 212087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print "call " + frame.getName() + " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo()) 213087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 214087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def lineEvent(self,frame): 2158e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are " + str(frame.getLocals()) + " in " + frame.getFileName() 216087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 217087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def returnEvent(self,frame,retval): 218087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print "return from " + frame.getName() + " value is " + str(retval) + " locals are " + str(frame.getLocals()) 219087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 220087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata def exceptionEvent(self,frame,exception): 221087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print "exception %s %s raised from %s @ %s" % (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber()) 222087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print "tb: " + str(exception.getTraceback()) 223087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 2248e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata# the same functionality as LoggingTracer, but with a little more lldb-specific smarts 2258e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granataclass LLDBAwareTracer: 2268e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def callEvent(self,frame): 2278e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "<module>": 2288e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2298e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "run_one_line": 2308e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "call run_one_line(%s)" % (frame.getArgumentInfo().getArgs()["input_string"]) 2318e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2328e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if "Python.framework" in frame.getFileName(): 2338e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "call into Python at " + frame.getName() 2348e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2358e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "__init__" and frame.getCaller().getName() == "run_one_line" and frame.getCaller().getLineNumber() == 101: 2368e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return False 2378e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = "call " + frame.getName() 2388e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if (frame.getCaller().getFileName() == ""): 2398e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout += " from LLDB - args are " 2408e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata args = frame.getArgumentInfo().getArgs() 2418e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata for arg in args: 2428e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if arg == "dict" or arg == "internal_dict": 2438e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata continue 2448e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + ("%s = %s " % (arg,args[arg])) 2458e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata else: 2468e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout += " from " + frame.getCaller().getName() + " @ " + str(frame.getCaller().getLineNumber()) + " args are " + str(frame.getArgumentInfo()) 2478e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print strout 2488e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 2498e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def lineEvent(self,frame): 2508e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "<module>": 2518e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2528e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "run_one_line": 2538e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "running run_one_line(%s) @ %s" % (frame.getArgumentInfo().getArgs()["input_string"],frame.getLineNumber()) 2548e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2558e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if "Python.framework" in frame.getFileName(): 2568e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "running into Python at " + frame.getName() + " @ " + str(frame.getLineNumber()) 2578e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2588e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = "running " + frame.getName() + " @ " + str(frame.getLineNumber()) + " locals are " 2598e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if (frame.getCaller().getFileName() == ""): 2608e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata locals = frame.getLocals() 2618e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata for local in locals: 2628e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if local == "dict" or local == "internal_dict": 2638e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata continue 2648e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + ("%s = %s " % (local,locals[local])) 2658e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata else: 2668e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + str(frame.getLocals()) 2678e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + " in " + frame.getFileName() 2688e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print strout 2698e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 2708e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def returnEvent(self,frame,retval): 2718e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "<module>": 2728e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2738e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "run_one_line": 2748e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "return from run_one_line(%s) return value is %s" % (frame.getArgumentInfo().getArgs()["input_string"],retval) 2758e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2768e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if "Python.framework" in frame.getFileName(): 2778e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "return from Python at " + frame.getName() + " return value is " + str(retval) 2788e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2798e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = "return from " + frame.getName() + " return value is " + str(retval) + " locals are " 2808e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if (frame.getCaller().getFileName() == ""): 2818e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata locals = frame.getLocals() 2828e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata for local in locals: 2838e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if local == "dict" or local == "internal_dict": 2848e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata continue 2858e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + ("%s = %s " % (local,locals[local])) 2868e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata else: 2878e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + str(frame.getLocals()) 2888e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata strout = strout + " in " + frame.getFileName() 2898e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print strout 2908e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 2918e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata def exceptionEvent(self,frame,exception): 2928e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata if frame.getName() == "<module>": 2938e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata return 2948e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "exception %s %s raised from %s @ %s" % (exception.getType(), str(exception.getValue()), frame.getName(), frame.getLineNumber()) 2958e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata print "tb: " + str(exception.getTraceback()) 2968e8de5e282ee00f600d46bd52398b0d5d50775c1Enrico Granata 297087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef f(x,y=None): 298087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata if x > 0: 299087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return 2 + f(x-2) 300087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return 35 301087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 302087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef g(x): 303087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return 1.134 / x 304087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 305087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef print_keyword_args(**kwargs): 306087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata # kwargs is a dict of the keyword args passed to the function 307087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata for key, value in kwargs.iteritems(): 308087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print "%s = %s" % (key, value) 309087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 310087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granatadef total(initial=5, *numbers, **keywords): 311087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata count = initial 312087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata for number in numbers: 313087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata count += number 314087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata for key in keywords: 315087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata count += keywords[key] 316087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata return count 317087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata 318087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granataif __name__ == "__main__": 319087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata enable(LoggingTracer()) 320087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata f(5) 321087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata f(5,1) 322087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata print_keyword_args(first_name="John", last_name="Doe") 323087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata total(10, 1, 2, 3, vegetables=50, fruits=100) 324087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata try: 325087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata g(0) 326087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata except: 327087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata pass 328087fd12171ada73a256a8de8966c2fb2b214cafeEnrico Granata disable() 329