LLDB Python API GetArrayType() 等效于版本 3.9

LLDB Python API GetArrayType() Equivalent in Version 3.9

TLDR:

在 LLDB 4.0+ 中,可以调用 x.GetArrayType(n) 为某些给定的元素类型生成固定大小的数组类型 x。这在 LLDB 3.9 中如何实现?原因是我用的是CLion,目前2017.2版本只支持LLDB 3.9.

详情

我正在为看起来像

的class写一个合成提供程序
struct X
{
    int n_a;
    int n_b;
    ...
    double * a;
    double * b;
    ...
};

即它有一堆指针和相应的大小。我知道 could/should 需要重构 - 但这不是我的问题。

我想为 LLDB 编写一个合成提供程序以正确可视化数组。我的想法是做某事。按照

def get_child_at_index(self, index):
    ...
    if is_pointer(index):
        size = get_array_size(index)
        name = get_name(index)
        child = self.value.GetChildMemberWithName(name)
        data = child.GetPointeeData(0, size)
        array_type = ???
        return self.value.CreateValueFromData(name, data, array_type)

所以给定 index,我可以确定它是否是一个指针,获取大小和名称。我的问题是我需要构建一个对应于 double [size]SBType 实例。这正是 GetArrayType(size) 似乎可以做的,但我无法使用。

或者,是否有更好的方法在 LLDB 中格式化 X

我看不到没有 GetArrayType 的简单方法。您可以尝试使用表达式,但 C 语言对于将任何内容强制转换为固定大小的数组类型非常挑剔,因此我无法找到一个好的表达式来 return 您想要什么。

我能想到的最好的办法就是把整个东西弄平。 IE。 num_children 会 return n_a + n_b 个元素。然后 child_at_index for 0 returns a[0], 1 return a[1], ... up to n_b returns b[0] 等等。您可以命名 children "a[0]" 等,这样您至少会清楚看到的内容。但它不会有很好的嵌套结构,你将无法做到:

(lldb) frame var myX.a

这与 GetArrayType 一起工作得很好:-(