为什么LLDB无法打印view.bounds?

时间:2013-09-19 02:16:16

标签: objective-c lldb

这样的事情在调试时让我发疯:

(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?感谢。

8 个答案:

答案 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+flaginputs

之间的分隔符

-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文件链接到我的项目:

enter image description here

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

(lldb) po self.view.bounds    

有关如何添加pch文件,请参阅此处的答案PCH File in Xcode 6