ios的crash异常

来源:互联网 发布:淘宝客拉人广告词 编辑:程序博客网 时间:2024/06/14 00:28

移动开发:ios程序闪退(原因可能有:数组越界、空引用、引用未定义方法、内存空间不足)
“秒退”、“崩溃”

(基本的版本上兼容问题)
秒退现象:(这种情况应该和内存关系不大),秒退在开发阶段的时候有可能在程序初始化的时候载入大量内容导致崩溃。而在使用的时候出现出现内存不足的可能性较低。

很少有程序会在初始化时载入大量内容导致崩溃,并且这类问题也很容易在开发阶段被发现,所以内存不足造成秒退的可能性低(内存不足退,通常是程序用了一段时间,切换了几个画面以后发生的)。

苹果审核阶段都没有发现,这个问题只会发生在老版系统、老版机型上:
苹果审核只是审核新的系统机型,而没有对老版本型进行审核。
1)老版本ios出现闪退,那是因为系统动态链接库或者framework无法找到,出现闪退。解决办法是等开发人员发现这个问题后升级程序(兼容)或者由用户自行升级器操作系统。
2)app的设置不正确,eg:编译的时候没有编译armv7的版本,但是设置却允许在ARMv7处理器的程序上。
3)使用app里某个功能后必退的原因是开发的时候用到的只是新版本的操作系统才支持的某个办法,没有对老系统做判断。eg:程序启动Game Center ,而没有判断用户是否支持Game Center。

(内存上面的crash)
一、如何获得crash日志
1)ios崩溃的时候会创建一份crash日志保存在设备上,记录崩溃的信息包括每个执行线程的栈调用信息(低内存闪退日志例外),连接上设备之后,可以通过获取crash日志的步骤:Xcode ——> Window ——> Organizer。
2)应用程序发布给用户已经开始使用了,开发者可以通过iTumes Connect(Manage Your Application - View Details - Crash Reports)获取用户的crash日志。(前提是:用户设备上同意上传相关信息)
3)若是没有,可以使用crash收集工具,或者自己编写一个自动化收集、解析和统计汇总。

 二、如何解析crash日志

crash日志产生的来源大概有两种:违反ios策略  、 自身的代码bug
1 ios策略

1.1、低内存闪退
1)可以通过organizer这里查看设备崩溃日志
(1)崩溃信息包括标识、硬件信息和时间信息等等。
(2)内存页分配页分配信息,以及当前占用内存最多的进程;
(3)具体的进程列表,描述着每一个进程使用内存的情况以及单签状态。

原理:
当内存检测到过低的时候,vm系统会显示内存过低的警告通知,试图回收一些不必要的内存,如果没有得到足够的改善,ios将会终止后台回收更多的内存;最后,内存还是不足,正在运行的内存将会终止。

解决方法:合理地响应系统抛出的低内存警告通知,对一些缓存的数据和可重新创建的对象进行释放,同时要避免出现内存泄露等等问题。

1.2 Watchdog超时
首先了解watchdog机制,包括生效场景和表现。如果我们的应用程序对一些特定的UI事件(eg:启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉,并生成一根响应报告。(一般的:响应的方法为代理方法,ios官方中经常这样实现)

eg:主线程进行同步网络请求,如果我们是在wifi环境下则一切顺利,若是在广大用户(不同的网络环境)中使用,难免不会有wathchdog的错误报告。

1.3 用户强制退出
1)“强制退出”并不是双击home后,关闭程序。这种情景不会产生crash日志,因为双击home键之后,所有的程序都会处于后台状态,而ios随时都有可能关闭后台进程。
2)用户同时按住电源键和home键,让iPhone重启,这种产景会产生日志(仅验证过一次),但是没有针对特定的应用程序。
3)按住电源键,直到出现“滑动关机”的界面时候,再按住Home键,这个时候当前应用程序会被终止掉,并且产生一份相应事件的crash日志。(一般这种情况是在ios应用中卡死,并且ios没有相应)

2、常见的错误的标识

2.1 Exception codes
    0x8badf00d 错误码:watchdog超时,意思是:ate bad food
    0xdeadfa11错误码:用户强制退出,意为“dead fall”。
    0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。
    0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。
    0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。
    0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。

 2.2 Exception types(错误类型)
 eg:访问一个没有权限的内存地址。
 受到异常类型信号为:SIGSEGV信号的时候,可以考虑几个方面:
 (1)访问无效的内存地址,比如:访问Zombie对象;
 (2)尝试往只读区域写数据
 (3)引用空指针
 (4)使用没初始化的指针
 (5)栈溢出

 还有常见的异常类型信号有:
 SIGABRT:受到abort信号,可能自身调用了abort()或者受到外部发送古来的信号;
 SIGBUS:总线错误,与SIGSEGV不同的是,SIGSEGV访问的是无效地址(eg:虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(eg:地址对齐问题)
 SIGILL:尝试执行非法指令,可能不被识别或者没有权限;
 SIGFPE:Floating Point Error 数学计算相关问题(可能不限于浮点计算),eg:除零操作
 SIGPIPE: 管道另一端没有进程接手数据。

 3.代码bug
 常见的异常就是代码的bug,eg:数组越界、插空、多线程安全性、访问野指针、发送未实现的selector等。
如果有Core Data,又是另外一些常见的其他问题。、


参考链接:

http://blog.csdn.net/jasonblog/article/details/19031517

0 0