当iOS设备上的App应用闪退时。操作系统会生成一个crash日志。保存在设备上。crash日志上有非常多实用的信息,比方每个正在运行线程的完整堆栈跟踪信息和内存映像,这样就能够通过解析这些信息进而定位crash发生时的代码逻辑,从而找到App闪退的原因。
违反iOS系统规则产生crash的三种类型
(1) 内存报警闪退
当iOS检测到内存过低时,它的VM系统会发出低内存警告通知,尝试回收一些内存;假设情况没有得到足够的改善,iOS会终止后台应用以回收很多其它内存;最后。假设内存还是不足,那么正在运行的应用可能会被终止掉。在Debug模式下,能够主动将client运行的动作逻辑写入一个log文件里,这样程序童鞋能够将内存预警的逻辑写入该log文件,当发生例如以下截图中的内存报警时,就是提醒当前client性能内存吃紧,能够通过Instruments工具中的Allocations 和 Leaks模块库来发现内存分配问题和内存泄漏问题。
(2) 响应超时
当应用程序对一些特定的事件(比方启动、挂起、恢复、结束)响应不及时。苹果的Watchdog机制会把应用程序干掉。并生成一份相应的crash日志。
这些事件与下列UIApplicationDelegate方法相相应。当遇到Watchdog日志时,能够检查上图中的几个方法是否有比较重的堵塞UI的动作。
application:didFinishLaunchingWithOptions:
applicationWillResignActive:
applicationDidEnterBackground:
applicationWillEnterForeground:
applicationDidBecomeActive:
applicationWillTerminate:
(3) 用户强制退出
一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。
只是这样的场景通常是不会产生crash日志的。由于双击Home键后,全部的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,当应用堵塞界面并停止响应时这样的场景才会产生crash日志。这里指的“用户强制退出”场景。是略微比较复杂点的操作:先按住电源键,直到出现“滑动关机”的界面时。再按住Home键,这时候当前应用程序会被终止掉,而且产生一份相应事件的crash日志。
应用逻辑的Bug
大多数闪退崩溃日志的产生都是由于应用中的Bug,这样的Bug的错误种类有非常多,比方
SEGV:(Segmentation Violation,段违例),无效内存地址,比方空指针。未初始化指针,栈溢出等;
SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;
SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比方虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比方地址对齐问题)。
SIGILL:尝试运行非法的指令,可能不被识别或者没有权限;
SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比方除零操作;
SIGPIPE:管道还有一端没有进程接手数据。
常见的崩溃原因基本都是代码逻辑问题或资源问题,比方数组越界。访问野指针或者资源不存在。或资源大写和小写错误等。
crash的收集
假设是在windows上你能够通过itools或pp助手等辅助工具查看系统产生的历史crash日志,然后再依据app来查看。假设是在Mac 系统上。仅仅须要打开xcode->windows->devices。选择device logs进行查看,例如以下图,这些crash文件都能够导出来,然后再单独对这个crash文件做处理分析。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76692-1.html