LLDB Python API GetArrayType()在V3.9中等效

时间:2017-08-24 16:36:54

标签: python lldb clion

TLDR:

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

详情

我正在为类似

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

即。它有一堆指针和相应的大小。我知道这可以/应该重构 - 但这不是我的问题。

我想在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,我可以确定它是否是指针,获取大小和名称。我的问题是我需要构建一个与SBType对应的double [size]实例。这正是GetArrayType(size)似乎做的事情,但我无法使用。

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

1 个答案:

答案 0 :(得分:1)

如果没有GetArrayType,我看不到一个简单的方法。您可能尝试使用表达式,但C对于将任何内容转换为固定大小的数组类型非常挑剔,因此我无法设法找到一个能够返回所需内容的良好表达式。

我能想到的最好的事情就是压扁整个事物。即num_children将返回n_a + n_b个元素。然后child_at_index为0返回a [0],1返回a [1],...直到n_b返回b [0]等。你可以将孩子命名为“a [0]”等,所以你看到的至少会清楚。但它不会有漂亮的嵌套结构,你将无法做到:

(lldb) frame var myX.a

等。

这对GetArrayType非常有效: - (