我试图通过一些时髦的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看看它是否有用,但是在llvmgcc4.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设置为一个类属性并@synthesis它,lldb将获得一个不正确但可预测的值,并且它将myview符号与@synthesis之前最近合成的属性相关联。所以在我的例子中,代码看起来是这样的:
@synthesize myDate=myDate_;
@synthesize myView;
因此,当从LLDB中评估MyVIEW的属性时,它显示了存储在MyDATEY:
(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
)要么是零,要么是被损坏的。
关于objective-c - 为什么使用lldb将有效对象显示为Nil? (Apple LLVM编译器3.1,Xcode 4.3.1),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10252909/