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

标签 python c lldb

我是新使用 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/

相关文章:

c - GtkLabel 不显示文件中的换行符

rust - 无法使用 Rust 在 VSCode-LLDB 中创建条件断点

xcode - 如何解决Xcode中的lldb错误?

python - Python 3.4 中的文本编码引起困惑 : How to Prevent "UnicodeEncodeError: ' charmap' codec can't encode"

python - 寻找二阶多项式的回归 python

python - 像 GIMP/Photoshop Canvas 一样转换 numpy 二维数组

c - 从文件中读取每一行并将该行拆分为字符串和 C 中的数组

c - Qsort with array of struct 更改结构的内容

c++ - VSCode+LLDB 调试在 Vagrant-Ubuntu 中无法正常工作

python - 第三个变量的颜色线 - Python