【问题标题】:LLDB COMMAND : 'fr v var' vs 'p var'LLDB 命令:“fr v var”与“p var”
【发布时间】:2013-07-15 13:59:50
【问题描述】:

我是 LLDB 的新手,并尝试熟悉 official website 中的这些命令。
我对fr v barp bar 的功能感到困惑。
正如您从网站上看到的,它们被描述为“显示局部变量“bar”的内容”并放在同一个地方。 但是当我在 Xcode 4.6.4 中实际使用它们时,有一些不同吗?

(lldb) fr v self
(FGPLoginViewController *const) self = 0x07566350
(lldb) p self
(FGPLoginViewController *) $0 = 0x07566350
(lldb) fr v self.initCount
error: "self" is a pointer and . was used to attempt to access "initCount". Did you mean    "self->initCount"?
(lldb) p self.initCount
(NSInteger) $1 = 0

initCount 是 FGPLoginViewController 的 NSInteger 属性。
我的问题是fr v barp bar 之间的真正区别是什么?

【问题讨论】:

    标签: ios xcode debugging lldb


    【解决方案1】:

    区别(据我所知)是frame variable 仅用于打印 变量的内容,而printexpression -- 并且可以评估任意 C 和 Objective-C 表达式

    在您的示例中,self.initCount[self initCount] 的属性语法。为了评估该表达式,调试器编译它并在 应用。

    另一个例子:p 2+3 计算总和并打印结果,但 fr v 2+3 给出 一条错误消息。

    另一方面,frame variable 有更多选项来显示变量。 例如,fr v -r "app.*" 显示所有以“app”开头的变量。你不能这样做 使用print 命令。

    总结一下:frame variable 用于变量,print(或expr)用于表达式。 在一个变量的情况下,它们都同样有效。

    【讨论】:

    • 那么p 的功能覆盖fr v 和LLDB 创建fr v 只是为了使其更清晰和更具体?
    • @nekoP:我已经更新了答案并试图更好地解释它。
    • 很好的答案马丁。还有target variable——frame variable 将显示本地变量或参数,但如果你想查看全局/文件静态,你需要使用ta vprint 没有区别。部分重叠来自 lldb 开发的早期,当时expr 是一项正在进行中的工作并且并不总是可用 - 在这些情况下,人们可能会求助于fr vfr v 对 C 语法有一些简单的了解(我想你可以说 fr v a->b->c 来跟随指针链)但 expr 实际上是由 clang 处理并编译为 Objective-C++ 的;允许任意代码。
    • @JasonMolenda:非常感谢! - 不过现在有一个问题想请教[lldb]的高手(-:如果target variable打印全局变量,frame variable -g是做什么的呢?
    • fr v -g 显示您停止的编译单元的全局/静态(默认:显示所有这些,可选地显示您指定的那些)。 ta v 没有变量名也是如此。但是 ta v 在另一个编译单元中具有全局/静态名称将显示该 cu 的全局。示例:我停在a.c,它定义了全局变量barta vta v barfr v -g全部显示bar。文件b.c 定义foota v foo 显示它。 fr v -g foo 不会,ta v 不会。 (不带 arg 的ta v 仅显示 当前 源文件的全局变量/静态变量。)
    【解决方案2】:

    1.在LLDB中,p是打印,po是打印对象。 'p' 用于打印非指针变量,如 bool、float 等。 2.'fr v bar'表示显示局部变量(frame variable) bar的内容。

    【讨论】:

      【解决方案3】:

      顺便说一句,对于 gdb 爱好者来说,print 命令所做的与 gdb print 命令所做的差不多。 frame variable --no-locals 命令相当于 gdb 的 info argsframe variable --no-args 相当于 info localstarget variable 做了 info variables 所做的事情。

      Jason 对历史的看法是正确的,但这些命令也很有用,例如,在您希望每次停止时打印所有本地变量或参数的断点命令中。为所有这些编写打印表达式会很乏味,但frame var 会一口气给你所有这些。

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多