在ios开发过程,当应用已经打包,iPhone设备经过ipa的包安装应用后,在使用过程发现crash,那么如何获取crash日志呢,现提供以下四种获取crash日志的方式:html
一、打开iPhone设备的设置里面的隐私中的“诊断与用量”,而后若是app崩溃了,设备会弹出提示框,用户确认以后,crash log会自动发送到苹果后台,而后用开发者帐号登录上去,能够拿到crash log。ios
二、将设备连接到mac或者windows上,同步到iTunes后再从电脑的目录下获取crash log:windows
Mac OS X:~/Library/Logs/CrashReporter/MobileDevice数组
Windows XP:C:\Documents and Settings\Application Data\Apple computer\Logs\CrashReporterxcode
Windows 7/Vista: C:\Users\计算机登陆名\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice网络
三、能够经过itools工具获取crash log,打开itools,链接iPhone设备,按照下图提示,获取crash logapp
四、经过xcode获取crash log,打开xcode,链接iPhone设备,打开window下的device,能够看到你链接的设备,能够看到以下界面,点击view device logs,能够看到全部的日志,选中日志,点击右键能够处处日志工具
2、解析crash logs测试
经网上搜索解析crash logs的三种,因为未经测试,因此没有记录下,详见能够:http://www.cocoachina.com/industry/20140514/8418.htmlui
经测试可用的方法为atos -o XXX.app.dSYM/Contents/Resources/DWARF/XXX -l address0 targetAddress
其中:
a、XXX是appname
b、address0是当前进程在内存中加载的起始地址,至于为何须要这个,那就有必要去了解下ASLR
获取地址参下图:
binary Images后面第一个即为基地址(内存中加载的起始地址)
c、targetAddress就是你想要符号化的地址 ,此处通常选取以下
3 appName 0x000f462a 0x4000 + 984618
4 appName 0x00352aee 0x4000 + 3468014
以appName开头的地址
2、常见的Crash类型
一、Watchdog timeout
Exception Code:0x8badf00d, 不太直观,能够读成“eat bad food”,意思是don‘t block main thread
紧接着下面会有一段描述:
Application Specific Information:
com.xxx.yyy failed to resume in time
对于此类Crash,咱们应该去审视本身App初始化时作的事情是否正确,是否在主线程请求了网络,或者其余耗时的事情卡住了正常初始化流程。
一般系统容许一个App从启动到能够相应用户事件的时间最多为5S,若是超过了5S,App就会被系统终止掉。在Launch,resume,suspend,quit时都会有相应的时间要求。在Highlight Thread里面咱们能够看到被终止时调用到的位置,xxxAppDelegate加上行号。
PS. 在链接Xcode调试时为了便于调试,系统会暂时禁用掉Watchdog,因此此类问题的发现须要使用正常的启动模式。
二、User force-quit
Exception Codes: 0xdeadfa11, deadfall
这个强制退出跟咱们平时所说的kill掉后台任务操做还不太同样,一般在程序bug形成系统没法响应时能够采用长按电源键,当屏幕出现关机确认画面时按下Home键便可关闭当前程序。
三、Low Memory termination
跟通常的Crash结构不太同样,一般有Free pages,Wired Pages,Purgeable pages,largest process 组成,同事会列出当前时刻系统运行全部进程的信息。
关于Memory warning能够参看我以前写的一篇文章IOS 内存警告 Memory warning level。
App在运行过程当中,系统内存紧张时一般会先发警告,同时把后台挂起的程序终止掉,最终若是仍是内存不够的话就会终止掉当前前台的进程。
当接受到内存警告的过后,咱们应该释放尽量多的内存,Crash其实也能够看作是对App的一种保护。
四、Crash due to bugs
由于程序bug致使的Crash一般千奇百怪,很难一律而论。大部分状况经过Crash日志就能够定位出问题,固然也不排除部分疑难杂症看半天都不值问题出在哪儿。这个就只能看功底了,一点点找,老是能发现蛛丝马迹。是在看不出来时还能够求助于Google大神,总有人遇到和你同样的Bug
3、常见的Exception Type & Exception Code
一、Exception Type
1)EXC_BAD_ACCESS
此类型的Excpetion是咱们最长碰到的Crash,一般用于访问了不改访问的内存致使。通常EXC_BAD_ACCESS后面的"()"还会带有补充信息。
SIGSEGV: 一般因为重复释放对象致使,这种类型在切换了ARC之后应该已经不多见到了。
SIGABRT: 收到Abort信号退出,一般Foundation库中的容器为了保护状态正常会作一些检测,例如插入nil到数组中等会遇到此类错误。
SEGV:(Segmentation Violation),表明无效内存地址,好比空指针,未初始化指针,栈溢出等;
SIGBUS:总线错误,与 SIGSEGV 不一样的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)
SIGILL:尝试执行非法的指令,可能不被识别或者没有权限
2)EXC_BAD_INSTRUCTION
此类异常一般因为线程执行非法指令致使
3)EXC_ARITHMETIC
除零错误会抛出此类异常