转 理解与分析ios应用的崩溃报告
理解与分析ios应用的崩溃报告
源网址:
http://developer.apple.com/library/ios/#technotes/tn2151/_index.html
当一个应用程序崩溃时,创建一份“崩溃报告”对于理解崩溃是如何引起的非常有用。本文档包含有关如何识别,了解并解释崩溃报告的基本信息。
简介
当一个应用程序在一台iOS 设备上崩溃时,一份“崩溃报告”将在该设备上次创建并存储起来。崩溃报告描述应用程序是在何种条件下崩溃的,大部分情况下包含一份当前正在运行线程的完整的堆栈跟踪,通常这在调试问题时非常有用。如果你是一位iOS 开发者,你应该查看这些崩溃报告,了解导致你的应用程序崩溃的原因,然后修复它。
内存不足报告与其他的崩溃报告的不同之处在于这种类型的报告没有堆栈跟踪。当一个内存崩溃发生时,你必须研究一下你的内存使用方式以及你对于内存警告的处理方式。你可能会发现本文档为你指出几种内存管理方式是非常有用的。
包含堆栈跟踪的崩溃报告需要先进行符号化(symbolicated)才可以进行分析。符号化的过程是将内存地址替换为便于人们阅读的函数名称和行号。滑假如你通过Xcode的Organizer窗口获取崩溃日志,那么该报告将在几秒钟后自动进行符号化。否则你需要将.crash文件导入到Xcode的Organizer进行符号化。你可以通过符号化来了解更多细节。
了解内存不足报告
当监测到内存不足时,iOS的虚拟内存系统依靠应用程序间的合作来释放内存。内存不足的通知被发送到所有正在运行的应用程序,并作为内存释放的请求来进行处理,以期望降低所使用的内存总量。如果内存的压力始终存在,那么系统可能会终止一些后台进程来降低内存压力。如果可以释放足够多的内存,那么你的应用程序将继续运行而不会产生崩溃报告。如果不可以,那么你的程序将被iOS终止,因为此时已没有足够的内存来满足应用程序的需求,一份内存不足的报告将被产生并存储在设备中。
内存不足报告与其他崩溃报告的不同之处在于它里面没有应用程序的堆栈跟踪。每个进程的内存使用量依据内存页面的数量进行报告,每个内存页面量的大小为4KB。你将会看到“抛弃(jettisoned)”紧跟在iOS为了释放内存而终止的进程名称后。如果你看到它紧跟在你的应用程序名称后面,那么可以确定这个应用因为使用了太多的内存而被终止。否则,应该不是内存压力引起的崩溃。你可以通过查看.crash文件(下一节中进行描述)获取更多信息。
当你看到一个内存不足报告时,你更应该研究一下你使用内存的方式和你对内存不足警告的处理方式,而不是去关心在程序终止时你的哪一部分代码被执行了。内存分配帮助(Memory Allocations Help)列举了如何使用泄露工具(Leaks Instrument)来发现内存泄露,以及如何使用分配工具(Allocations Instrument's)的标记堆功能来避免被抛弃的内存。内存使用性能指导方案(Memory Usage Performance Guidelines)讨论了像其他内存使用秘诀一样的适当的方案来响应内存不足通知。同时也建议你看一下WWSC2010中的关于使用工具进行高效内存分析的视频(Advanced Memory Analysis with Instruments)。
注意
泄露和分配工具不能跟踪显存。你需要使用VM Tracker工具(包含在分配工具模板中)来运行你的应用以便观察显存的使用情况。VM Tracker默认是禁用的。为了在你的应用程序使用VM Tracker,请点击工具,选中“自动快照Automatic Snapshotting”标志或者手工按下“获取快照(Snapshot Now)”按钮。
分析崩溃报告
和内存不足报告不同,大部分的崩溃报告都包含每一个线程在程序终止时的堆栈跟踪。本节将讨论这类报告。
符号化
在崩溃报告中最令人感兴趣的部分是在你的应用程序执行终止时的堆栈跟踪。这个跟踪和你在调试器中停止执行时的类似,但遗憾的是这里没有提供被认为是符号的方法或函数的名称。取而代之的是16位的内存地址和它所指向的你的应用程序或系统框架的可执行代码。你需要将这些地址映射到符号中。崩溃日志在输出时并不包含土豪信息,你需要在你分析日志前进行符号化处理。
符号化——将堆栈跟踪地址转化为源代码方法名称及行号——需要上次到苹果应用商店的应用程序的二进制文件以及构建二进制文件时产生的.dSYM文件。这些必须是精确匹配的,否则你的报告将不能完整地符号化。基本要求你保持每个分发给用户(忽略那些分发的细节)的构建和它的.dSYM是一致的。
注意:
你必须保存应用程序的二进制文件和.dSYM文件以便于完整地符号化崩溃日志。你应该打包每一个你所提交到iTunes Connect中的构建。.dSYM文件和应用程序的二进制文件应该绑定到一起,不管是基础版本的构建还是后续版本的构建。即便是相同的源代码,不同构建的文件也不会弄混。假如你使用“构建并打包”命令,那么它们将会被自动放置到一个合适的位置。虽然任何位置都可以用Spotlight搜索到。
Xcode的“打包(Archive)”命令使保持二进制文件和.dSYM匹配变得很简单,当你使用打包命令(通过点击产品(“Product”)-)打包(Archive)或是按下Shift+Command+B),Xode将会把应用程序的二进制文件及包含符号信息的.dSYM文件收集到一起,并存储到你的主目录文件夹下的一个合适位置。你可以在Xcode中的Organizer下的“已打包(Archived)”中知道你所打包的所有应用程序。Xcode在符号化崩溃日志时会自动寻找打包的应用程序,在确认你要的发布应用程序和.dSYM文件匹配的情况下,你可以将它们打包,直接提交到ITunes Connect。
如果Xcode拥有产生崩溃日志的应用程序的二进制代码和.dSYM文件,那么它将自动进行符号化。Xcode Organizer符号化所需要提供的是崩溃日志及相应的二进制文件和.dSYM文件。打开Xcode Organizer,选择“设备(Devices)”选选看,选择边栏顶部“文库(LIBRARY)”下的“设备日志(Device Logs)”,点击导入按钮,选择需要符号化的.crash文件,当这些步骤完成后,Xcode将自动符号化崩溃日志并显示结果。
异常代码
在崩溃日志的16行中,你可以看到以一个或多个16进制值开头一行,这些数字代表的是处理器的特殊代码,可以为你提供更多的崩溃的本质信息。你可以通过这些代码辨别应用程序的崩溃是由于程序错误(例如,错误的内存访问,发生异常,等等)还是其他的一些原因,例如:
1)异常代码0x8badf00d表明应用程序已被iOS终止,原因是watchdog超时引起的。该应用程序花了太长的时间加载,终止或响应系统时间。一个常见的原因是在主线程中进行网络同步(synchronous networking on the main thread.)。
2)异常代码0xbad22222表明一个VoIp应用程序因其频繁重启而被iOS终止,。
3)异常代码0xdead10cc表明一个应用程序被iOS终止,因其在后台运行时锁定了系统资源(如联系人数据库)。
4)异常代码0xdeadfa11表明一个应用程序被用户强制退出。当用户第一次按下开关键直到“移动滑锁关机”屏幕出现,然后按下Home键。用户之所以这么做的合理假设是应用程序变得翻译迟钝,但不是肯定的,任何应用程序都可以强制退出。
提示:
从多任务窗口中终止一个暂停的应用程序不会产生崩溃日志。一旦一个应用被暂停,它有资格被iOS在任何时间终止,因此不会产生崩溃日志。
<!--EndFragment-->
转 理解与分析ios应用的崩溃报告的更多相关文章
- 【译】理解与分析ios应用的崩溃报告
源网址: http://developer.apple.com/library/ios/#technotes/tn2151/_index.html 当一个应用程序崩溃时,创建一份“崩溃报告”对于理解崩 ...
- iOS:crash崩溃日志分析
一.前言: 作为一个合格的iOS开发者,除了具有规范强悍的编码能力外,还应该具有过硬的查错纠错能力.在项目运行时,程序崩溃是不可避免的,遇到这个问题,有时会出现一大堆的crash日志,艹,貌似看不懂呀 ...
- iOS应用崩溃日志分析 iOS应用崩溃日志揭秘
转自:http://www.raywenderlich.com/zh-hans/30818/ios%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E6%97%A5%E5%BF ...
- iOS开发-应用崩溃日志揭秘(一)
作为一名应用开发者,你是否有过如下经历? 为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! 如果 ...
- iOS测试常见崩溃
什么是崩溃日志,从哪里能得它? iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上.崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的.通常,上面有每个正在执行线程的 ...
- Reveal分析IOS界面,plist文件读取
Reveal分析IOS界面,需要得到app的 softwareVersionBundleId上传到iphone中 , 而IOS8的iTunesMetadata.plist (设备路径/var/mobi ...
- iOS系统app崩溃日志手动符号化
iOS系统app崩溃日志手动符号化步骤: 1.在桌面建立一个crash文件夹,将symbolicatecrash工具..crash文件..dSYM文件放到该文件夹中 a.如何查询symbolicate ...
- 经典好文:android和iOS平台的崩溃捕获和收集
通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人员发现和修改bug,对于提高软件质量有着极大的帮助.本文介绍了iOS和android平台下崩溃捕获和收集的原理及步骤,不过如果是个人开 ...
- Reveal:分析iOS UI该武器
Reveal是分析iOS应用UI的利器: Reveal可以在执行时调试和改动iOS应用程序.它能连接到应用程序,并同意开发人员编辑各种用户界面參数.这反过来会马上反应在程序的UI上.就像用FireBu ...
随机推荐
- [Luogu1462]通往奥格瑞玛的道路
题目大意: 一个n个点,m条边的图,每个边有一个边权,每个点也有一个点权. 现在要找一条从1到n的路径,保证边权和不超过b的情况下,最大点权尽量小. 问最大点权最小能是多少? 思路: 二分答案,然后D ...
- Microsoft SQL Server 2012 Internals
http://blog.csdn.net/column/details/learnsqlserver2012.html
- jQuery.extend重载合并
使用: var people1 = { apple: 0, banana: { weight: 52, price: 100 }, age: 97 }; var people2 = { banana: ...
- 高手从零开始的全定制发行版-Linux from Scratch
在制作Linux发行版中Linux from Scratch可谓是真正的大师级.Linux from Scratch是在线的社区创建的一本电子书,目的是帮助那些根深蒂固的想方设法提高计算机性能的人(t ...
- luci范例
转自:http://www.cnblogs.com/souroot/p/4511760.html LuCI (Lua Configiration Interface) 是OpenWRT 的Web 管理 ...
- 工作中常用Lixu命令学习笔记
对于Linux,我是菜鸟,也是在工作中了才开始慢慢接触,用Linux的人都我都会觉得屌屌的,现在把工作中常用的一些Linux命令记录一下,供以后学习和参考. cd 这可能是我觉得Linux最简单的一个 ...
- opencv Mat 像素操作
1 cv::Mat cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中. class CV_EXPORTS Mat { public: //a lo ...
- [转]SSIS: Execute Package via Stored Procedure
本文转自:http://sqlblog.de/blog/2009/09/ssis-execute-package-via-stored-procedure/ There are two options ...
- github之无命令可视化界面操作——GitHub DeskTop
Git是Linuxs之父Lunus用C语言写的一个非常好用的分布式版本控制系统. GitHub可以给我们提供免费的代码仓库,并用Git可以在上面提交代码并进行版本控制.使用Git一般要安装Git ,并 ...
- delphi 自定义内存管理
1.主要通过GetMemoryManager来hook原来的内存管理. 2.通过SetMemoryManager来设置你自己的新的内存管理,可以用一个内存池来优化和管理程序的内存调用情况. proce ...