【问题标题】:Why does Xcode/lldb display wrong data?为什么 Xcode/lldb 显示错误的数据?
【发布时间】:2015-02-09 21:54:28
【问题描述】:

为什么 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 控制台中的打印命令是错误的。

【问题讨论】:

    标签: xcode lldb


    【解决方案1】:

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

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

    那一点琐事可能对您没有多大帮助,但这就是为什么您可以从运行完全通用表达式解析器和 Xcode 本地视图的“打印”中获得不同结果的原因...

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

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

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

    注意,虽然 iOS 模拟器运行的是 32 位代码,但它使用的是 ObjectiveC 2.0 运行时,并且没有这个 bug。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这无关紧要。查看显示的地址。他们错了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多