Android程序异常分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/johnWcheung/article/details/87340674

关于ANR

anr类型

  • 主线程对输入事件在5秒内没有处理完毕

    Window、 InputDispatcher、 InputChannel,会显示提示

  • 主线程在执行BroadcastReceiver的onReceive函数时10秒内没有执行完毕

    BroadcastReceiver(简称BR)的onReceive函数运行在主线程中,当这个函数超过10秒钟没有返回就会触发ANR,只有log输出

  • 主线程在执行Service的各个生命周期函数时20秒内没有执行完毕

    Service的各个生命周期函数也运行在主线程中,当这些函数超过20秒钟没有返回就会触发ANR,只有log输出

处理方法

定位到 logcat.log 文件中 “not responding” 发生时间点,去查看发生 ANR 时间点对应的 trace 文件,该文件路径为/data/anr/traces.txt

如何避免

  • 合理使用 UI 主线程,耗时操作放入其他线程工作;

  • 合理使用 Handler 来处理其他线程请求;

  • 合理使用并遵循 Android 生命周期, 避免在 onCreate() 和 onResume() 做过多的事情;

  • 使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;

  • 经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;

  • 避免加载大图片引起内存不足导致 ANR;

  • 避免内存泄露引起的 ANR。

程序异常

Java层代码

异常类型
  • System.err

  • AndroidRuntime

分析定位方法
  • log、logcat|grep过滤tag

  • 搜索应用进程ID

  • Debugger断点调试

Native crash

异常类型
  • 初始化错误

  • 访问错误

  • 数组索引访问越界

  • 指针对象访问越界

  • 访问空指针对象

  • 访问无效指针对象

  • 迭代器访问越界

  • 内存泄露

  • 参数错误

  • 堆栈溢出

  • 类型转换错误

  • 数字除0错误

分析方法
  • 符号化错误信息

ndk-stack---adb shell logcat | ndk-stack -sym $PROJECT_PATH/obj/local/armeabi

  • logcat -s DEBUG

    • 进程信息:pid表示进程号,tid表示线程号,name表示进程名

    • 错误信号:signal 11表示信号的数字,SIGSEGV表示信号的名字,code 1(SEGV_MAPERR)表示出错代码,fault addr 00000000 表示出错的地址

    • 寄存器快照:进程收到错误信号时保存下来的寄存器快照,一共有15个寄存器

    • 堆栈信息:##00表示栈顶,##01调用#00,以此往下都是嵌套的调用关系,直至到栈顶

猜你喜欢

转载自blog.csdn.net/johnWcheung/article/details/87340674