(一些背景:我对 lldb 或 python 没有经验,也不经常使用它们,但目前需要制作一些用于调试 iphone 程序的基本脚本)
我目前停在一个函数的断点处,想检查这个函数内部访问过的数组的值
这个数组声明为
Float32 my_array[128];
并且具有全局范围。我可以使用 print 命令查看数组,但我想制作一个 python 脚本,以便我可以更好地控制输出格式,并可能稍后使用 matplolib 将数组元素绘制为图形。
我正在查看示例 python 代码 given in this question ,并使用那里给出的 python 验证了我可以查看此函数中的局部变量(目前我在断点处停止)。例如,如果我将 base=frame.FindVariable('base')
中的 'base' 更改为我的局部变量 'k'(局部变量不是数组),
base=frame.FindVariable('k')
然后 print base
我可以看到 k 的值。但是,如果我尝试这样做,
base=frame.FindVariable('my_array')
并执行 print base
它给我 No value
。我如何编写 python 命令来获取当前范围内的任何类型变量的值?它最好适用于普通变量(int、float)、数组和指针,但如果不是,则目前查找数组的值更为重要。
最佳答案
SBFrame.FindVariable
在该帧的局部变量中搜索。它不在全局变量中搜索。
为此,您需要使用范围更广的搜索。如果您知道全局变量在包含框架代码的二进制图像中 - lldb 将该二进制图像称为 Module
- 然后您可以找到包含该框架的模块并使用 SBModule.FindGlobalVariables
。如果不是这样,您可以使用 SBTarget.FindGlobalVariables
搜索整个目标。如果您知道只有一个同名的全局变量存在,您可以使用 FindFirstGlobalVariable
变体。
所有这些命令都可以找到任何类型的变量,并且它们都一致地返回 SBValue
,因此无论您如何找到它们,您都可以以一致的方式格式化它们。对于静态分配的数组,数组元素是其子元素,因此您可以使用 SBValue.GetChildAtIndex 获取单个元素。
您可以像这样访问 SBFrame
的模块:
module = frame.module
及其目标:
target = frame.thread.process.target
lldb 将搜索变量的上下文分开主要是为了提高效率。如果 SBFrame.FindVariable
搜索全局变量和局部变量,输入错误的变量名将是一个代价更高的错误。但它也使调用更可预测,因为您永远不会从系统代表您加载的共享库中获得一些随机全局变量。
关于ios - lldb python basic - 在函数断点内打印全局数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53331618/