赞
踩
多指在移动设备(如iOS、Android设备)中或不可移动设备(如:Windows、Linux等设备),
在打开或使用应用程序时出现的突然退出中断的情况(类似于Windows的应用程序崩溃)。
多表现为:应用程序画面一闪而过,随即退回到桌面。
崩溃会影响用户体验,造成用户流失,因此,我们要重视崩溃
根据不同场景,崩溃收集方式不同
Xcode->Window->Devices and Simulators
或者
设置->隐私->分析与改进
封装好的三方,直接接入的:友盟、bugly、听云
开源的SDK:KSCrash、plcrashreporter
除了上面的划分方式,崩溃还可以按:软件异常、硬件异常划分
软件异常:
软件异常主要来自 kill(),pthread_kill()。iOS 中的 NSException 未捕获,abort 都属于这种情况。
硬件异常:
硬件的信号始于处理器 trap,是和平台相关的。野指针崩溃大部分是硬件异常。
软件异常的流程是:
软件异常 -> Unix信号
硬件异常的流程是:
硬件异常 -> Mach异常 -> Unix信号
Mach 异常:
UNIX 信号:
当我们拦截信号处理之后是可以让程序不崩溃而继续运行的,但是不建议这样做,因为程序已经处于异常不可知状态。
看上图里面最终都会转换为 “UNIX信号”, 是不是代表我们只用监听 “UNIX 信号” 就够了呢?为什么还要拦截 Mach 异常呢?
不是所有的 "Mach异常” 类型都映射到了 “UNIX信号”
“UNIX信号” 在崩溃线程回调,如果遇到 Stackoverflow 问题,已经没有条件(栈空间)再执行回调代码了。
捕获到异常信号后,在处理方法 handleSignalException 里通过 backtrace_symbols 方法就能获取到当前的堆栈信息。
堆栈信息可以先保存在本地,下次启动时再上传到崩溃监控服务器就可以了。
Mach是一个XNU的微内核核心
基本信息:崩溃发生的日期、iOS 版本等
进程信息:崩溃进程的相关信息,比如崩溃报告唯一标识符、唯一键值、设备标识
异常信息:异常类型、异常编码、异常的线程;
线程回溯:崩溃时的方法调用栈
崩溃日志调用栈内容:
这样直接看崩溃信息的调用栈,是看不懂的
我们需要一个.DSYM文件,dSYM 是保存 函数地址映射信息的中转文件,其中包含文件名、方法名、行号等信息
一个ipa包,对应一个.DSYM文件
通过.DSYM文件的解析,就可以找到对应的文件名和函数名
当一个对象找不到对应的方法实现的时候,会报此类错误
在找不到方法时,查找方法将会进入方法forward流程,系统给了三次补救的机会,
所以我们要解决这个问题,在这三次均可以解决这个问题
KVO监听对象属性值的改变
KVO 日常使用造成崩溃的原因通常有以下几个:
当一个对象添加了notification之后,如果dealloc的时候,仍然持有notification,就会出现NSNotification类型的crash。
在iOS9以及iOS9以后,可以不做移除通知操作
一般是在定时器被target强引用没有被释放,产生内存泄露,或者在定时器触发的时候导致崩溃
解决方案:
1.NSTimer使用Block,对其target不强引用
2.是否找到一个合适的时机,在确定NSTimer已经失效的情况下,让NSTimer自动invalidate
3.使用中间变量
建议:
UI刷新,必须在主线程操作
在子线程中,需要刷新UI的时候,要切换到主线程
定义:当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称野指针
若操作系统将这部分已经释放的内存重新分配给另外一个进程,而原来的程序重新引用现在的迷途指针,则将产生无法预料的后果。因为此时迷途指针所指向的内存现在包含的已经完全是不同的数据。
Xcode开启僵尸对象监听
使用MLeaksFinder或其他三方库,排查内存泄露问题
使用JJException
,减少App闪退
当然,最好做到:开发过程不使用,正式包开启
参考资料:
iOS 野指针处理
iOS野指针定位总结
Chat-GPT有关野指针的解释
iOS 开发中的野指针错误通常是指向一个已经被释放的对象的指针仍然被访问时发生的错误。这种错误可能导致应用崩溃或不稳定的行为。野指针错误的主要原因包括但不限于:
Zombies
工具尤其有用,它可以帮助追踪已释放对象的访问尝试。通过采取这些措施,你可以显著减少应用中野指针错误的发生,提高应用的稳定性和可靠性。
不得不说,回答的还蛮好的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。