调试器在Xcode中的"p"和"po"命令?

Vya*_*cov 6 debugging console xcode objective-c lldb

例.我在旧项目中编写了以下字符串,并使用了一个新的,明确的字符串:

UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation;
Run Code Online (Sandbox Code Playgroud)

清晰项目的控制台输入输出:

(lldb) po k
UIInterfaceOrientationLandscapeLeft
Run Code Online (Sandbox Code Playgroud)

如果我写"po k" - 一个无用的整数列表,那么在我的旧项目中有些糟糕.

另外,我不能在新项目中打印大多数对象.

Jim*_*ham 13

我不知道你的情况是怎么回事,但是大家都明白了po&之间的区别p:

p命令(又名expr --)取它被给定的参数,编译他们就好像它们是写在当前帧的上下文中,源代码表达式,执行的结果-或者通过其上运行的编译的结果的解释,如果这是可能的,或者通过JITing编译结果,将其插入目标程序,然后在那里运行.然后打印评估结果.

po命令(又名expr --O --)做的一切p做,但而不是打印结果,如果结果是一个指向ObjC对象,它会调用该对象的"描述"的方法,并打印通过该方法(*)返回的字符串.同样,如果结果是CF对象,它将调用CFShow并打印结果.如果这两个尝试都失败了,它将继续并按原样打印结果p.

所以po大多数都喜欢p.但是如果你使用po它实际上不是对象的东西,你可以得到一些奇怪的结果.例如,ObjC有一个优化(标记指针),表示对象指针中某些对象(例如NSNumbers)的内容.没有一个"真正的"对象,只是一个煮熟的指针.因此,如果您尝试po使用恰好看起来像标记指针的整数,您将获得一些可能不相关的ObjC对象的描述,而不是整数的值.

当然,po正在做更多的工作,所以除非你真的想要一些对象的描述,否则p效率更高.

  • 实际上,它调用debugDescription(如果存在),如果不存在则返回到描述...


Tha*_*hin 13

p =打印

po =打印对象

p 打印原始变量的值或引用的值

po 尝试为该对象调用-description并打印返回的字符串


Gih*_*han 5

  • 使用 po、p 和 v 打印变量?
    • po 最终编译和执行两次,一次是为了评估你的表达式,另一次是为了获得对象描述。?
    • v 根本不编译:无法计算任何表达式,但允许访问属性并进行递归动态类型解析,因此每个属性都被视为实际的运行时类型。?

在此处输入图片说明

有兴趣了解更多的人:https : //developer.apple.com/videos/play/wwdc2019/429/

添加此作为可见性的答案,还解释了每个调试命令的功能


aus*_*s99 5

po尝试将您要打印的内容视为对象。在许多情况下它与 类似p,但也有一些情况会出现差异。

查看差异的最简单方法:比较p 0和的输出po 0

(lldb) p 0
  (int) $26 = 0
(lldb) po 0
  <nil>
Run Code Online (Sandbox Code Playgroud)


Vya*_*cov -2

Strip debug symbols during copy
Run Code Online (Sandbox Code Playgroud)

在大多数答案中,他们建议将优化设置为“无”,但忘记该选项应设置为“否”(至少对于调试配置)。