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

时间:2015-02-09 21:54:28

标签: xcode lldb

为什么lldb坚持打印错误的数据 - 第一个ivar的价值,无论我要求哪个ivar?这是Xcode 5.1.1。是的,我正在使用-O0编译,符号未被删除等等。

(lldb) print *self (SMTestHarness) $13 = { NSObject = { isa = SMTestHarness } _dir = 0x00740520 @"/Users/lc/Projects/servermonitor/Test/unit-test" _ip = 0x007406b0 _domain = 0x007429f0 _sm = 0x00676900 _state = 0x00741980 _dsaSimulators = 0x00741d10 5 key/value pairs _timers = 0x00741f50 2 objects _originalWd = 0x007403f0 @"/Users/lc/Projects/servermonitor/Test" } (lldb) print _dir (NSString *) $14 = 0x00740520 @"/Users/lc/Projects/servermonitor/Test/unit-test" (lldb) print _ip (IPAddress *) $15 = 0x00740520 (lldb) print _domain (FirstPointDomain *) $16 = 0x00740520 (lldb) print _sm (ServerMonitorCrashTestDummy *) $17 = 0x00740520

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

2 个答案:

答案 0 :(得分:1)

Xcode中的变量视图并不使用lldb表达式解析器(即print命令。)主要是因为必须解析每个局部变量的表达式并且非常低效。每当你踏步时它的子元素。即使没有这个,一个完整的表达式解析器比转储局部变量值的任务需要更多的火力。

相反,lldb有另一个子系统,只是为了转储变量的内容(没有调用函数或复杂的表达式,只打印值。)从命令行lldb,你可以使用frame variable获得该子系统命令。

这一点琐事可能对你没什么帮助,但这就是为什么你可以从" print"它运行完全通用的表达式解析器和Xcode本地视图......

然而,您所看到的是lldb表达式解析器并未获得其包含的ObjC对象内的各个ivars的偏移值。表达式解析器认为所有的ivars都偏离了对象的开始 - 这实际上就是你的例子所示。更具体地说 - 从您包含的示例 - 使用1.0版本的Objective C Runtime调试32位应用程序时会发生这种情况。

这是lldb中长期存在的错误。

如果您必须调试ObjectiveC 1.0 32位x86应用程序,则没有一个好的解决方法。如果你有一台32位的机器,那么你几乎被困在这里,并且必须使用frame var。但是如果你有一台64位的机器,除非有一些非常有说服力的理由来调试应用程序的32位分支,你可以转而调试64位版本的应用程序,而这个问题应该走开。

请注意,虽然iOS模拟器运行32位代码,但它使用的是ObjectiveC 2.0运行时,并没有出现此错误。

答案 1 :(得分:0)

如果您正在打印物体,请使用" po" (打印对象)命令。