lldb python basic-在函数的断点内时打印全局数组的值

时间:2018-11-16 04:49:16

标签: ios xcode python-2.7 lldb

(某些背景:我对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),数组和指针,但如果不是,则此时查找数组的值更为重要。

1 个答案:

答案 0 :(得分:1)

SBFrame.FindVariable在该框架局部变量中搜索。它不在全局变量中搜索。

为此,您需要使用范围更广的搜索。如果您知道全局变量位于包含框架代码的二进制映像中-lldb将该二进制映像称为Module-那么您可以找到包含该框架的模块并使用SBModule.FindGlobalVariables。如果不是这样,则可以使用SBTarget.FindGlobalVariables搜索整个目标。如果您知道该名称只有一个全局变量,则可以使用FindFirstGlobalVariable变体。

所有这些命令将查找任何类型的变量,并且它们都一致地返回SBValue,因此无论您如何查找它们,都可以以一致的方式设置它们的格式。对于静态分配的数组,数组元素是其子元素,因此您可以使用SBValue.GetChildAtIndex获取单个元素。

您可以进入SBFrame的模块,例如:

module = frame.module

及其目标:

target = frame.thread.process.target

lldb分隔了主要为了提高效率而在其中搜索变量的上下文。如果SBFrame.FindVariable同时搜索全局变量和局部变量,则错误键入的变量名将是代价高得多的错误。但这也使调用更加可预测,因为您将永远不会从系统代表您加载的某些共享库中获得随机的全局信息。