objective-c - 为什么使用 lldb 时有效对象显示为 Nil? (苹果 LLVM 编译器 3.1,Xcode 4.3.1)

标签 objective-c xcode nslog lldb

我正在尝试通过一些奇怪的 UIView 行为进行调试,但我一直遇到 LLDB 绝对无用且具有误导性的情况。让我告诉你我的意思:

NSLog(@"myView: %@", myView);

2012-04-20 15:24:57.070 myProj[35789:f803] myView: <MyView: 0x7cc7500; frame = (0 119; 768 885); layer = <CALayer: 0x7cc8030>>

但是当我在那一刻设置断点并尝试使用调试器时,它返回 nil:

(lldb) po myView
(MyView *) $552 = 0x00000000 <nil>

我会尝试转移到 GCC 4.2 看看它是否有帮助,但在 LLVM GCC 4.2 下编译不是一个选项,因为这是一个 ARC 项目。

当然,如果我已经知道要查询的正确地址,LLDB 就可以工作。但是符号名称和地址之间的链接对于某些对象来说似乎是断开的,尽管它适用于大多数其他对象。

(lldb) po self
(MyViewController *const) $51 = 0x07e92200 <MyViewController: 0x7e92200>
(lldb) po myView
(MyView *) $25 = 0x00000000 <nil>
2012-04-20 15:44:17.250 myProject[37551:f803] myView: <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>
(lldb) po 0x7e8e240
(int) $50 = 132702784 <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>

我该如何解决这个问题?我什至尝试过 self->myView,它也没有用。

更新:(情况变得更糟了!)

我应该补充一点,在这个例子中,myView 是一个类变量,而不是一个属性(其中 lldb 将它与 nil 相关联)。 如果我将 myView 设为类属性并对其进行@synthesize,lldb 将获得一个不正确但可预测的值,并且它将 myView 符号与 @synthesize 之前最近合成的属性相关联。所以在我的例子中,代码看起来像这样:

@synthesize myDate=myDate_;
@synthesize myView;

因此,当从 LLDB 评估 myView 的属性时,它会显示存储在 myDate_ 中的日期:

(lldb) po myView
(MyView *) $24 = 0x07ca0900 2008-01-08 05:00:00 +0000

在最后一种情况下,如果我将 myView 设为方法变量,LLDB 将是正确的:

(lldb) po myView
(UIView *) $7 = 0x07d81080 <MyView: 0x7d81080; frame = (0 119; 768 885); layer = <CALayer: 0x7d81b70>>

这听起来像是 LLDB 本身的一个非常明显的错误。

更新 2:

进一步研究:看起来所有的类属性都是错误的!列表中的第一个属性在 LLDB 中显示为 nil 值,所有其他属性显示在它之前合成的值。

这会不会是一个奇怪的配置错误?

最佳答案

确保您的构建配置设置为“调试”,而不是“临时”、“发布”或其他删除调试符号或禁止在授权文件中进行调试的设置。

这让我很生气,因为我在为我的设备创建临时构建后忘记将配置切换回调试。奇怪的是,大多数应用程序都可以运行,但某些堆栈帧会无声且莫名其妙地失败,所有变量(包括 self)要么为 nil 要么被损坏。

关于objective-c - 为什么使用 lldb 时有效对象显示为 Nil? (苹果 LLVM 编译器 3.1,Xcode 4.3.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252909/

相关文章:

objective-c - 苹果操作系统 X : How to force a Field Editor to scroll instead of wrap text?

iphone - 为什么 iOS 没有自动垃圾回收?

iphone - OpenCv - iOS MapKit 冲突

objective-c - xCode 说当我检查对象时该对象可能不会响应选择器

ios - 当我的应用程序存档为临时时,如何查看我的应用程序执行的 nslog

ios - 使用 Cloud Code Parse.com iOS 删除 PFUser

ios - 使用 convertToWorldSpaceAR 翻译 CCNode 时遇到问题

xcode - 'self' 未设置为 '[(super or self) init...]' 的结果时使用的实例变量

ios - NSLog/Log4Cocoa 控制台日志需要保存在文件中

ios - NSLog - 如何打印对象名称?