Ios LLDB命令:“fr v var”vs“p var”

Ios LLDB命令:“fr v var”vs“p var”,ios,xcode,debugging,lldb,Ios,Xcode,Debugging,Lldb,我是LLDB的新手,尝试熟悉中的这些命令。 我混淆了fr v bar和p bar的功能。 从网站上可以看到,它们被描述为“显示局部变量栏的内容”,并放在相同的位置。 但是当我在Xcode 4.6.4中实际使用它们时,有什么不同 (lldb) fr v self (FGPLoginViewController *const) self = 0x07566350 (lldb) p self (FGPLoginViewController *) $0 = 0x07566350 (lldb) fr v

我是LLDB的新手,尝试熟悉中的这些命令。 我混淆了fr v bar和p 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 bar和p bar之间的真正区别是什么?

据我所知,区别在于frame变量仅用于打印 变量的内容,而打印是 表达式-并且可以计算任意C和目标C表达式

在您的示例中,self.initCount是[self initCount]的属性语法。要计算该表达式,调试器将编译该表达式并在 应用程序

另一个例子:p2+3计算和并打印结果,但frv2+3给出 错误消息

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

总而言之:frame变量用于变量,print或expr用于表达式。
在一个变量的情况下,它们都工作得同样好。

据我所知,区别在于帧变量仅用于打印 变量的内容,而打印是 表达式-并且可以计算任意C和目标C表达式

在您的示例中,self.initCount是[self initCount]的属性语法。要计算该表达式,调试器将编译该表达式并在 应用程序

另一个例子:p2+3计算和并打印结果,但frv2+3给出 错误消息

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

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

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

1.在LLDB中,p是打印对象,po是打印对象p'用于打印非指针变量,如bool、float等。
2.“fr v bar”表示显示本地variableframe变量条的内容。

顺便说一句,对于gdb爱好者来说,print命令的作用与gdb print命令的作用非常相似。frame variable-no locals命令等效于gdb的info args,frame variable-no args等效于info locals,目标变量执行info variables所执行的操作


Jason对历史记录的看法是正确的,但这些命令也很有用,例如,在断点命令中,每次停止时都要打印所有的局部变量或参数。为所有表达式编写打印表达式将是一件乏味的事情,但是frame var将一次性为您提供所有表达式。

顺便说一句,对于gdb爱好者来说,print命令所做的与gdb print命令所做的差不多。frame variable-no locals命令等效于gdb的info args,frame variable-no args等效于info locals,目标变量执行info variables所执行的操作


Jason对历史记录的看法是正确的,但这些命令也很有用,例如,在断点命令中,每次停止时都要打印所有的局部变量或参数。为所有这些函数编写打印表达式会很枯燥,但frame var将一次性为您提供所有这些函数。

所以p的函数包括fr v,而LLDB创建fr v只是为了让它更清晰、更具体?@nekoP:我已经更新了答案,并试图更好地解释它。回答得好,Martin。还有一个目标变量-frame变量将显示局部变量或参数,但如果您想查看全局/静态文件,则需要使用ta v。印刷品没有区别。部分重叠来自lldb开发的早期,当时expr是一项正在进行的工作,并不总是可用的——在这些情况下,人们可以依赖fr v。frv对C语法有一些过于简单的知识,我想你可以说frva->b->C遵循一系列指针,但是expr实际上是由clang处理的,并编译为Objective-C++;允许使用任意代码。@JasonMolenda:非常感谢但是现在我有一个问题要问[lldb]:如果目标变量打印全局变量,帧变量-g做什么?fr v-g显示默认情况下停止的编译单元的全局/静态:显示所有这些,可选地显示您指定的。没有变量名的tav也会这样做。但是,在另一个编译单元中具有全局/静态名称的ta v将显示该cu的全局
. 示例:我停在a.c中,它定义了全局变量栏。ta v、ta v条、fr v-g所有显示条。文件b.c定义了foo。ta v foo展示了它。fr v-g foo不会,ta v不会。不带参数的ta v只显示当前源文件的全局/静态。因此p的函数包括fr v和LLDB创建的fr v,只是为了让它更清晰、更具体?@nekoP:我已经更新了答案,并试图更好地解释它。回答得好,Martin。还有一个目标变量-frame变量将显示局部变量或参数,但如果您想查看全局/静态文件,则需要使用ta v。印刷品没有区别。部分重叠来自lldb开发的早期,当时expr是一项正在进行的工作,并不总是可用的——在这些情况下,人们可以依赖fr v。frv对C语法有一些过于简单的知识,我想你可以说frva->b->C遵循一系列指针,但是expr实际上是由clang处理的,并编译为Objective-C++;允许使用任意代码。@JasonMolenda:非常感谢但是现在我有一个问题要问[lldb]:如果目标变量打印全局变量,帧变量-g做什么?fr v-g显示默认情况下停止的编译单元的全局/静态:显示所有这些,可选地显示您指定的。没有变量名的tav也会这样做。但是,在另一个编译单元中具有全局/静态名称的ta v将显示该cu的全局。示例:我停在a.c中,它定义了全局变量栏。ta v、ta v条、fr v-g所有显示条。文件b.c定义了foo。ta v foo展示了它。fr v-g foo不会,ta v不会。不带参数的ta v仅显示当前源文件的全局/静态。