为什么Xcode/lldb显示错误的数据?

为什么Xcode/lldb显示错误的数据?,xcode,lldb,Xcode,Lldb,为什么不管我要求哪个ivar,lldb都坚持打印错误的数据——第一个ivar的值?这是Xcode 5.1.1。是的,我是用-O0编译的,符号没有剥去,等等 (lldb)打印*self (SMTestHarness)$13={ NSObject={ isa=SMTestHarness } _dir=0x00740520@“/Users/lc/Projects/servermonitor/Test/unittest” _ip=0x007406b0 _域=0x007429f0 _sm=0x00676

为什么不管我要求哪个ivar,lldb都坚持打印错误的数据——第一个ivar的值?这是Xcode 5.1.1。是的,我是用-O0编译的,符号没有剥去,等等


(lldb)打印*self
(SMTestHarness)$13={
NSObject={
isa=SMTestHarness
}
_dir=0x00740520@“/Users/lc/Projects/servermonitor/Test/unittest”
_ip=0x007406b0
_域=0x007429f0
_sm=0x00676900
_状态=0x00741980
_dsaSimulators=0x00741d10 5个键/值对
_计时器=0x00741f50 2个对象
_originalWd=0x007403f0@“/用户/lc/Project/servermonitor/Test”
}
(lldb)打印目录
(NSString*)$14=0x00740520@“/Users/lc/Projects/servermonitor/Test/unittest”
(lldb)打印
(IPAddress*)$15=0x00740520
(lldb)打印_域
(FirstPointDomain*)$16=0x00740520
(lldb)打印
(ServerMonitorCrashTestDummy*)$17=0x00740520


有趣的是,左侧窗格中的变量显示是正确的;只有lldb控制台中的打印命令是错误的。

如果要打印对象,请使用“po”(打印对象)命令。

Xcode中的变量视图不使用lldb表达式解析器(即
打印
命令)这主要是因为每次执行步骤时都必须解析每个局部变量及其子元素的表达式是非常低效的。即使没有这一点,一个完整的表达式解析器也比转储局部变量值的任务需要更强大的火力

相反,lldb有另一个子系统,仅用于转储变量的内容(无需调用函数或复杂表达式,只需打印值)。从命令行lldb,您可以使用
frame variable
命令访问该子系统

这些琐事可能对您帮助不大,但这就是为什么您可以从运行完全通用表达式解析器和Xcode局部视图的“print”中获得不同的结果

然而,您看到的是,lldb表达式解析器没有正确地获取其包含的ObjC对象中各个IVAR的偏移量值。表达式解析器认为所有IVAR与对象开始的偏移量均为0,这实际上就是您的示例所示。更具体地说,从您包含的示例来看,在使用Objective C运行时的1.0版本调试32位应用程序时会发生这种情况

这是lldb中一个长期存在的bug

如果您必须调试ObjectiveC 1.0 32位x86应用程序,则没有好的解决方法。如果您有一台32位的纯机器,那么您几乎被困在这里,必须使用
frame var
。但是如果你有一台64位的机器,除非有非常令人信服的理由去调试应用程序的32位fork,你可以转而调试64位版本的应用程序,这个问题应该会消失


请注意,尽管iOS模拟器运行32位代码,但它使用ObjectiveC 2.0运行时,并且没有此错误。

这与此无关。查看显示的地址。他们错了。