我如何从lldb python API访问C数组浮点值

时间:2016-12-11 17:47:33

标签: python c lldb

我是python scripting in lldb的新人。我正在调试C代码。

我想将一个C数组浮点数的内容复制到lldb脚本中的python变量中。最终的目标是使用gdb和python将内容数组绘制成here

我正在调试的程序中的C数组声明为float* buffer;

在lldb python脚本中如果我这样做:buf = lldb.frame.FindVariable ("buffer") buf只包含非dereferrenced指针“buffer”(数组的地址)。

如何访问数组的实际值(derefferenced)并将它们复制到python变量中? gdb有gdb_numpy.to_array。我查看SBValue.h并尝试了GetChildAtIndex方法,但没有运气。

3 个答案:

答案 0 :(得分:1)

问题是浮点数*不是数组,它是指向浮点数的指针。它可能指向一个连续分配的浮点数组,或lldb无法判断的单个浮点数。

因此它的SBValue不会是N个子节点的数组,其中N是您为数组分配的元素数。它将有一个值 - 指针值 - 和一个子节点 - 指针指向的值。

但是,使用Python API遍历连续数组非常简单:

获取指针:

>>> float_ptr = lldb.frame.FindVariable("float_ptr")

为方便起见,请存储元素的类型:

>>> float_type = float_ptr.GetType().GetPointeeType()

现在走出阵列打印出来的元素(我为这个例子制作了10个浮点数):

>>> for i in range (0,9):
...     offset = float_ptr.GetValueAsUnsigned() + i * float_type.GetByteSize()
...     val = lldb.target.CreateValueFromAddress("temp", lldb.SBAddress(offset, lldb.target), float_type)
...     print val
... 
(float) temp = 1
(float) temp = 2
(float) temp = 3
(float) temp = 4
(float) temp = 5
(float) temp = 6
(float) temp = 7
(float) temp = 8
(float) temp = 9

答案 1 :(得分:0)

@JimIngham的回答很好。下面的示例说明了其他一些有用的命令和Jim的答案。目的是突出显示如何处理衰减为指针的C数组。

void foo_void ( float *input )
{
    printf("Pointer: %p.\n", input); <-- breakpoint here
}

int main ( void ) {

    float tiny_array[4];
    tiny_array[0] = 1.0;
    tiny_array[1] = 2.0;
    tiny_array[2] = 3.0;
    tiny_array[3] = 4.0;


    foo_void ( tiny_array );
    return 0;
}

LLDB-Python说明:

(lldb) fr v -L
0x00007ffeefbff4c8: (float *) input = 0x00007ffeefbff4f0

(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()'.

>>> ptr = lldb.frame.FindVariable('input')

>>> print(ptr.GetValue())
0x00007ffeefbff4f0

>>> ptr_type = ptr.GetType().GetPointeeType()

>>> print(ptr_type)
float

>>> ptr_size_type = ptr_type.GetByteSize()

>>> print(ptr_size_type)
4


>>> for i in range (0, 4):
...     offset = ptr.GetValueAsUnsigned() + i * ptr_size_type
...     val = lldb.target.CreateValueFromAddress("temp", lldb.SBAddress(offset, lldb.target), ptr_type)
...     print(offset, val.GetValue())
... 
(140732920755440, '1')
(140732920755444, '2')
(140732920755448, '3')
(140732920755452, '4')

答案 2 :(得分:-1)

实际上:

x[i]= float(buf.GetChildAtIndex(i,1,1).GetValue())

返回索引i处的buf值