Xcode 调试器不打印对象,如果不打印对象,则显示 nil

当试图用 po <objectName>打印一个对象时,Xcode 显示一个错误,但仅适用于一个项目。

Screenshot

错误: 无法具体化 struct: size 变量 < varName > 与 ValueObject 的 size 不一致 在 Execute 中出错,无法准备到 ExecuteJITExpression

Xcode 调试器还将所有对象显示为 nil(不包括 self) ,当它们不是 nil时(如图所示,NSLog显示正确的输出)。 我不知道这个项目出了什么问题,其他的项目都很好。

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

64177 次浏览

你确定你没有进入“发布模式”吗?

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

还有其他方式可能发生这种情况。对我来说,这是因为“ Other C Flags”值被设置为“-O2”,即使是在调试构建中也是如此。为调试版本关闭此选项解决了这个问题。

我刚刚遇到这个问题,发现这是因为构建设置中的 Deployment Postprocessing = YES

改为 NO修正了这个问题,如下面的截图所示:

enter image description here

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

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

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

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

我刚刚遇到了一个类似的问题: 在某个时刻,Xcode 调试器突然打印出一些对象类型,特别是 NSStrings (null) ,尽管它们是用一个值初始化的。打印出来的

NSLog(@"String value: %@", myString);

显示了对象的正确值。

我糊涂了! 解决这个问题相当容易: 我只需关闭 Xcode 并重新启动我的计算机。在我重新启动 Xcode 之后,一切又恢复正常了:)。

似乎每个人都有自己的解决办法。

对我来说,我同时使用 Objective-CSwift

首先,进入 TARGETS -> Build Settings并搜索 code generation

你会发现 Apple LLVM 6.0Swift Compiler

将它们的 Optimization Level全部更改为 None,然后进行调试,您可能会发现该值不是 nil

令人惊讶的是,一旦您看到了这个值,您就可以永久地解决这个问题,然后您可以将 Optimization Level更改为以前的值。

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

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

确保在您的方案设置中关闭了地址消毒器。地址消毒程序与调试器不能很好地协同工作。

  1. 转到 Edit Scheme (Product > Scheme > > Edit Scheme) ,选择 Run,然后转到 Diagnostics 选项卡。
  2. 确保“启用地址消毒程序”关闭。

enter image description here

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

确保生成设置中的调试模式为 Link-Time Optimization = No

现实情况是,系统应该开箱即用,而不是由于链接到多个不同的设置,以至于事情可能适合你,也可能不适合你。

为什么系统不总是允许调试时,在调试模式是一个谜,只有苹果可以回答(如果他们关心,我最近怀疑他们这样做)。

毕竟,调试与非调试之间的区别在于,额外的表中的元数据只能填充内存/磁盘空间。

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

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

另外,对于我来说,在“调试”中起作用的是将链接时间优化从“单一”改为“否”(xcode 8)。

Filtered debug output

对我来说,Xcode 过滤掉了调试器的输出。确保输出设置为“调试器输出”或“全部输出”

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

所以我认为在内置发布模式之后,并不是所有内容都在 development 中重新编译,所以 lldb 无法正确地读取这些符号。经过清洗和重新编译在开发它为我工作。

  1. 删除派生数据
  2. 相当 Xcode/Restart
  3. 清洁工程

对我来说就是这样。

我在这个问题上运行时,一些依赖项被添加到一个非常特定的方式-它的工作,但是当您尝试打印的东西从这个框架你得到 error

解决方案是以通用方式添加此依赖项