如何在Xcode中启用NSZombie?

310

我的一个应用程序在运行时崩溃,但没有错误跟踪信息。如果我进行调试,可以看到部分情况,但无法确定哪个对象正在“僵尸化”。

有人知道如何在Xcode 4中启用NSZombie吗?

15个回答

445

环境变量现在已经成为“scheme”的一部分。

要编辑方案并开启僵尸模式:

  • 在“Product”菜单中,选择“Scheme”>“Edit Scheme...”。

  • 在左侧面板中进入“Run Foo.app”阶段,在右侧进入“Arguments”选项卡。

  • NSZombieEnabled添加到“环境变量”部分,并将其值设置为YES,就像在Xcode 3中一样。


在Xcode 4.1及以上版本中,在“运行”阶段的“诊断”选项卡上还有一个复选框,“启用僵尸对象”。


使用Xcode 6.4:

Screenshot


5
调用已释放对象时不崩溃,有什么办法可以实现这一点吗? - jjxtra
97
在4.2版本中又有所变化,请参阅下面的回答。前往“产品”->“编辑方案”->“诊断”。 - Moshe Kravchik
在Xcode中,打开顶部的帮助菜单(最右边的一个),搜索“编辑方案”,它会在任何版本中都指引你正确的方向。 - unom
如果我们在应用程序中启用NSZombieEnabled功能,那么我们是否可以将应用程序发布到商店?因为我看到有一篇帖子说,当我们启用此功能时,将应用程序发布到商店不是一个好的做法。 - SURESH SANKE
2
对于后来的新手,在Xcode 6.1中,您需要进入菜单Product> Scheme-Edit Scheme>Diagnostics选项卡>勾选启用Zombie对象。 - Joshua Dance

146

我也遇到了调试EXC_BAD_ACCESS的问题,在使用带iOS5 SDK的Xcode 4.2时,花费了很长时间才找到设置。苹果不断地移动东西,这些设置已经不在它们原来的地方了。

幸运的是,我找到了解决方法,并且不仅适用于模拟器,也适用于设备。你需要打开Xcode的“Product”菜单,选择“Edit scheme”,然后选择“Diagnostics”标签页。在那里你会看到“Enable Zombie Objects”。一旦选中并在调试器中运行,就会指向重复释放的对象!享受吧!

简而言之

Product->Edit Scheme->Diagnostics-> Click Enable Zombie Objects

2
在Xcode中,打开顶部的帮助菜单(最右边的一个),搜索“编辑方案”,它会在任何版本中都指引你朝着正确的方向前进。 - unom

43

产品 > 简介将启动工具,然后应该有一个名为“Zombies”的“Trace Template”。但是此跟踪模板仅在当前构建目标为模拟器时才可用-如果您将目标设置为iOS设备,则不可用。

还要注意的另一件事是,在工具库中实际上没有“Zombies”工具。实际上,“Zombies”跟踪模板包含了启用“NSZombie检测”的配置的“Allocations”工具。


13
然而,只有当前的构建目标是模拟器时,才能使用此跟踪模板。 - ajh158
在Xcode中,打开顶部的“帮助”菜单(最右边的一个),搜索“编辑方案”,它会在任何版本中都指引你朝正确的方向前进。 - unom

25
这很简单,只需在可执行文件上设置一个环境变量(NSZombieEnabled = YES),然后像平常一样运行/调试你的应用程序。如果消息发送到一个"僵尸对象",你的应用程序将崩溃/中断到调试器,并为你记录一个NSLog消息。
欲了解更多信息,请查看 CocoaDev 页面: http://www.cocoadev.com/index.pl?NSZombieEnabled 而且,随着10.6和Xcode以及Instruments的下一个版本的发布,这个过程将变得更加容易。只是这么说。=)

完全同意。新的Zombies工具非常不错。 - Quinn Taylor

22

在产品 > 概要资料中,会弹出仪器选项。从面板中选择僵尸,并疯狂操作。


5
@jluebbert 我会说再努力一点,因为我肯定看到了,我正在运行Xcode 4.02。 - pseudosudo

17

前往 产品 - 架构 - 编辑架构 - 参数 - 环境变量,设置NSZombieEnabled = YES

输入图像描述

输入图像描述


12

在xcode 4.2中

前往:Product(产品) -> 编辑方案 -> 点击运行“yourappname.app” -> 诊断 -> 启用僵尸对象。


11

6

从 Xcode 3.2.5 和 Snow Leopard(Mac OS X 10.6)开始,你可以使用 Zombies 工具来运行代码:运行 > 运行性能工具 > Zombies。这可以让你在时间线上查看特定对象及其保留计数。


1
我可以看到“僵尸”选项,但它是灰色的。你知道如何启用它吗? - Rahul Vyas
@RahulVyas,我以前从未见过这种情况,但是你是否已经开启了垃圾回收?在那种情况下,我可以理解Zombies没有意义。 - Dov
我已经在设置中打开了垃圾回收,它显示支持[-fobjc-gc],但该选项仍然被禁用。实际上,在仪器类别中只有最后5个选项是启用的。还有其他想法吗?或者我做错了什么? - Rahul Vyas
@RahulVyas: 不好意思,为了更清楚明白,我想关闭垃圾回收可能会导致僵尸进程,因为我认为在有垃圾回收机制的情况下是不可能有僵尸进程的。如果这样仍然无法解决问题,我建议阅读Instruments文档(他们对每个工具都有很好的介绍),如果你还没有得到答案,请在这里发布问题以获得更广泛的关注(最终得到答案)。 - Dov

4
在Xcode 4.5.2中,前往“Product” -> “Edit Scheme” -> 在“Diagnostics”标签下勾选Objective C和Enable Zombie Objects之间的复选框,然后点击“OK”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接