在lldb python中打印结构数组

在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

以下是问题:

我希望能够为lldb中给定结构的数组创建类型摘要。问题是我无法通过python lldb正确访问数组。有些数据不正确

我有以下C语言的测试代码:

#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 
}