为什么有效对象使用lldb显示为Nil?(Apple LLVM编译器3.1,Xcode 4.3.1)

All*_*tor 7 xcode objective-c 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>>
Run Code Online (Sandbox Code Playgroud)

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

(lldb) po myView
(MyView *) $552 = 0x00000000 <nil>
Run Code Online (Sandbox Code Playgroud)

我会尝试转移到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>>
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?我甚至尝试过self-> myView,它也没用.

更新:(它变得更糟!)

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

@synthesize myDate=myDate_;
@synthesize myView;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这就像LLDB本身的一个非常明显的错误.

更新2:

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

这可能是一个奇怪的配置错误?

小智 8

确保您的Build Configuration设置为Debug而不是AdHoc,Release或其他删除调试符号或禁止在权利文件中调试的内容.

这只是我的意思,因为在为我的设备创建临时构建后,我忘了将配置切换回Debug.奇怪的是,大多数应用程序都可以工作,但某些堆栈框架会无声地且无法解释地失败,所有变量(包括self)都是零或损坏.


All*_*tor 0

解决方案似乎是:尝试使用调试器时避免在模拟器中进行测试。一旦我开始在设备上进行测试,所有的疯狂都消失了,它开始按预期工作。如果我回到模拟器,我会再次看到同样的错误。属性和方法变量似乎在模拟器中都有问题。