赞
踩
原文地址:https://juejin.cn/post/6844903972587716621#heading-56
出现未捕获异常,导致出现异常退出,进程唯一
Thread.setDefaultUncaughtExceptionHandler();
获取主线程的堆栈信息:
Looper.getMainLooper().getThread().getStackTrace();
复制代码
获取当前线程的堆栈信息:
Thread.currentThread().getStackTrace();
复制代码
获取全部线程的堆栈信息:
Thread.getAllStackTraces();
复制代码
第三方Crash监控工具如 Fabric、腾讯Bugly,都是以字符串拼接的方式将数组StackTraceElement[]转换成字符串形式,进行保存、上报或者展示。
优点:简单,兼容性好。
缺点:1.成功率不高,依靠系统接口在极端情况也会失败。2.7.0之后这个接口是没有主线程堆栈。3.使用Java层的接口需要暂停线程。
通过hook ThreadList和Thread 的函数,获得跟ANR一样的堆栈。为了稳定性,需要在fork的子进程中执行。
优点:信息很全,基本跟ANR的日志一样,有native线程状态,锁信息等等。
缺点:黑科技的兼容性问题,失败时我们可以使用Thread.getAllStackTraces()兜底。
由于Crash进程中拥有一个Binder服务端ApplicationThread,而应用进程在创建过程调用attachApplicationLocked(),从而attach到system_server进程,在system_server进程内有一个ApplicationThreadProxy,这是相对应的Binder客户端。当Binder服务端ApplicationThread所在进程(即Crash进程)挂掉后,则Binder客户端能收到相应的死亡通知,从而进入binderDied流程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。