为什么LLDB不能打印view.bounds?

debugging时,这样的事情让我疯狂:

(lldb) p self.bounds error: unsupported expression with unknown type error: unsupported expression with unknown type error: 2 errors parsing expression (lldb) p (CGRect)self.bounds error: unsupported expression with unknown type error: unsupported expression with unknown type error: C-style cast from '<unknown type>' to 'CGRect' is not allowed error: 3 errors parsing expression (lldb) p [self bounds] error: 'bounds' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression (lldb) p (CGRect)[self bounds] (CGRect) $1 = origin=(x=0, y=0) size=(width=320, height=238) (lldb) You suck! error: 'You' is not a valid command. (lldb) … 

为什么前三次失败? 有没有更简单的方法来打印self.bounds ? 谢谢。

你可以通过访问它

 p (CGRect)[view bounds] 

要么

 p view.layer.bounds 

view.bounds实际上是view.layer.bounds

看来[UIView bounds]的types信息不可用于lldb

从Xcode 6.3开始,我们有一个更好的解决scheme。 简而言之,您需要为LLDB导入UIKit以了解这些types: expr @import UIKit 。 看看这篇文章 ,学习一些技巧,让你的生活更轻松。

你会喜欢Xcode 6.3+

TLDR

 (lldb) e @import UIKit (lldb) po self.view.bounds 

LLDB的Objective-Cexpression式parsing器现在可以导入模块。 任何后续expression式都可以依赖模块中定义的函数和方法原型:

 (lldb) p @import Foundation (lldb) p NSPointFromString(@"{10.0, 20.0}"); (NSPoint) $1 = (x = 10, y = 20) 

在Xcode 6.3之前,没有debugging信息的方法和函数需要显式types转换来指定它们的返回types。 导入模块允许开发人员避免手动确定和指定这些信息的更劳动密集的过程:

 (lldb) p NSPointFromString(@"{10.0, 20.0}"); error: 'NSPointFromString' has unknown return type; cast the call to its declared return type error: 1 errors parsing expression (lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}”); (NSPoint) $0 = (x = 10, y = 20) 

导入模块的其他好处包括更好的错误消息,在64位设备上运行时访问可变参数函数以及消除潜在的错误推断参数types。

PS :如果你也混淆p和po

 p == print == expression -- == e -- po == expression -O -- == e -O -- 

--command+flaginputs之间的分隔符

-O标志用于调用对象description方法

LLDB在使用p时不支持点符号来发送消息,这就是为什么

 p self.bounds 

不起作用,但是

 p [self bounds] 

确实。

(虽然它实际上支持它的对象,当你使用po

而且,LLDB在运行时没有可用的非对象的types信息,所以你需要通过强制返回值显式地提供一个types。

使用Xcode 6.3,我们可以导入UIKit,然后打印框架或视图的边界

 expr @import UIKit p self.view.bounds 

当你运行这个时,我不知道上下文是什么。 但看起来像lldb找不到自己的types。

为了让lldb评估self.bounds ,需要知道自己的types是一些Class有属性的bounds 。 它不能假设self是ObjCtypes,因为你可以在这种情况下调用它:

 void test() { struct { int bounds; } self; } 

所以你会得到错误的error: unsupported expression with unknown type

但是,如果你使用[self bounds]来调用它,lldb知道self很多是ObjCtypes,因为[]语法只适用于ObjCtypes。 但是由于self的types不清楚,所以仍然无法评估[self bounds]的结果,因此您需要将其转换为CGRect

尝试下面的expression,

 p self.view.bounds.size.width 

或使用,

 po self.view 

p – Print仅用于打印正常/简单值,而po – Print Object与NSLog相同,可以打印对象的值

我试过@ an0的答案expr @import UIKit ,但它没有工作。

然后我添加了一个pch文件,并在文件中添加这些代码行:

 #ifndef PrefixHeader_pch #define PrefixHeader_pch #ifdef __OBJC__ #import <UIKit/UIKit.h> #endif #endif /* PrefixHeader_pch */ 

接下来,将pch文件链接到我的项目中:

在这里输入图像说明

再次运行应用程序,然后我可以在lldb控制台中使用点符号:

 (lldb) po self.view.bounds 

关于如何添加pch文件,请参阅这里的答案在Xcode 6中的PCH文件