【问题标题】:LLDB Data Formatter and C arrayLLDB 数据格式化程序和 C 数组
【发布时间】:2017-10-02 14:32:15
【问题描述】:

我想为我自己的对象编写一个 LLDB 数据格式化程序,如下所示:

template <typename T, int n>
class StaticArray {
  T data_[n];
}

这是我的合成数据格式化程序到目前为止的样子:

class StaticArrayProvider:
    def __init__(self, valobj, internal_dict):
        self.valobj = valobj
        self.data = self.valobj.GetChildMemberWithName('data_').GetChildAtIndex(0)
        self.data_type = self.data.GetType()
        self.type_size = self.data_type.GetByteSize()
        self.size = # ???

    def num_children(self):
        return self.size

    def get_child_index(self, name):
        try:
            return int(name.lstrip('[').rstrip(']'))
        except:
            return -1

    def get_child_at_index(self, index):
        if index < 0:
            return None
        if index >= self.num_children():
            return None
        try:
            offset = index * self.type_size
            return # ???
        except:
            return None

我不知道该怎么做才能填补空白# ???。你有什么解决办法吗?

【问题讨论】:

    标签: c++ lldb pretty-print


    【解决方案1】:

    在 lldb 值系统中,GetNumChildren 返回静态大小数组的元素数量,GetChildAtIndex 获取该数组元素。由于每个模板实例化data_ 是一个静态大小的数组,因此您的数据格式化程序可以在提供子项时转发data_。 IE。你可以这样做:

    self.data = self.valobj.GetChildMemberWithName('data_')
    

    然后num_children 只返回self.data.GetNumChildren()get_child_at_index 返回self.data.GetChildAtIndex()

    只有当 lldb 无法为您计算出偏移量和大小时,您才需要计算(例如,如果您有一个动态大小的数组或指向您正在视为数组的类型的指针。)

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2016-09-14
      • 2015-11-07
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多