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
?
答案 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非常有效: - (