这样的事情在调试时让我发疯:
(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
?感谢。
答案 0 :(得分:53)
您可以通过
访问它p (CGRect)[view bounds]
或
p view.layer.bounds
view.bounds
实际上是view.layer.bounds
[UIView bounds]
lldb
的类型信息
答案 1 :(得分:40)
从Xcode 6.3开始,我们有了更好的解决方案。简而言之,您需要导入UIKit for LLDB以了解这些类型:
expr @import UIKit
。查看this article了解一些技巧,让您的生活更轻松。
答案 2 :(得分:12)
你会爱Xcode 6.3+
<强> TLDR 强>
(lldb) e @import UIKit
(lldb) po self.view.bounds
LLDB的Objective-C表达式解析器现在可以导入模块。任何 后续表达式可以依赖于函数和方法原型 在模块中定义:
(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)
在Xcode 6.3之前,方法和函数没有调试信息 需要显式类型转换来指定其返回类型。输入 模块允许开发人员避免更加劳动密集的过程 手动确定和指定此信息:
(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位设备上运行时访问可变参数函数,以及 消除可能不正确的推断参数类型。
PS :如果你也混淆p vs po
p == print == expression -- == e --
po == expression -O -- == e -O --
--
是command+flag
与inputs
-O
标志用于调用对象description
方法
答案 3 :(得分:6)
使用p
时,LLDB不支持点名表示邮件发送,这就是
p self.bounds
不起作用,但
p [self bounds]
确实
(当你使用po
时,它实际上支持对象
此外,LLDB没有运行时可用的非对象的类型信息,因此您需要通过强制转换返回值来显式提供类型。
答案 4 :(得分:6)
使用Xcode 6.3,我们可以导入UIKit,然后打印框架或视图边界
expr @import UIKit
p self.view.bounds
答案 5 :(得分:0)
我不知道你运行它时的上下文是什么。但看起来像lldb找不到self
的类型。
为了让lldb评估self.bounds
,需要知道self
的类型是某些类具有属性bounds
。它不能假设self
是ObjC类型,因为您可以在这样的上下文中调用它:
void test()
{
struct
{
int bounds;
} self;
}
因此您收到错误error: unsupported expression with unknown type
但是,如果使用[self bounds]
调用它,则lldb知道self
多为ObjC类型,因为[]
语法仅适用于ObjC类型。但由于self
的类型不明确,因此仍无法评估[self bounds]
的结果,因此您需要将其投放到CGRect
答案 6 :(得分:0)
尝试使用以下表达式,
p self.view.bounds.size.width
或使用,
po self.view
p - 打印仅用于打印普通/简单值 而, po - Print Object与NSLog的工作原理相同,可以打印对象的值
答案 7 :(得分:0)
我尝试了@ 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文件,请参阅此处的答案PCH File in Xcode 6