【问题标题】:Xcode debugger doesn't print objects and shows nil, when they aren'tXcode 调试器不打印对象并显示 nil,当它们不是时
【发布时间】:2013-11-21 02:51:45
【问题描述】:

Xcode 在尝试使用 po <objectName> 打印对象时显示错误,但仅限于一个项目。

错误:无法实现结构:变量 的大小与 ValueObject 的大小不一致 执行时出错,无法 PrepareToExecuteJITExpression

Xcode 调试器还会将所有对象显示为nil(self 除外),而它们不是(NSLog 显示正确的输出,如图所示)。 我不知道这个项目有什么问题。其他所有项目都运行良好。

知道它可能是什么吗? (清理项目没有效果。)

【问题讨论】:

  • 对我来说,这听起来像是某种指针问题,但我敢肯定说实话。你想做什么/完成什么?
  • 该项目的每个对象都发生错误。甚至NSStrings 在断点上方创建了一行!
  • 正如问题中所说,清洁不会改变任何东西;(,但感谢您的尝试。添加了错误消息。
  • 你确定你是在没有优化的情况下构建的吗? (-O0)
  • 优化不仅可以在项目设置中设置,也可以在目标中设置。有 m 卡住了 :(

标签: ios objective-c xcode debugging


【解决方案1】:

我已将调试配置的“优化级别”设置为“无”,它解决了问题。

  • 转到项目Build settings
  • 搜索Debug
  • 在Apple Clang - Code Generation 下勾选Optimization Level
  • 将Debug 设置为None [-OO]

之后,您将能够在调试区域或控制台中看到变量值。

【讨论】:

  • 有趣的是,这没用。我反其道而行之。我切换到Fastest, Smallest[-Os] 并且成功了。
  • 很多不同的建议,但这个(将调试优化设置为无)为我修复了它。
【解决方案2】:

当以非常特定的方式添加一些依赖项时,我遇到了这个问题 - 它可以工作,但是当您尝试从该框架打印某些内容时,您会得到 error

解决方案是以一般方式添加此依赖项

【讨论】:

    【解决方案3】:
    1. 删除派生数据
    2. 相当 Xcode / 重启
    3. 清理项目

    这就是我所需要的。

    【讨论】:

      【解决方案4】:

      我也遇到过这种情况,当我发现我处于发布模式时,我切换到调试......没有修复。原来我必须先做一个干净的 (cmd+shift+k)。

      所以我认为在构建发布模式后,并非所有内容都在开发中重新编译,因此 lldb 无法正确读取符号。在开发环境中清理和重新编译后,它对我有用。

      【讨论】:

        【解决方案5】:

        对我来说,Xcode 过滤掉了调试器的输出。确保您的输出设置为调试器输出或所有输出

        【讨论】:

          【解决方案6】:

          现实情况是,系统应该开箱即用,而不是因为链接到多个不同的设置,所以事情可能对你有用,也可能不适用。

          为什么系统不允许在调试模式下始终进行调试是一个只有 Apple 才能回答的谜(如果他们关心的话,最近我怀疑他们会这样做)。

          毕竟,debug / non-debug 的区别在于带有元数据的额外表只填充内存/磁盘空间。

          如果您直接针对模拟器或设备进行编译,您将不会关心那些额外的兆​​字节。

          所以我们需要运行额外的循环来做一个非常基本和简单的事情,我自上个世纪以来所知道的所有 ide 都做得很好。

          补充一点,对我来说,“调试”链接时间优化从“单片”更改为“否”(xcode 8)。

          【讨论】:

          • Xcode = 没有现成的包管理器,自动完成和其他功能可以正常工作,编译时间很长,等等。
          【解决方案7】:

          确保 Link-Time Optimization = No 在构建设置中用于调试模式。

          【讨论】:

          • 我只是在 Xcode 8 中遇到这个问题,只是在我的动态框架构建设置中!谢谢
          【解决方案8】:

          在构建设置中转到“其他 C 标志”并将调试值从 -o2 设置为 -O0

          【讨论】:

            【解决方案9】:

            确保在您的 Scheme 设置中关闭了 Address Sanitizer。 Address Sanitizer 不适用于调试器。

            1. 转到编辑方案(产品>>方案>>编辑方案),选择运行,然后转到诊断选项卡。
            2. 确保“启用地址清理程序”已关闭。

            【讨论】:

            • 这是我的解决方案。显然,发生这种情况的原因有很多。
            【解决方案10】:

            这里的解决方案还将修复您每次尝试po 变量时看到error: <EXPR>:1:1: error: use of unresolved identifier 的错误。

            对我来说,解决方案是转到 Build Settings 并搜索 Optimization Level 并确保每个 Debug 设置都设置为 None。

            【讨论】:

            • 这实际上为我修复了它。知道禁用该设置有什么缺点吗?
            【解决方案11】:

            似乎每个人都有自己的解决方案。

            对我来说,我同时使用Objective-C 和Swift。

            首先,去TARGETS -> Build Settings搜索code generation

            您会找到Apple LLVM 6.0 和Swift Compiler

            把他们的Optimization Level全部改成None,然后Debug,你可能会发现值不是nil

            令人惊奇的是,一旦您看到该值,您就可以永久解决此问题,然后您可以将 Optimization Level 更改为以前的状态。

            【讨论】:

              【解决方案12】:

              我刚刚遇到了一个类似的问题:Xcode 调试器突然打印出一些对象类型,尤其是 NSStrings 为 (null),尽管它们是用一个值初始化的。通过

              打印出来
              NSLog(@"String value: %@", myString);
              

              显示了对象的正确值。

              令人困惑! 解决这个问题相当容易:我只是关闭了 Xcode 并重新启动了我的计算机。在我重新启动 Xcode 后,一切都恢复正常了 :)。

              【讨论】:

                【解决方案13】:

                刚遇到这个问题,发现是因为Build Settings里面的Deployment Postprocessing = YES。

                将其更改为 NO 已修复此问题,如下面的屏幕截图所示:

                Xcode 版本:OSX 10.9.5 上的 6.0.1 (6A317)

                【讨论】:

                  【解决方案14】:

                  还有其他可能发生这种情况的方式。对我来说,这是因为“其他 C 标志”值设置为“-O2”,即使是在调试版本中也是如此。为调试版本关闭此功能可解决此问题。

                  【讨论】:

                    【解决方案15】:

                    您确定您没有处于“发布模式”吗?

                    如果您想查看变量值,您必须处于“调试模式”(单击左上角靠近开始/停止按钮的项目名称,然后单击“编辑方案...”,然后单击“运行”设置,然后是“信息”选项卡,然后是“构建配置”。这里设置“调试”。如果它是在“发布”上,那就是你看到所有空值的问题。

                    【讨论】:

                    • 我只有一个配置,如何更改配置使其像debug configuration?
                    • 啊,好吧,我创建了一个空项目,现在可以看到Build Settings 中的所有差异,部署属性Strip debug symbols during copy 设置为YES。
                    • @Alex1987 我在项目Build Settings 中将Strip debug symbols during copy 设置为NO 并将Optimization Level 设置为None -O0
                    • 不幸的是,在某些情况下,lldb 在调试模式下一直这样做,优化关闭,并​​且存在调试符号。是时候访问 bug report.apple.com
                    • 遇到了同样的问题 - 优化级别为“无”。问题是链接时间优化 (LTO) 也设置为“是”以用于调试模式。
                    猜你喜欢
                    • 2013-10-01
                    • 1970-01-01
                    • 2014-10-20
                    • 1970-01-01
                    • 2011-11-04
                    • 2022-11-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-21
                    相关资源
                    最近更新 更多