打印双类型结构成员时LLDB中的奇怪行为
在某些iOS代码中,我在一个对象上有一个C struct
ivar。 此结构的一个成员是double
类型。 如果我在一个方法中,分配给这个struct
成员,当我打印struct
本身时,调试器会报告这个struct
成员的值的虚假值(就像变量的列表视图一样),但是当我直接打印struct
成员时, ( p structWithDouble.doubleMember
),我得到了正确的值。 此外,如果我将此成员的值分配给本地自动double
变量,我会在列表视图中和打印时看到正确的值。
我认为这是LLDB的一个问题,但令人不安和令人沮丧。 这是一个已知的问题? 如果是这样,有解决方法吗?
例子
typedef struct { double doubleMember; } structWithDouble; @interface MyClass : NSObject { structWithDouble structAsIvar; } @end @implementation - (void)someMethod { structAsIvar.doubleMember = 200.0; double localDouble = structAsIvar.doubleMember; }
在someMethod:
,调试器变量列表显示以下值:
structAsIvar.doubleMember (double) 1.65865e-307 localDouble (double) 200
在LLDB中,在someMethod:
中断时,我得到以下输出:
(lldb) p structAsIvar.doubleMember (double) $4 = 200 (lldb) p structAsIvar (structAsIvar) $5 = { (double) doublemember = 1.17244e-312 } (lldb) p localDouble (double) 200 (lldb) p self->structAsIvar.doubleMember (double) 200
更新
我发现使用GDB时不会发生这种情况。 显然LLDB尚未准备就绪……但我仍然对LLDB的解决方案感兴趣。
它看起来像是在Xcode 4.5的lldb(lldb-167.2)中修复的:
(lldb) p structAsIvar.doubleMember (double) $5 = 200 (lldb) p structAsIvar (structWithDouble) $6 = { (double) doubleMember = 200 } (lldb) p localDouble (double) $7 = 200 (lldb) p self->structAsIvar.doubleMember (double) $8 = 200 (lldb)
我不确定哪个版本有修复; 它可能Xcode 4.4也可以正常工作,但我现在没有那个可以测试。