在没有NSZombie的情况下追踪EXC_BAD_ACCESS?

时间:2010-06-24 15:48:20

标签: iphone debugging crash exc-bad-access nszombie

我花了两天时间在这上面,我仍然找不到崩溃的原因。

我知道它与尝试访问已释放的对象有关,但我不知道哪个访问权限或哪个对象。

每当我谷歌试图找到EXC_BAD_ACCESS的来源时,人们建议使用NSZombies。问题是当我启用僵尸时(通过环境变量在xcode中或通过ObjectAlloc属性在仪器中),程序不会在通常情况下崩溃,并且僵尸不会报告任何内容(日志中没有任何内容显示,并且没有任何标记在仪器)。 NSZombie有什么我想念的吗?

我尝试过利用xcode的调试器和工具中的ObjectAlloc中的一些信息,但所有信息都非常神秘,并没有真正帮助我。

我已将调试器设置为停止在objective-c异常上。当它这样做时,这是显示的调用堆栈:

0 objc_msgSend
1 ??
2 -[UITableViewCell removeFromSuperView]
3 -[UIView dealloc]
... etc ...

首先,与'1 ??'有什么关系? ?问号是什么意思?其次,我怎么知道在我的代码中调用它的位置?所说的所有操作都过于通用(例如UIView dealloc,但是UIView?还有哪些?)。

此外,当异常发生时,它指向汇编代码,除非我花费数小时试图找出代码的作用,否则这对我没有任何帮助。我知道一些汇编,但 是更好的方式......对吧?

有没有什么方法可以获得有关在异常发生之前我的代码中运行的最后一行是什么的有意义的信息?

我尝试过喷洒一些NSLog和断点,但它对我没什么帮助,因为在之后发生了崩溃我从导航控制器弹出一个视图控制器。无论我在哪里放置断点,都可以达到断点(在崩溃后我无法找到打破的点)。只有当我在调试器中“继续”发生异常时。就好像崩溃发生在我的代码之外,所以我不知道在哪里可以处理它。

我查看了我的代码并仔细检查了我是否遵守了所有内存管理规则(至少据我所知)。我确信这是非常微妙的,但我似乎无法找到它。

如果有人有任何想法如何在没有NSZombie的情况下找到这样的错误请分享。

感谢。

1 个答案:

答案 0 :(得分:1)

我找到了问题。我有一个自定义表格单元类,我在dealloc方法中首先调用[super dealloc](而不是最后一个)。我想我赶紧写这个课,并没有真正想到它。我猜是孩子在释放时需要释放的东西?

所以我对自己的问题没有真正的答案,但基本上我发现了使用ad-hoc代码跟踪和各种调试技术(断点,NSLog,尝试decypher隐藏堆栈跟踪等)的组合的问题。

实际上,帮助我的主要策略是逐位评论代码,直到我将问题区域简化为尽可能简单,同时仍保持崩溃完好无损。这让我意识到问题不是我想的那样,而是在一个更微妙的领域(例如在这种情况下在二级类的dealloc方法中)。

我希望这可以帮助某人。我会在没有依赖NSZombies的情况下让某个人有更彻底的调试策略来解决这个问题。此外,如果有人能够澄清这两个问号在堆栈跟踪中的意义,那将会有所帮助。