正如标题所说,我有一个适用于iPad 2的应用程序,但在iPad 3上崩溃。在运行时,控制台给我一个低内存警告消息。当崩溃发生时我会对它进行符号化,但实际上并没有什么可以与代码相关联,就像它显示的那样
process name, UUID, rpages, recent_max, [reason] (state)
并且在这些列标题下只有十六进制的东西,没有显示项目中的方法调用或行。
有什么想法吗?我在代码中遗漏了一些标志,以便提供更好的崩溃日志吗?
感谢。
答案 0 :(得分:2)
如果您收到内存不足警告并且无法释放足够的内存来解决问题,那么您的应用几乎肯定会崩溃。问题是,我不认为它崩溃的方式或原因的细节可能是有启发性的。那时,您正在评估继发症状。你真的需要回过头来找出为什么你首先得到了低内存警告并解决了这个问题。
正如丹尼尔所说,你可以看看Technical Note 2151,但正如它所说:
当您看到内存崩溃率较低时,您应该调查内存使用模式以及对低内存警告的响应,而不是担心代码在终止时执行的部分内容。 Memory Allocations Help列出了有关如何使用Leaks Instrument发现内存泄漏的详细步骤,以及如何使用Allocations Instrument的Mark Heap功能来避免丢弃内存。 Memory Usage Performance Guidelines讨论了响应低内存通知的正确方法以及有效使用内存的许多提示。还建议您查看WWDC 2010会话Advanced Memory Analysis with Instruments。
所以,有几点想法:
你找过泄漏了吗? Finding Leaks文章将指导您如何使用工具查找泄漏信息。
如果你打开僵尸,你有没有关掉它们?僵尸是一个很好的诊断工具,但只是消耗记忆。
您是否通过静态分析器运行代码( shift + 命令 + B 或选择“分析”上的“产品“菜单”?特别是如果使用非ARC代码,可能会发现很多内存问题。
您是否使用仪器的Allocations
工具检查了无法解释的增加的分配,而没有抵消减少。使用它,您可以运行程序,查看图形上的内存消耗,看看是否看到任何增加在某个点上没有被相应的减少偏移。如果是这样,请在图表中突出显示这些增加:
例如,在运行“分配”工具时,按住选项键,然后用鼠标单击并拖动以突出显示时间线的一部分,以标识要检查的内容。您可能希望专注于分配中的一个峰值。例如,我在我的分配中发现了一个突破并突出显示它(这是一个非常简单的例子,我在viewDidLoad
中创建了一个巨大的数组,但希望它能给你这个想法):
注意,我发现在下面板显示调用树很有用,选择“隐藏系统库”通常很有用,专注于代码(以及“反转调用树”)。如果您双击Instruments中的方法名称(在我的示例中,这里是viewDidLoad),Instruments会向您显示正在进行分配的代码:
答案 1 :(得分:1)
低内存警告会生成与标准崩溃不同的日志类型。看一下本文的“了解低内存报告”部分,了解您的应用程序发生了什么,以及如何使用工具对其进行调试:http://developer.apple.com/library/ios/#technotes/tn2151/_index.html