Xcode调试器不会打印对象,并且在不显示对象时显示nil


165

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

屏幕截图

错误:无法实现结构:变量<varName>的大小与ValueObject的大小不一致在Execute中出错,无法PrepareToExecuteJITExpression

Xcode调试器还会将所有未显示的对象显示为nil(已self排除)(NSLog显示正确的输出,如图中所示)。我不知道该项目出了什么问题。其他所有项目都可以正常工作。

知道会是什么吗?(清洁项目无效。)


对我来说,这听起来像是某种指针问题,但是我敢肯定,老实说。您想做什么/完成什么?
user2967030

3
该项目的每个对象上都会发生错误。甚至NSString在断点上方创建了一行!
Binarian

1
正如在质询时说,清洁并不能改变什么;(,但感谢尝试添加了错误信息。
Binarian

3
您确定要在没有优化的情况下进行构建吗?(-O0)
iccir

1
优化不仅可以在项目设置中设置,还可以在目标中设置。有卡住了:(
罗勒

Answers:


269

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

如果要查看变量值,则必须处于“调试模式”(在开始/停止按钮附近单击左上角的项目名称,然后单击“编辑方案...”,然后单击“运行”设置,然后单击“信息”标签,然后是“构建配置”。在此设置“调试”。如果问题是在“发布”上,那么您将看到所有nil。


3
我只有一个配置,如何更改配置,使其像一个debug configuration
Binarian

2
好的,我创建了一个空项目,现在可以看到中的所有差异Build Settings,将部署属性Strip debug symbols during copy设置为YES。
Binarian

16
@ Alex1987我设置Strip debug symbols during copyNOOptimization LevelNone -O0项目Build Settings
Binarian

32
不幸的是,在某些情况下,lldb在调试模式下会执行此操作,并且关闭优化并显示调试符号。是时候访问bug report.apple.com
ctpenrose,2014年

4
遇到相同的问题-优化级别为“无”。问题是对于调试模式,链接时间优化(LTO)也设置为“是”。
pi3 2014年

38

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


2
好笑,那没用。我做了相反的事情。我切换到Fastest, Smallest[-Os]它,并且有效。
Nate Hat

许多不同的建议,但是这一建议(将“调试优化”设置为“无”)对我来说是固定的。
Dejal 2015年

29

确保在“方案”设置中关闭了“地址清理器”。Address Sanitizer无法与调试器一起很好地工作。

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

在此处输入图片说明


4
这是我的解决方案。显然有很多原因会导致这种情况发生。
manroe 2015年

16

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

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

首先,前往TARGETS -> Build Settings并搜寻code generation

您会发现Apple LLVM 6.0Swift Compiler

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

令人惊讶的是,一旦看到该值,便可以永久解决此问题,然后可以将其更改Optimization Level为以前的值。


11

还有其他方式可以发生这种情况。对我而言,这是因为即使对于调试版本,“ Other C Flags”值也被设置为“ -O2”。为调试版本关闭此功能可解决此问题。


9

过滤后的调试输出

对我来说,Xcode正在过滤调试器的输出。确保您的输出设置是Debugger Output或All Output


6

我刚遇到此问题,发现这是因为Deployment Postprocessing = YES在“构建设置”中。

对其进行更改以进行NO修复,如下面的屏幕截图所示:

在此处输入图片说明

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


5

我遇到了一个类似的问题:突然,Xcode调试器突然将某些对象类型(特别是NSStrings)打印为(空),尽管它们是使用值初始化的。通过打印

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

显示了该对象的正确值。

令人困惑!解决问题非常容易:我只是关闭Xcode并重新启动计算机。重新启动Xcode之后,一切再次正常:)。


5

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


我只是在Xcode 8中仅在我的动态框架构建设置上遇到了这个问题!Thx
vmeyer '16

3
  1. 删除衍生数据
  2. 相当Xcode /重新启动
  3. 清洁项目

这就是我所需要的。


2

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

对我而言,解决方案是前往Build Settings并搜索Optimization Level并确保将每个Debug设置都设置为None


这实际上为我解决了。知道禁用设置的不利之处吗?
贾斯珀(Jasper)2015年


0

我也遇到了这个问题,当我发现我处于发布模式时,我切换到调试...没有修复方法。事实证明,我必须先清洁(cmd + shift + k)。

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


-3

现实情况是,该系统应该开箱即用,而不是由于链接到多个不同的设置而导致事情可能对您不起作用。

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

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

如果直接针对模拟器或设备进行编译,则无需担心这些额外的兆​​字节。

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

另外,对我来说,有效的方法是将链接时间优化从“ Monolithic”更改为“ No”(xcode 8)。


Xcode中=没有包管理器出来的意志箱,自动完成和其他功能的工作,编译时间是巨大的,等等
zirinisp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.