def get_child_at_index(self, index: int) -> Optional[lldb.SBValue]: if index < 0 or index > self.num_children(): return None name = self.MEMBER_NAMES[index] LoggerModule.Logger().write(f'index={index}, name={name}') if name == '_rawBits': return self.valobj.GetChildMemberWithName('_rawBits') dv = self.debug_view if name == 'encodedOffset': return self._create_child_from_expression(name, dv.encoded_offset, 'UInt64') if name == 'transcodedOffset': return self._create_child_from_expression(name, dv.transcoded_offset, 'Int') if name == 'characterStride': return self._create_child_from_expression(name, dv.character_stride, 'Int?') if name == 'reserved': return self._create_child_from_expression(name, dv.reserved, 'Int?') if name == 'isScalarAligned': return self._create_child_from_expression(name, dv.is_scalar_aligned, 'Bool?') return None
def get_child_at_index(self, index): # type: (int) -> SBValue logger = Logger.Logger() start = self.data_ptr.GetValueAsUnsigned() & ~1 # See `libstd/collections/hash/table.rs:raw_bucket_at hashes = self.hash_uint_size * self.capacity align = self.pair_type_size # See `libcore/alloc.rs:padding_needed_for` len_rounded_up = (((( (hashes + align) % self.modulo - 1) % self.modulo) & ~( (align - 1) % self.modulo)) % self.modulo - hashes) % self.modulo # len_rounded_up = ((hashes + align - 1) & ~(align - 1)) - hashes pairs_offset = hashes + len_rounded_up pairs_start = start + pairs_offset table_index = self.valid_indices[index] idx = table_index & self.capacity_mask address = pairs_start + idx * self.pair_type_size element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.pair_type) if self.show_values: return element else: key = element.GetChildAtIndex(0) return self.valobj.CreateValueFromData("[%s]" % index, key.GetData(), key.GetType())
def update(self): # type: () -> None logger = Logger.Logger() self.table = self.valobj.GetChildMemberWithName( "table") # type: SBValue self.size = self.table.GetChildMemberWithName( "size").GetValueAsUnsigned() self.hashes = self.table.GetChildMemberWithName("hashes") self.hash_uint_type = self.hashes.GetType() self.hash_uint_size = self.hashes.GetType().GetByteSize() self.modulo = 2**self.hash_uint_size self.data_ptr = self.hashes.GetChildAtIndex(0).GetChildAtIndex(0) self.capacity_mask = self.table.GetChildMemberWithName( "capacity_mask").GetValueAsUnsigned() self.capacity = (self.capacity_mask + 1) % self.modulo marker = self.table.GetChildMemberWithName( "marker").GetType() # type: SBType self.pair_type = marker.template_args[0] self.pair_type_size = self.pair_type.GetByteSize() self.valid_indices = [] for idx in range(self.capacity): address = self.data_ptr.GetValueAsUnsigned( ) + idx * self.hash_uint_size hash_uint = self.data_ptr.CreateValueFromAddress( "[%s]" % idx, address, self.hash_uint_type) hash_ptr = hash_uint.GetChildAtIndex(0).GetChildAtIndex(0) if hash_ptr.GetValueAsUnsigned() != 0: self.valid_indices.append(idx) logger >> "Valid indices: {}".format(str(self.valid_indices))
def __init__(self, valobj, dict): # type: (SBValue, dict) -> StdVecSyntheticProvider logger = Logger.Logger() logger >> "Providing synthetic children for a Vec named " + str( valobj.GetName()) self.valobj = valobj self.update()
def _read_uint64(valobj: lldb.SBValue) -> Optional[int]: logger = LoggerModule.Logger() error = lldb.SBError() result: int = valobj.GetData().GetUnsignedInt64(error, 0) if error.fail: logger.write(f'SBData::GetUnsignedInt64 failed: {error.description}') return None return result
def StdOsStringSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str logger = Logger.Logger() logger >> "[StdOsStringSummaryProvider] for " + str(valobj.GetName()) buf = valobj.GetChildAtIndex(0).GetChildAtIndex(0) is_windows = "Wtf8Buf" in buf.type.name vec = buf.GetChildAtIndex(0) if is_windows else buf return '"%s"' % vec_to_string(vec)
def StdStringSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str assert valobj.GetNumChildren() == 1 logger = Logger.Logger() logger >> "[StdStringSummaryProvider] for " + str(valobj.GetName()) vec = valobj.GetChildAtIndex(0) length = vec.GetNumChildren() chars = [chr(vec.GetChildAtIndex(i).GetValueAsUnsigned()) for i in range(length)] return '"%s"' % "".join(chars)
def __init__(self, valobj, dict, is_variant=False): # type: (SBValue, dict, bool) -> TupleSyntheticProvider logger = Logger.Logger() self.valobj = valobj self.is_variant = is_variant self.type = valobj.GetType() if is_variant: self.size = self.type.GetNumberOfFields() - 1 else: self.size = self.type.GetNumberOfFields()
def __init__(self, valobj, dict, is_variant=False): # type: (SBValue, dict) -> TupleSyntheticProvider logger = Logger.Logger() self.valobj = valobj self.is_variant = is_variant self.type = valobj.GetType() if is_variant: logger >> "[TupleVariantSyntheticProvider] for " + str(valobj.GetName()) self.size = self.type.GetNumberOfFields() - 1 else: logger >> "[TupleSyntheticProvider] for " + str(valobj.GetName()) self.size = self.type.GetNumberOfFields()
def StdStringSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str assert valobj.GetNumChildren() == 1 logger = Logger.Logger() logger >> "[StdStringSummaryProvider] for " + str(valobj.GetName()) vec = valobj.GetChildAtIndex(0) length = vec.GetNumChildren() chars = [ vec.GetChildAtIndex(i).GetValueAsUnsigned() for i in range(length) ] data = bytes(chars).decode(encoding='UTF-8') if PY3 else "".join( chr(char) for char in chars) return '"%s"' % data
def __init__(self, valobj, dict, is_variant=False): # type: (SBValue, dict, bool) -> StructSyntheticProvider logger = Logger.Logger() self.valobj = valobj self.is_variant = is_variant self.type = valobj.GetType() self.fields = {} if is_variant: self.fields_count = self.type.GetNumberOfFields() - 1 real_fields = self.type.fields[1:] else: self.fields_count = self.type.GetNumberOfFields() real_fields = self.type.fields for number, field in enumerate(real_fields): self.fields[field.name] = number
def StdStrSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str logger = Logger.Logger() logger >> "[StdStrSummaryProvider] for " + str(valobj.GetName()) length = valobj.GetChildMemberWithName("length").GetValueAsUnsigned() if length == 0: return '""' data_ptr = valobj.GetChildMemberWithName("data_ptr") start = data_ptr.GetValueAsUnsigned() error = SBError() process = data_ptr.GetProcess() data = process.ReadMemory(start, length, error) data = data.decode(encoding='UTF-8') if PY3 else data return '"%s"' % data
def StdStrSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str assert valobj.GetNumChildren() == 2 logger = Logger.Logger() logger >> "[StdStrSummaryProvider] for " + str(valobj.GetName()) length = valobj.GetChildMemberWithName("length").GetValueAsUnsigned() data_ptr = valobj.GetChildMemberWithName("data_ptr") start = data_ptr.GetValueAsUnsigned() error = SBError() process = data_ptr.GetProcess() data = process.ReadMemory(start, length, error) if error.Success(): return '"%s"' % data else: return '<error: %s>' % error.GetCString()
def __init__(self, valobj, dict): # type: (SBValue, dict) -> EmptySyntheticProvider logger = Logger.Logger() logger >> "[EmptySyntheticProvider] for " + str(valobj.GetName()) self.valobj = valobj
def __init__(self, valobj, dict): # type: (SBValue, dict) -> DefaultSynthteticProvider logger = Logger.Logger() # logger >> "Default synthetic provider for " + str(valobj.GetName()) self.valobj = valobj
def __init__(self, valobj, dict): # type: (SBValue, dict) -> StdVecDequeSyntheticProvider logger = Logger.Logger() logger >> "[StdVecDequeSyntheticProvider] for " + str(valobj.GetName()) self.valobj = valobj self.update()
def StdStringSummaryProvider(valobj, dict): # type: (SBValue, dict) -> str logger = Logger.Logger() logger >> "[StdStringSummaryProvider] for " + str(valobj.GetName()) vec = valobj.GetChildAtIndex(0) return '"%s"' % vec_to_string(vec)