7

我正在尝试通过一些时髦的 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 值,所有其他属性显示在它之前合成的值。

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

4

3 回答 3

8

确保您的 Build Configuration 设置为 Debug 而不是 AdHoc、Release 或其他去除调试符号或不允许在权利文件中进行调试的东西。

这让我很生气,因为在为我的设备创建临时构建后,我忘记将配置切换回调试。奇怪的是,大多数应用程序都能正常工作,但某些堆栈帧会默默地、莫名其妙地失败,所有变量(包括self)要么为零,要么被破坏。

于 2012-05-31T04:06:17.643 回答
0
frame variable -o myView

在“检查堆栈帧状态”标题下有更多信息。

于 2012-04-20T20:20:54.780 回答
0

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

于 2012-04-23T12:23:00.387 回答