#!/usr/bin/env python import lldb class value(object): '''A class that wraps an lldb.SBValue object and returns an object that can be used as an object with attribytes:\n argv = a.value(lldb.frame.FindVariable('argv'))\n argv.name - return the name of the value that this object contains\n argv.type - return the lldb.SBType for this value argv.type_name - return the name of the type argv.size - return the byte size of this value argv.is_in_scope - return true if this value is currently in scope argv.is_pointer - return true if this value is a pointer argv.format - return the current format for this value argv.value - return the value's value as a string argv.summary - return a summary of this value's value argv.description - return the runtime description for this value argv.location - return a string that represents the values location (address, register, etc) argv.target - return the lldb.SBTarget for this value argv.process - return the lldb.SBProcess for this value argv.thread - return the lldb.SBThread for this value argv.frame - return the lldb.SBFrame for this value argv.num_children - return the number of children this value has argv.children - return a list of sbvalue objects that represents all of the children of this value ''' def __init__(self, sbvalue): self.sbvalue = sbvalue def __nonzero__(self): return self.sbvalue.__nonzero__() def __repr__(self): return self.sbvalue.__repr__() def __str__(self): return self.sbvalue.__str__() def __getitem__(self, key): if isinstance(key, int): return value( self.sbvalue.GetChildAtIndex( key, lldb.eNoDynamicValues, True)) raise TypeError def __getattr__(self, name): if name == 'name': return self.sbvalue.GetName() if name == 'type': return self.sbvalue.GetType() if name == 'type_name': return self.sbvalue.GetTypeName() if name == 'size': return self.sbvalue.GetByteSize() if name == 'is_in_scope': return self.sbvalue.IsInScope() if name == 'is_pointer': return self.sbvalue.TypeIsPointerType() if name == 'format': return self.sbvalue.GetFormat() if name == 'value': return self.sbvalue.GetValue() if name == 'summary': return self.sbvalue.GetSummary() if name == 'description': return self.sbvalue.GetObjectDescription() if name == 'location': return self.sbvalue.GetLocation() if name == 'target': return self.sbvalue.GetTarget() if name == 'process': return self.sbvalue.GetProcess() if name == 'thread': return self.sbvalue.GetThread() if name == 'frame': return self.sbvalue.GetFrame() if name == 'num_children': return self.sbvalue.GetNumChildren() if name == 'children': # Returns an array of sbvalue objects, one for each child of # the value for the lldb.SBValue children = [] for i in range(self.sbvalue.GetNumChildren()): children.append( value( self.sbvalue.GetChildAtIndex( i, lldb.eNoDynamicValues, True))) return children raise AttributeError class variable(object): '''A class that treats a lldb.SBValue and allows it to be used just as a variable would be in code. So if you have a Point structure variable in your code, you would be able to do: "pt.x + pt.y"''' def __init__(self, sbvalue): self.sbvalue = sbvalue def __nonzero__(self): return self.sbvalue.__nonzero__() def __repr__(self): return self.sbvalue.__repr__() def __str__(self): return self.sbvalue.__str__() def __getitem__(self, key): # Allow array access if this value has children... if isinstance(key, int): return variable( self.sbvalue.GetValueForExpressionPath( "[%i]" % key)) raise TypeError def __getattr__(self, name): child_sbvalue = self.sbvalue.GetChildMemberWithName(name) if child_sbvalue: return variable(child_sbvalue) raise AttributeError def __add__(self, other): return int(self) + int(other) def __sub__(self, other): return int(self) - int(other) def __mul__(self, other): return int(self) * int(other) def __floordiv__(self, other): return int(self) // int(other) def __mod__(self, other): return int(self) % int(other) def __divmod__(self, other): return int(self) % int(other) def __pow__(self, other): return int(self) ** int(other) def __lshift__(self, other): return int(self) << int(other) def __rshift__(self, other): return int(self) >> int(other) def __and__(self, other): return int(self) & int(other) def __xor__(self, other): return int(self) ^ int(other) def __or__(self, other): return int(self) | int(other) def __div__(self, other): return int(self) / int(other) def __truediv__(self, other): return int(self) / int(other) def __iadd__(self, other): result = self.__add__(other) self.sbvalue.SetValueFromCString(str(result)) return result def __isub__(self, other): result = self.__sub__(other) self.sbvalue.SetValueFromCString(str(result)) return result def __imul__(self, other): result = self.__mul__(other) self.sbvalue.SetValueFromCString(str(result)) return result def __idiv__(self, other): result = self.__div__(other) self.sbvalue.SetValueFromCString(str(result)) return result def __itruediv__(self, other): result = self.__truediv__(other) self.sbvalue.SetValueFromCString(str(result)) return result def __ifloordiv__(self, other): result = self.__floordiv__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __imod__(self, other): result = self.__and__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __ipow__(self, other): result = self.__pow__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __ipow__(self, other, modulo): result = self.__pow__(self, other, modulo) self.sbvalue.SetValueFromCString(str(result)) return result def __ilshift__(self, other): result = self.__lshift__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __irshift__(self, other): result = self.__rshift__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __iand__(self, other): result = self.__and__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __ixor__(self, other): result = self.__xor__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __ior__(self, other): result = self.__ior__(self, other) self.sbvalue.SetValueFromCString(str(result)) return result def __neg__(self): return -int(self) def __pos__(self): return +int(self) def __abs__(self): return abs(int(self)) def __invert__(self): return ~int(self) def __complex__(self): return complex(int(self)) def __int__(self): return self.sbvalue.GetValueAsSigned() def __long__(self): return self.sbvalue.GetValueAsSigned() def __float__(self): return float(self.sbvalue.GetValueAsSigned()) def __oct__(self): return '0%o' % self.sbvalue.GetValueAsSigned() def __hex__(self): return '0x%x' % self.sbvalue.GetValueAsSigned()