56

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

(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) …

为什么前 3 次尝试失败?有没有更简单的打印方式self.bounds?谢谢。

4

8 回答 8

56

您可以通过以下方式访问它

p (CGRect)[view bounds]

或者

p view.layer.bounds

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

似乎[UIView bounds]无法使用的类型信息lldb

于 2013-09-20T18:02:32.867 回答
42

从 Xcode 6.3 开始,我们有了更好的解决方案。简而言之,您需要为 LLDB 导入 UIKit 才能了解这些类型: expr @import UIKit. 查看这篇文章,了解一些让您的生活更轻松的技巧。

于 2015-05-18T21:01:59.880 回答
15

你会喜欢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 和 po

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

--command+flag是vs之间的分隔符inputs

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

于 2015-08-30T03:11:00.957 回答
7

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

expr @import UIKit
p self.view.bounds
于 2015-05-18T20:12:53.883 回答
6

LLDB 在使用时不支持消息发送的点表示法p,这就是为什么

p self.bounds

不起作用,但是

p [self bounds]

做。

(不过,当您使用 时,它实际上支持对象po

此外,LLDB 在运行时没有可用的非对象的类型信息,因此您需要通过强制转换返回值来显式提供类型。

于 2013-09-19T03:45:24.950 回答
0

我不知道你运行它时的上下文是什么。但看起来 lldb 找不到self.

为了让 lldb 进行评估self.bounds,它需要知道self某个 Class 的类型是否具有属性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

于 2013-09-19T03:47:34.137 回答
0

尝试使用以下表达式,

p self.view.bounds.size.width

或使用,

po self.view

p - Print 仅用于打印普通/简单值,而 po - Print Object 与 NSLog 相同以打印对象的值

于 2014-09-11T11:58:13.027 回答
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

于 2016-10-30T11:45:42.700 回答