在lldb python中打印结构数组
以下是问题: 我希望能够为lldb中给定结构的数组创建类型摘要。问题是我无法通过python lldb正确访问数组。有些数据不正确 我有以下C语言的测试代码:在lldb python中打印结构数组,python,c,macos,lldb,Python,C,Macos,Lldb,以下是问题: 我希望能够为lldb中给定结构的数组创建类型摘要。问题是我无法通过python lldb正确访问数组。有些数据不正确 我有以下C语言的测试代码: #include <stdio.h> #include <stdlib.h> struct Buffer { struct Buffer* next; struct Buffer* prev; }; struct Base { struct Buffer* buffers; in
#include <stdio.h>
#include <stdlib.h>
struct Buffer
{
struct Buffer* next;
struct Buffer* prev;
};
struct Base
{
struct Buffer* buffers;
int count;
};
void fill(struct Buffer* buf, int count)
{
for (int i = 0; i < count; ++i)
{
struct Buffer t = {(void*)0xdeadbeef,(void*)i};
buf[i] = t;
}
}
void foo(struct Base* base)
{
printf("break here\n");
}
int main(int argc, char** argv)
{
int c = 20;
void* buf = malloc(sizeof (struct Buffer) * c);
struct Base base = {.buffers = buf, .count = c};
fill(base.buffers, base.count);
foo(&base);
return 0;
}
现在,buffers
应该指向struct Buffer
的数组,我应该能够通过buffers.GetChildAtIndex
函数访问每个Buffer
,但前两项中的数据已损坏
>>> print buffers.GetChildAtIndex(0,0,1)
(Buffer *) next = 0x00000000deadbeef
>>> print buffers.GetChildAtIndex(1,0,1)
(Buffer *) prev = 0x0000000000000000
>>> print buffers.GetChildAtIndex(2,0,1)
(Buffer) [2] = {
next = 0x00000000deadbeef
prev = 0x0000000000000002
}
只有缓冲区[2]
和以上项目正常
为什么打印缓冲区。GetChildAtIndex(1,0,1)
指向缓冲区[0]。计数项而不是缓冲区[1]
我做错了什么?GetChildAtIndex试图为您的目的提供一点帮助。这与帮助是一致的,帮助说:
指针根据指向的内容而有所不同。如果指针
指向一个简单类型,即索引为零的子类型
是唯一可用的子值,除非允许
为true,在这种情况下,指针将用作数组
并且可以使用正向或反向创建“合成”子值
负指数如果指针指向聚合类型
(数组、类、并集、结构),则指针对象是
透明跳过,所有子项都将成为索引
聚合类型中的子值。例如,如果
我们有一个“点”类型,我们有一个包含
指向“点”类型的指针,则索引零处的子项将
“x”成员,索引1处的子成员将是“y”成员
(索引0处的子对象不会是“点”实例)
所以实际上,buffers.GetChildAtIndex(2,0,1)应该返回“No Value”。对于allow synthetic参数,无论是该参数还是传递1,都应该关闭此窥视行为。无论哪种情况,这都是一个bug,请将其归档
同时,您应该能够通过手动遍历数组并使用“SBTarget.CreateValueFromAddress”来创建值,从而获得相同的效果。首先,使用buffers.GetAddress()获取数组的地址;通过获取缓冲区的类型,获取其指针类型并调用GetByteSize来计算缓冲区的大小。然后只需按大小计数次数增加地址即可创建所有值。谢谢,顺便提一下:有人在看吗?我打开的上一个bug已经有一年多没有处理了。bug reporter中的bug将分发给团队负责的时间很短。之后会发生什么更多地取决于团队收到错误。
>>> print buffers.GetChildAtIndex(0,0,1)
(Buffer *) next = 0x00000000deadbeef
>>> print buffers.GetChildAtIndex(1,0,1)
(Buffer *) prev = 0x0000000000000000
>>> print buffers.GetChildAtIndex(2,0,1)
(Buffer) [2] = {
next = 0x00000000deadbeef
prev = 0x0000000000000002
}