我是新使用 python scripting in lldb 。我正在调试 C 代码。
我想将 C float 组的内容复制到 lldb 脚本中的 python 变量中。最终目标是按照完成的方式绘制内容数组 here使用 gdb 和 python。
我正在调试的程序中的 C 数组被声明为 float* buffer;
在 lldb python 脚本中,如果我这样做: buf = lldb.frame.FindVariable ("buffer")
buf 仅包含非解引用指针“buffer”(数组的地址)。
如何访问数组的实际值(解除引用)并将它们复制到 python 变量中? gdb有gdb_numpy.to_array 。我看了SBValue.h并尝试了 GetChildAtIndex 方法,但没有成功。
最佳答案
问题是 float * 不是数组,它是指向 float 的指针。它可能指向一个连续分配的 float 组,也可能指向单个 float 组,lldb 无法判断。
因此它的 SBValue 不会是一个包含 N 个子级的数组,其中 N 是您为该数组分配的元素数量。它将有一个值(指针值)和一个子项(指针指向的值)。
但是,使用 Python API 遍历连续数组非常简单:
获取指针:
>>> float_ptr = lldb.frame.FindVariable("float_ptr")
为了方便起见,存储元素的类型:
>>> float_type = float_ptr.GetType().GetPointeeType()
现在遍历数组并打印出元素(在本例中我制作了 10 个 float ):
>>> 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
关于python - 如何从 lldb python API 访问 C 数组浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089145/