iPhone/iPad故障排除:设备因内存问题崩溃

3

我有一个应用程序,在设备(iPad)上经常崩溃,但在模拟器上没有崩溃,因此任何模拟器调试策略(例如MallocStackLogging)都不是选项。我通常在控制台中得到的是这个:

Received memory warning. Level=1
Received memory warning. Level=2
Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

我的问题是,目前有没有什么方法可以找出导致崩溃的确切原因?显然这是一个内存问题,但我很难找到原因。是泄漏吗?分配过多?除了“使用性能工具>泄漏”之外,我还能做些什么来跟踪问题呢?


为什么你不想使用Leaks工具呢?毕竟这就是它的用途。 - Jesse Naugher
我正在使用Leaks工具。我的问题是是否有其他解决内存问题的方法。或者说,每一个可能的内存问题都可以通过Leaks检测并显示吗? - sol
1
不,Leaks 并不能检测到所有可能的内存问题。它只会标记一些常见的问题,但并不止于此。使用 Allocations 来看到更全面的情况。 - Jon-Eric
2个回答

3

另一个好用的工具是静态分析器。只需在“构建”菜单中点击“构建和分析”,它就会显示出你的许多或者大部分内存泄漏问题。

要了解更多如何阅读结果的解释,请查看苹果开发者文档


1
使用Instruments来查看你的内存消耗情况。
我会从"运行性能工具 -> 分配"开始。
另外,我觉得"泄漏"功能比较保守。我从来没有遇到一个由"泄漏"误报的情况,但是我发现很多"泄漏"没有被检测出来。

1
那么在分配中我要寻找什么?它崩溃时的统计数据如下:实时字节数:23.13 MB,#存活:85455,#短暂:3856520,总字节数:475.43 MB,总共:3941975。这些中有哪些是不好的?似乎它在崩溃之前一直在24-25MB的实时字节附近徘徊。 - sol
首先,请确保您在设备上的发布版本中进行此操作。观察实时字节。25MB非常接近最大值。您可能需要深入挖掘并找出使用所有内存的原因。 - Jon-Eric
Live bytes只有大约10 MB,为什么我会收到低内存警告?我可以确定之所以会收到警告是因为某些视图控制器上调用了viewDidUnload。 - sol
设备内存不足时,您会收到警告。在iOS 4中,可能是其他应用程序仍在使用内存。或者您的应用程序(间接地)已经让操作系统缓存了一些项目(图像)。如果您的应用程序没有被弹出,我不会担心仅仅警告。当它被弹出时,您将获得一个低内存崩溃日志,告诉您您的应用程序实际上使用了多少页面(每个页面为4K)。 - Jon-Eric

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