赞
踩
影响app体验的通用类问题可以分为两大类:超时和崩溃。
没有在用户的预期内及时的响应用户的请求和交互。
分为:较轻的影响是UI的卡顿掉帧;
比较大的影响是ANR(Application Not Responding):能恢复的ANR;不能恢复的ANR-永久性卡死问题。
超时的原因:
在某些场景下,满足的条件未满足或者需要的资源没有拿到,出现的未预期的运行时异常。
类型 | 破坏性 | 解决难度 |
---|---|---|
ANR | 低 | 中 |
Java Crash | 低 | 低 |
Native Crash | 低 | 低 |
可分为三大类:check异常,runtime异常,错误;
这里的crash都会抓到完整的调用栈信息,且大部分和业务侧的逻辑使用相关
常见原因:
主动类:运行时框架代码或业务代码发现的状态异常,代码运行过程中主动触发;这类异常在预期范围内,通过此类方法暴露问题。例如:资源不足,内存超过阈值等。
被动类:在运行时执行一些指令或者访问某些内存地址被动触发的;不在预期范围内;比如:野指针,多线程操作文件没有同步保护等等。
Native崩溃使用信号(singal)机制返回信息:
Android native崩溃产生常见信号大致有以下几类:
SIG是信号名的通用前缀。ABRT是abort program的缩写;由调用abort函数产生,进程非正常退出。当用户态的 Native 代码在运行过程中发现了某些状态异常,就会给自己(线程)发送信号触发自杀流程。
常见问题有:
异常流程:当系统因内存不足无法分配buffer,代码就选择了调用宏函数,自杀了
虚拟内存泄漏:32位APP的地址空间只有4GB,因此程序运行过程中内存用的多了容易引起OOM。64位APP地址空间几乎无限大,基本不存在OOM的问题;
通过获取崩溃时的虚拟内存大小,就知道是否有内存泄漏;
内存泄漏关键字
另外,因为是SIGABRT类型,虚拟内存泄漏也有常见的Abort Message关键字:
虚拟机异常
协处理器的栈异常。这类异常是dvm虚拟机特有的。dvm虚拟机在GC或者打印trace文件时会suspend所有线程,如果有suspend失败的线程,就会给这个线程发送SIGSTKFLT信号。
SIGTRAP是通过汇编指令bkpt触发CPU的预取指异常,并在内核态的预取指异常处理函数中,给当前线程发送SIGTRAP信号。
汇编指令bkpt(break point的缩写),用于产生软件断点中断,以便软件调试时使用。
非法内存操作,与下面的SIGBUS不同,是对合法地址的非法访问,比如访问没有读权限的内存,向没有写权限的地址写数据等。
SIGSEGV类错误出现在CPU的虚拟地址转换物理地址的过程,分两种不同情况。
SEGV_MAPERR:
非法地址,包括内存地址对齐出错,比如访问一个4字节的整数, 但其地址不是4的倍数。细分为:
当前执行的指令是CPU无法识别的非法指令时,会触发SIGILL信号。根据异常指令的来源分三种情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。