使用自动释放池和环境变量进行调试

Posted

技术标签:

【中文标题】使用自动释放池和环境变量进行调试【英文标题】:Debugging with Autorelease Pool and Environment Variables 【发布时间】:2011-11-07 16:13:48 【问题描述】:

我的项目有调试问题。这个项目不是写得最好的,它有很多内存问题(泄漏,僵尸)。该项目不是我写的,所以我什至不知道其中的“小奇迹”。问题是,在项目的某个地方有一个带有自动释放选项的 NS(Mutable)Array。也许在另一部分给出了一个版本(我找不到确切的代码行,它在哪里)。

当我在设备上运行项目时,打开多个视图后会出现内存警告。 didReceiveMemoryWarning 方法得到了,但 viewDidUnload 没有。

也许项目在给定释放的情况下破坏了该数组,当内存警告出现并破坏自动释放池时,数组保留计数为 -1 => 它是一个僵尸。 问题是,在调试模式下没有显示任何调试行或调用堆栈,只有收到内存警告。

[Classname didReceiveMemoryWarning]

-> 并崩溃。 我启用了环境变量:NSZombieEnabledNSHangOnUncaughtException

NSAutoreleaseFreedObjectCheckEnabled, NSDebugEnabled, MallocStackLogging, MallocStackLoggingNoCompact, NSDeallocateZombies,但没有结果。

你知道我应该怎么做才能找出哪个数组是有罪的(不重写整个项目:P)?

【问题讨论】:

【参考方案1】:

你试过 malloc_history 命令吗?

http://www.cocoadev.com/index.pl?DebuggingAutorelease

【讨论】:

是的...我的项目以 (gdb) 结束行存在,没有其他消息或调用堆栈或任何引用。 我不得不说,真正的问题是这个bug不能在模拟器上重现。我试图获取一些类名,仪器的代码行-分配->启用僵尸检测,但它仅适用于模拟器(我无法收到内存警告),在设备上此选项被禁用。

以上是关于使用自动释放池和环境变量进行调试的主要内容,如果未能解决你的问题,请参考以下文章

自动释放池导致 RubyCocoa 应用程序崩溃

在没有池的情况下自动释放 - 没有启动新线程

为啥 __weak 变量未在自动释放池中注册?

谁调用自动释放池

什么时候触发自动释放池

自动释放池与垃圾收集有啥联系?