После вопроса здесь: Writing a Python script to print out an array of recs in lldbпечать структура массива в lldb питона
Я хотел бы быть в состоянии создать резюме типа для массива данной структуры в 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;
}
В lldb:
(lldb) b foo
(lldb) r
(lldb) script
>>> debugger=lldb.debugger
>>> target=debugger.GetSelectedTarget()
>>> frame=lldb.frame
>>> base=frame.FindVariable('base')
>>> buffers=base.GetChildMemberWithName('buffers')
Теперь buffers
должен указывать на массив struct Buffer
, и я должен быть в состоянии получить доступ к каждому и каждый Buffer
через функцию buffers.GetChildAtIndex
, но данные повреждены в первых двух пунктах.
>>> 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
}
Только buffers[2]
и все пункты в порядке.
Почему print buffers.GetChildAtIndex(1,0,1)
указывает на buffers[0].count
товар вместо buffers[1]
?
Что я делаю неправильно?
Спасибо, а в качестве примечания: глядя на http://bugreporter.apple.com? Последняя ошибка, с которой я открылся, не обрабатывался более года. – mrdvlpr
Ошибки от репортера ошибок раздаются командам, ответственным в довольно коротком порядке. Что происходит после этого больше зависит от команда получает ошибку. –