Android常见Crash原因
来源:互联网 发布:知乎法国女人极简生活 编辑:程序博客网 时间:2024/05/16 01:10
1.Java Crash
java代码导致jvm退出,弹出“程序已经崩溃”的对话框,最终用户点击关闭后进程退出。Logcat会在“AndroidRuntime”tag下输出Java的调用栈。
2.Native Crash
No.&Name
Reason
Resolution
Comment
1.空指针
试图对空指针进行操作时(如读取空指针指向的内存),处理器就会产生一个异常
在使用指针前加以判断,如果为空,则是不可访问的。
空指针目前是糯米app最多的一种引起crash的原因,但是它也很容易被发现和修复。
2.野指针
指向的是一个无效的地址,该地址如果是不可读不可写的,那么会马上Crash;如果访问的地址为可写,而且通过野指针修改了该处的内存,那么很有可能会等一段时间(其它的代码使用了该处的内存后)才发生Crash。
- 在指针变量定义时,一定要初始化,特别是在结构体或类中的成员指针变量。
- 在释放了指针指向的内存后,如该指针不再用应置为NULL
- 看代码很难查找,通过代码分析工具也很难找出,只有通过专业的内存检测工具,才能发现这类bug。
。
数组越界
访问无效的地址。如果该地址不可读写,则会马上Crash;如果修改了该处的内存,造成内存破坏,那么有可能会等一段时间才在别处发生Crash。
- 所有数组遍历的循环,都要加上越界判断。
- 用下标访问数组时,要判断是否越界。
- 通过代码分析工具可以发现绝大部分的数组越界问题。
破坏内存的bug,很难查找。
整数除以零
整数除以零默认的处理方式是终止进程
在做整数除法时,要判断被除数是否为0的情况。
改情况在开发环境下很难出现,但庞大的用户量和复杂的用户输入,就很容易导致被除数为0的情况出现。
格式化输出参数错误
与野指针类似,但是只会读取无效地址的内存,而不会造成内存破坏。其结果是要么打印出错乱的数据,要么访问了无读写权限的内存而立即宕机。
在书写输出格式和参数时,要做到参数个数和类型都要与输出格式一致
缓冲区溢出
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏函数调用的堆栈,修改函数调用的返回地址。如果不是黑客故意攻击,那么最终函数调用很可能会跳转到无法读写的内存区域,造成程序崩溃。
- 检查所有容易产生漏洞的库调用,比如sprintf,strcpy等,它们都没有检查输入参数的长度。
- 使用带有长度检查的库调用,如用snprintf来代替sprintf,或者自己在sprintf上封装一个带长度检查的函数。
内存管理错误
- 可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。
- 内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃。
imageview,图片占据太多内存,糯米app狂刷列表。
- Android常见Crash原因
- Android常见Crash原因总结(二)
- Android常见CRASH
- Qt项目crash常见原因以及解决办法
- Android的crash的类型及原因
- Android NDK日志符号化 查找crash原因
- Android Native Crash崩溃及错误原因
- 导致crash等异常的常见原因分析
- android 常见出错原因
- Android常见Crash类型分析(一)
- android NullpointException 常见的原因
- android crash之段错误原因及分析方法
- 使用 ndk-stack 寻找Android程序Crash的原因
- android crash 四 ANR原因分析及解决方法
- Crash原因捕捉利器
- c++crash的原因
- 常见Crash问题整理
- iOS常见Crash解决方法
- FAFU OJ 素数之和
- 弱网测试
- AndroidStudio 配置adb shell
- H5页面测试总结
- 【annotation】@Param
- Android常见Crash原因
- 需求变更申请表
- 关于在linux上搭建Tomcat的一次经历
- 需求变更管理表
- string char[] 转化
- 接口自动化测试之http请求实践
- 服务端压力测试工具选型的一些经验
- 通过注册表查询无线网络名称及mac地址
- 指向几个元素组成的一位数组指针的指针变量