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 一起工作得很好:-(
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 一起工作得很好:-(