【问题标题】:lldb python basic - print value of a global array while inside a breakpoint in a functionlldb python basic - 在函数的断点内打印全局数组的值
【发布时间】:2019-04-19 06:34:20
【问题描述】:

(一些背景:我对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)、数组和指针,但如果不是,目前查找数组的值更重要。

【问题讨论】:

    标签: ios xcode python-2.7 lldb


    【解决方案1】:

    SBFrame.FindVariable 在该帧的本地变量中进行搜索。它不在全局变量中搜索。

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

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

    您可以访问SBFrame 的模块,例如:

    module = frame.module
    

    及其目标:

    target = frame.thread.process.target
    

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

    【讨论】:

    • 嗨,感谢您的帮助,我设法在 lldb python 中读取了数组的各个元素的值,但我想做的主要事情是,使用 matplotlib 在图中显示数组值,不是在职的。你介意看看我的另一个问题吗? stackoverflow.com/questions/53367537/…
    • 我最近在这里找到了你的答案:stackoverflow.com/a/36706767/1693203 这是否意味着从 Xcode lldb 终端生成 maltplotlib 是不可能的?
    • 我认为最好从 Xcode lldb 控制台中放弃 matplotlib。你介意看看我的另一个问题吗? stackoverflow.com/questions/53373971/…
    • 我遇到的问题是,当我编写访问变量的实用程序脚本时,我如何知道它何时调用它所在的帧?是否有一个实用函数可以让我“找到最接近的变量”,例如,如果还有全局变量,则为局部帧变量?我已经手动完成了 ix.io/3rri/python 。后编辑:我重新阅读了您的回复,我可能需要更多地了解 python“globals”才能理解这个问题。
    猜你喜欢
    • 2019-06-15
    • 2016-09-07
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-01-25
    • 2013-12-06
    相关资源
    最近更新 更多