Xcode的LLDB调试器中的“ p”和“ po”有什么区别?

问题描述 投票:6回答:8

示例。我在旧项目中写了以下字符串,在新项目中写了一个清晰的字符串:

UIInterfaceOrientation k = [UIApplication sharedApplication].statusBarOrientation;

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

(lldb) po k
UIInterfaceOrientationLandscapeLeft

如果我写“ po k”-一个无用的整数列表,那在我的旧项目中会很糟糕。

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

objective-c xcode debugging console lldb
8个回答
14
投票

我不知道您的情况如何,只是为了使大家清楚pop之间的区别:

p命令(又名expr --)采用给定的参数,将它们编译为在当前帧的上下文中编写的源代码表达式,然后执行结果-通过在如果可能的话,通过编译结果或JIT编译结果,将其插入目标程序,然后在目标程序中运行。然后打印评估结果。

po命令(又名expr --O --)执行p的所有操作,但是如果结果是指向ObjC对象的指针,则不打印结果,而是调用该对象的“描述”方法并打印该方法(*)返回的字符串。同样,如果结果是CF对象,它将调用CFShow并打印该结果。如果这两次尝试均失败,它将继续并按照p的要求打印结果。

因此po大部分类似于p。但是,如果对实际上不是对象的东西使用po,则可能会得到一些奇怪的结果。例如,ObjC进行了优化(标记指针),该优化表示对象指针中某些对象(例如NSNumbers)的内容。没有“真实的”对象,只有熟的指针。因此,如果您尝试po一个恰好看起来像带标记的指针的整数,则将获得一些可能不相关的ObjC对象的描述,而不是该整数的值。

当然,po还要做很多工作,因此,除非您真的想要某个对象的自身描述,否则p会更有效率。

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

13
投票

p =打印

po =打印对象

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

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


0
投票

UIInterfaceOrientation不是(Objective-C)对象,而是整数(enum:NSInteger)。您完全不应使用po(打印object)。


0
投票

似乎区别在于lldb / gdb调试器。 iOS项目使调试器更可行的唯一方法是expr @import UIKit。但是它可能不适用于较早的xcode版本,并且...您需要在每次重新启动后在控制台中输入此字符串。自动化它的唯一方法是使用此表达式额外的断点。


0
投票
p prints value of primitive variable or value of a reference
po try to call -description for that object and print returned string

There is also **v command** in lldb. Explaining using example.

protocol Activity {} 
struct Trip: Activity { 
var name: String 
var destinations: [String] 
} 
let cruise: Activity = Trip(...)

Using v command 
(lldb) v cruise.name
(string) cruise.name = "print name"
//As it uses dynamic resolution

Using p command
(lldb) p cruise.name
//execution interrupted

0
投票
  • 使用po,p和v打印变量
    • po最终会编译并执行两次,一次评估表达式,再一次获得对象描述。
    • v完全不编译:无法计算任何表达式,但允许属性访问,并且可以进行递归动态类型解析,因此将每个属性都视为实际的运行时类型。

enter image description here

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

将其作为可见性的答案,并解释每个调试命令的功能


-1
投票
Strip debug symbols during copy

[在大多数答案中,他们建议将优化设置为“ none”,但是忘记将此选项设置为NO(至少对于调试配置而言)。


-1
投票

这是参考吉姆·英厄姆所说的。输入“ p”而不是“ po”。当我这样做时,Xcode将显示正确的信息。试试看。

© www.soinside.com 2019 - 2024. All rights reserved.