一、JavaCrash的监控
1.JavaCrash的异常大致流程
代码演示使用
原理文字描述:JVM会调用Thread的dispatchUncaughtException的方法,把异常事件分发出去,线程里面有两个获取线程异常的方法:setUncaughtExceptionHandler(只处理当前线程的异常)和 setDefaultUncaughtExceptionHandler(处理所有线程的异常)两个方法,之所以线程崩溃是因为在Thread.UncaughtExceptionHandler重写它的uncaughtException的方法,调用了Process.killProcess方法和System.exit方法
二、C++ crash上报机制
1、demo目录预览
2、c++ crash的exception type异常类型的信息:
EXC_BAD_ACCESS:
此类型是最常见的crash, 通常用于访问了不该访问的内存导致的,一般EXC_BAD_ACCESS后面的()还会带有补充信息,野指针错误形式在Xcode中通常表现为:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误。因为你访问了一块已经不属于你的内存。
SIGSEGV: 通常由于重复释放对象导致, 一般在ARC以后很少见到
SIGABRT: 收到Abort信号退出, 通常Foundtion库中的容器为了保护状态正常会做一些检测, 例如插入nil到数据中等会遇到此类错误.
SEGV(Segmentation Violation):代表无效内存地址, 比如空指针, 未初始化指针, 栈溢出等.
SIGBUS: 总栈错误, 与SIGSEGV不同的是, SIGSEGV访问的是无效的地址, 而SIGBUS访问的是有效的地址, 但是总栈访问异常(如地址对齐问题)
SIGILL: 尝试执行非法的指令, 可能不被识别或者没有权限
SIGFPE: 数学计算相关问题, 比如除零操作
SIGIPIPE: 管道另一端没有进程接手数据
EXC_BAD_INSTRUCTION:此类异常通常由于线程执行非法指令导致
EXC_ARITHMETIC: 除零错误会抛出此类异常
3、signal报错查询表
signal 11 : 空指针异常
signal 6 : 资源初始化异常(配置文件、对象)
4、c++与java通道建立
5、C++ crash 初始化捕获信号类型
6、C++ crash核心调用位置
7、整体流程概述
开子线程去收集crash的堆栈,通过设置不同的监听信号类型,开辟存储crash的堆栈信息,通过监听crash.action事件,将错误信息放在crash_stack里面。
8、为什么上报信息堆栈后面可以会有准确代码的位置?
自行思考
-----------------------------------------------------------------------------------------------------------------------------
下面东西可以不做学习重点
2.出现crash异常应该怎么处理
3.把混淆的代码需要还原
客户端使用的方法------->GUI工具
服务端同学使用的方法 ------>retrace命令
二、NativeCrash监控处理方式
现在采用的是:Google-breakpad做为主流
采用add2Line工具把.so文件+偏移地址可以准确判定代码出错的位置
native crash监听: 创建singalHandler方法,通过singal_stack去存储singal_action去拿到崩溃堆栈