为什么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控制台中的打印命令错误。
答案 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" (打印对象)命令。