LLDB和合成提供商:跟随指针

lldb & synthetic provider: follow pointer

本文关键字:跟随 指针 提供商 LLDB      更新时间:2023-10-16

我有一个名为Values的自定义类,它是数组的包装器。对于包含Foo类对象数组的Values类的给定对象vFoovar format -T vFoo命令返回以下结构:

(MyNameSpace::Values) vFoo = {
  (void *) p = 0x0000000100204378
  (size_t) n = 2
  (MyNameSpace::ValueType) type = FOO
}

其中CCD_ 6是指向包含2个元素的CCD_。我可以在lldb提示符下使用以下命令访问数组元素:

expression ((MyNameSpace::Foo*)vFoo.p)[0]

返回

(MyNameSpace::Foo) $0 = "foo"

根据我的摘要提供者。

我想写一个合成的子提供者,它返回类似于:

(MyNameSpace::Values) vFoo = {
     (MyNameSpace::Foo) vFoo.p[0] = "foo"
     (MyNameSpace::Foo) vFoo.p[1] = "bar"
}

不幸的是,我不知道该怎么做。我阅读了lldb数据格式化程序页面,并尝试遵循页面末尾给出的结构。我也看过bitfield和libcxx的例子,但我找不到解决方案的方法。如有任何帮助,我们将不胜感激!

提前感谢

您需要获得类型Foo的内部表示。您可以使用self.valobj.GetFrame().GetModule().FindFirstType("Foo")从SBModule获取此信息。像这样的东西只要有人四处窥探就行了。

class Values_SynthProvider:
def __init__(self, valobj, dict):
    self.valobj = valobj
    self.num_elements = None
def update(self):
    self.num_elements = self.valobj.GetChildMemberWithName('n').GetValueAsUnsigned(0)
def num_children(self):
    return self.num_elements
def get_child_at_index(self,index):
    # Here you could switch on the value of Values::type to get the right type name to search for
    foo_type = self.valobj.GetFrame().GetModule().FindFirstType("Foo")
    return self.valobj.GetChildMemberWithName('p').Cast(foo_type.GetPointerType()).GetChildAtIndex(index,0,True)
def get_child_index(self,name):
    return int(name.lstrip('[').rstrip(']'))