Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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())
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
 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()
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
    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()
Ejemplo n.º 9
0
    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()
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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()
Ejemplo n.º 14
0
 def __init__(self, valobj, dict):
     # type: (SBValue, dict) -> EmptySyntheticProvider
     logger = Logger.Logger()
     logger >> "[EmptySyntheticProvider] for " + str(valobj.GetName())
     self.valobj = valobj
Ejemplo n.º 15
0
 def __init__(self, valobj, dict):
     # type: (SBValue, dict) -> DefaultSynthteticProvider
     logger = Logger.Logger()
     # logger >> "Default synthetic provider for " + str(valobj.GetName())
     self.valobj = valobj
Ejemplo n.º 16
0
 def __init__(self, valobj, dict):
     # type: (SBValue, dict) -> StdVecDequeSyntheticProvider
     logger = Logger.Logger()
     logger >> "[StdVecDequeSyntheticProvider] for " + str(valobj.GetName())
     self.valobj = valobj
     self.update()
Ejemplo n.º 17
0
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)